Скачав NoImport_engine от TITAN14@RAMBLER.RU решил попробовать его в деле... Скомпилил хеллоу ворлд, тот что в комплекте. Запустил, вылетело окошко с надписью "Hello!" Решил для лучшего понимания прогнать под отладчиком... 004010C0 поставил бряк тут, запустил, брякнулся, иду дальше по F8 Каково же было мое удивление когда вместо "Hello!" я увидел "Mello!". Сначала подумал что перепил, но запустив еще раз получил тоже самое. Что это, баг или фича?
Ragnar Это не баг и не фича. И никакого отношения к NoImport_engine (не знаю, что это ) не имеет. Учитывая, что трассировали Вы по F8, трассировка CALL'ов выполнялась установкой брэйкпоинтов int3 = CCh = кириллическое "М". Что означает, что по адресу 004010C9h поверх символа "H" будет записан символ "М" после нажатия F8 на инструкции CALL hello.004010D4. Т.к. управление так и не попадёт на адрес 004010C9h, брэйкпоинт не отработает, и снят не будет. Соответственно вместо строки "Hello!", расположенной по адресу 004010C9h, так и останется строка "Mello!".
М - русская. ее код 0xCC - опкод команды int3 - прерывание вызова отладчика т.е. отладчик предполагая адресом возврата из процедуры следующую за call команду (байт) по нажатию F8 заменил (временно) ее на 0xCC (int3 - вызов самого себя). но компилятор поступает не по правилам, разместив строку сразу за вызовом подпрограммы и отладчик ошибся, а Вы увидели в данных этот символ (код команды) Код (Text): push 0 push esp call hello... db 'Hello', 0 real_return: из процедуры либо нет возврата либо он происходит на метку real_return т.к. подпрограмма корректирует последний в стеке перед выходом или по мере исполнения