2014-11-29 3 views
0
  1. Как использовать код вызова для создания прямого вызова без разыменования указателя?Инструкция по прямому вызову ASM

  2. Поскольку инструкция вызова может означать любое из числа кодов op, таких как xE8, xFF и x9A, как сообщить Visual Studio, какую я хочу сгенерировать, когда я использую инструкцию вызова?

+0

Код операции 'call' на основе E8 будет применяться только к объектам с локальными смещениями. Скорее всего, у меня нет MSVC для тестирования на данный момент), а затем, что ваша вызываемая функция должна иметь локальную связь, например, объявляемую как «статическую», как минимум. –

+0

Спасибо, Крис. Я отредактировал вопрос, чтобы быть более ясным. – RASx64

+0

Выбор команды перехода/ветви/вызова обычно выполняется в компоновщике. Включение оптимизации времени соединения может позволить компоновщику использовать прямой вызов. – EOF

ответ

0

Ассемблер выяснит, какой код операции генерируется на основе того выражения, которое вы используете.

Если вы напишете call foo, это будет относительный звонок E8. Если вы напишете call [foo], call [eax] или call eax, это будет непрямой вызов FF (расширение кода операции 2). Если вы напишете call foo:bar (или если ассемблер знает, что вы вызываете дальнейшую процедуру), это будет прямой прямой вызов 9A. Если вы напишете call far [foo], это будет косвенный дальний вызов, который также является FF (но расширение кода операции 3).

PS: не уверен в синтаксисе удаленного вызова для VS, подробности см. В документации. Тем не менее, вы обычно не используете большие звонки.

Смежные вопросы