Понимание кодов JMP в ассемблере

Я только недавно поцарапал поверхность языка ассемблера и отладки. У меня есть следующий код:

Address   Hex dump          Command                                  Comments
006E3689   .  E8 C5F9FFFF   CALL 006E3053
->006E368E      E9            DB E9
->006E368F      35            DB 35                                    ; CHAR '5'
->006E3690      80            DB 80
->006E3691   .  0000D490      DD 90D40000
006E3695  />  E8 72040000   CALL 006E3B0C

А дальше вниз...

Address   Hex dump          Command                                  Comments
006EB6C8  /.  6A 58         PUSH 58
006EB6CA  |.  68 A0372A00   PUSH 2A37A0
006EB6CF    ^ E9 C17FFFFF   JMP 006E3695

Теперь, прежде чем я скомпилировал коды, указанные ->, на самом деле все были включены в JMP 006EB6C8, который, конечно, просто перешел ко второму набору кода, добавил пару вещей и вернулся обратно наверх.

Теперь этот код все еще работает, но я не уверен, почему код изменился (используя Ollydbg) при компиляции, но что более важно (я считаю), это то, как код знает, что нужно прыгать и как далеко. Мои исследования до сих пор говорили мне, что E9 — это код операции для прыжка, но я не смог найти информацию о 35 и 80. Я предполагаю, что 0000D490 — это какое-то смещение, но я не могу найти никакой математики, которая суммируется. адрес 006EB6C8.

Надеюсь, что этот вопрос также хорошо сформулирован, я все еще новичок. Заранее спасибо!


person Brent Aureli    schedule 13.11.2014    source источник
comment
Вам не нужно гадать, что делает код операции, загрузите руководство: Intel. ref.x86asm.net — полезный веб-сайт. дизассемблер udis86 имеет хороший дизассемблер под названием udcli.   -  person nrz    schedule 13.11.2014
comment
Связано: stackoverflow.com/questions/14470900/   -  person nrz    schedule 13.11.2014
comment
Связано: stackoverflow.com/questions/14921735/   -  person nrz    schedule 13.11.2014


Ответы (1)


Я озадачен, почему OllyDbg не разбирает для вас этот прыжок. В любом случае, E9 это прыжок рядом, как вы поняли. Требуется 4-байтовое смещение от начала следующей инструкции. Таким образом, ваша инструкция на самом деле E9 35 80 00 00, что означает jump to address of next instruction + 00008035 (x86 использует обратный порядок байтов). Адрес следующей инструкции, конечно же, 006E3693, поэтому переход приведет вас к 006E3693 + 00008035 = 006EB6C8, что вы и написали изначально.

person Jester    schedule 13.11.2014