NoImport_engine - баг(?)

Тема в разделе "WASM.BEGINNERS", создана пользователем Ragnar, 18 фев 2009.

  1. Ragnar

    Ragnar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2009
    Сообщения:
    13
    Скачав NoImport_engine от TITAN14@RAMBLER.RU
    решил попробовать его в деле...
    Скомпилил хеллоу ворлд, тот что в комплекте.
    Запустил, вылетело окошко с надписью "Hello!"
    Решил для лучшего понимания прогнать под отладчиком...
    004010C0 поставил бряк тут, запустил, брякнулся, иду дальше по F8
    Каково же было мое удивление когда вместо "Hello!" я увидел
    "Mello!". Сначала подумал что перепил, но запустив еще раз
    получил тоже самое. Что это, баг или фича?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ragnar
    Это не баг и не фича. И никакого отношения к NoImport_engine (не знаю, что это :)) не имеет. Учитывая, что трассировали Вы по F8, трассировка CALL'ов выполнялась установкой брэйкпоинтов int3 = CCh = кириллическое "М". Что означает, что по адресу 004010C9h поверх символа "H" будет записан символ "М" после нажатия F8 на инструкции CALL hello.004010D4. Т.к. управление так и не попадёт на адрес 004010C9h, брэйкпоинт не отработает, и снят не будет. Соответственно вместо строки "Hello!", расположенной по адресу 004010C9h, так и останется строка "Mello!".
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    М - русская. ее код 0xCC - опкод команды int3 - прерывание вызова отладчика
    т.е. отладчик предполагая адресом возврата из процедуры следующую за call команду (байт) по нажатию F8 заменил (временно) ее на 0xCC (int3 - вызов самого себя). но компилятор поступает не по правилам, разместив строку сразу за вызовом подпрограммы и отладчик ошибся, а Вы увидели в данных этот символ (код команды)
    Код (Text):
    1. push 0
    2. push esp
    3. call hello...
    4. db 'Hello', 0
    5. real_return:
    из процедуры либо нет возврата либо он происходит на метку real_return т.к. подпрограмма корректирует последний в стеке перед выходом или по мере исполнения