Конференция "Прочее" » Фокус на АСМе в Дельфи
 
  • Bob (27.08.08 09:31) [0]
    Здравствуйте все. Вот нашел в нете интересный фокус:
    вставка в Дельфи
    procedure Focus;
     asm  
           mov ax,$04EB
      @as: jmp @as-2    ; <= переход на EB04 (а это уже переход на ret)
     end;
    Вроде все ясно, но программа зацикливается на команде jmp @as-2.
    Подскажите, пожалуйста, в чем дело.(W2k,WXP, D7)
    Окошко CPU выглядит так :
    004520E8   66B8EB04      mov  ax,$04eb
    004520EC   EBFE            jmp  -$02
    004520EE   C3               ret
    Заранее благодарю.
  • Сергей М. © (27.08.08 09:41) [1]

    > программа зацикливается на команде jmp @as-2


    И правильно зацикливается.
    А почему бы ей не зацикливаться ?

    004520EE - 2 = 004520EC
  • Rouse_ © (27.08.08 09:46) [2]

    > программа зацикливается на команде jmp @as-2.

    BASM не кушает инструкции такого плана как jmp @as-2
    можешь поэксперементировать @as-4/@as-6/@as-8
    перепеши вот так:
    procedure Focus;
    asm  
          mov ax,$04EB
     @as: db $eb, $fb
    end;

  • Bob (27.08.08 09:51) [3]
    >004520EE - 2
    Разве отсчет идет от адреса следующей команды а не от своего ?
    А куда тогда попадем по команде EB04 ?
  • Сергей М. © (27.08.08 09:51) [4]

    > Rouse_ ©   (27.08.08 09:46) [2]


    Эт почему же ?
    Кушает и не давится)
  • Сергей М. © (27.08.08 09:52) [5]

    > Разве отсчет идет от адреса следующей команды а не от своего
    > ?


    Угу.
    Причем еще со времен царя Гороха.


    > куда тогда попадем по команде EB04 ?


    А где она у тебя ?
  • Rouse_ © (27.08.08 09:53) [6]

    > Эт почему же ?
    > Кушает и не давится)

    У меня адрес джампа остается не изменный, т.е. прыжок всегда на адрес метки поправка не учитывается от адреса.
    А автор же хочет взять оффсет в 2 байта с метки чтобы попасть на $04EB что будет означать jmp $4 и перепрыгнуть на ret. Впрочем кому я рассказываю - ты и лучше меня знаешь :)
  • Bob (27.08.08 09:54) [7]
    >Rouse_ ©  [2]
    А так заработало !
    Спасибо!
  • Сергей М. © (27.08.08 09:56) [8]
    А, ты вон о чем..
    Я подумал, что "не кушает" = "не компилируется"
  • Bob (27.08.08 10:02) [9]
    >Сергей М. ©   [5]
    А я на АСМе не работал уже "со времен царя Гороха" - все потихоньку забывается (к сожалению)
    Еще раз всем Спасибо .
  • Игорь Шевченко © (27.08.08 10:21) [10]
    а фокус-то в чем ?
  • Сергей М. © (27.08.08 10:23) [11]

    > фокус-то в чем ?


    Видимо, в неудачной попытке запутать вражескую разведку)
  • Bob (27.08.08 10:53) [12]
    >Игорь Шевченко ©   [10]
     Сергей М. ©   [11] угадал. Хотя для меня это "просто интересно".

    >Rouse_ ©   [2]
    Прошу прощения, но что-то я никак не в'еду : почему "-5"($FB), от какого
    адреса отсчитывать?
  • Игорь Шевченко © (27.08.08 10:59) [13]

    > Прошу прощения, но что-то я никак не в'еду : почему "-5"($FB),
    >  от какого
    > адреса отсчитывать?


    адрес перехода всегда отсчитывается от адреса команды jump + длина команды jump
  • Сергей М. © (27.08.08 11:11) [14]

    > от какого
    > адреса отсчитывать?


    Как и всегда - от адреса инструкции, следующей за инструкцией перехода.

    Вот "правильный фокус":

    procedure Focus;
    asm  
         mov ax,$02EB
    @as: db $eb, $fc
    end;
  • Bob (27.08.08 11:15) [15]
    >Игорь Шевченко ©   (27.08.08 10:59) [13]

    >от адреса команды jump + длина команды jump

    что-то не получается

    004520E8   66B8EB04  mov  ax,$04eb
    004520EC   EBFB        jmp  -$05
    004520EE   C3           ret

    4520EC+2=4520EE
    4520EE-5=4520E9 - попадаем на B8 а не на EB04
  • Сергей М. © (27.08.08 11:25) [16]

    > Bob   (27.08.08 11:15) [15]


    Операнд $04EB лежит по адресу 004520EA
    Когда он станет инструкцией jmp +4, переход произойдет черт те куда, но только не на 004520EE, потому что 004520EC + 4 = 004520D0.

    Соответственно чтобы сначала попасть в точку 004520EA, нужно из 004520EE вычесть 004520EA - это и будет смещение, т.е. jmp -4
  • Bob (27.08.08 11:42) [17]
    >Сергей М. ©   (27.08.08 11:11) [14]
    >"правильный фокус":
     asm  
        mov ax,$02EB
    @as: db $eb, $fc
     end;

     - Дошло. Спасибо.
    Однако вариант Rouse_ ©   (27.08.08 09:46) [2]  тоже почему-то работает!
    Еще раз Спасибо.
  • Сергей М. © (27.08.08 11:48) [18]

    > [2]  тоже почему-то работает!


    Просто повезло, что в точке перехода оказалась безобидная инструкция mov eax, следом за которой идет ret
  • Bob (27.08.08 11:57) [19]
    >Сергей М. ©   (27.08.08 11:48) [18]

    >Просто повезло, ...

    - я тоже так думаю.
    Ладно. Еще раз спасибо.
    Всех благ.
 
Конференция "Прочее" » Фокус на АСМе в Дельфи
Есть новые Нет новых   [134441   +9][b:0][p:0.001]