Инструкция по сборке x86: звоните * Reg - PullRequest
9 голосов
/ 07 декабря 2011

Может кто-нибудь дать мне некоторую информацию о косвенных вызовах функций в сборке x86, то есть таких инструкциях, как

call *Reg

Так, где адрес метки функции хранится в регистре.Каким-то образом я не смог найти информацию об этом через google.

И, более того, что это значит, если я получаю исключение Trace / breakpoint при запуске программы сборки x86, которая имеет такую ​​инструкцию?

1 Ответ

8 голосов
/ 07 декабря 2011

Intel и AMD публикуют очень хорошую документацию по x86.Вот ссылка на ссылку на набор инструкций Intel, которая (конечно) имеет раздел о CALL.http://www.intel.com/design/intarch/manuals/243191.HTM

OP Code: FF /2 
Instruction: CALL r/m32 
Description: Call near, absolute indirect, address given in r/m32

Использование синтаксиса NASM

lbl_start:
 MOV EAX, lbl_function1
 CALL EAX
 RETN

lbl_function1:
 MOV EAX, 1
 RET 0

Если вы получаете исключение, это может означать почти все.Вот несколько распространенных проблем ...

  • вы не устанавливаете регистр на адрес в программе
    • вы устанавливаете значение регистра, но оно изменяется APIвызов, который происходит до того, как ваш CALL reg32
    • вы устанавливаете значение регистра для данных, расположенных по определенному адресу, а не сам адресCALL reg32 OP Код неверен, (например: FF D0 - CALL EAX в шестнадцатеричном формате)
...