Код операции и ModRM для вопроса 'call dword ptr [mem32]'? - PullRequest
3 голосов
/ 06 января 2011

Почему вы не можете вызвать указатель адреса из регистра EBP? То, что я имею в виду под этим, продемонстрировано в следующем шаблоне кода.

  1. Код операции: '0xFF 0x10' -> CALL DWORD PTR DS: [EAX]
  2. OpCode: '0xFF 0x11' -> CALL DWORD PTR DS: [ECX]
  3. Код операции: '0xFF 0x12' -> CALL DWORD PTR DS: [EDX]
  4. OpCode: '0xFF 0x13' -> CALL DWORD PTR DS: [EBX]
  5. OpCode: '0xFF 0x14' -> CALL DWORD PTR SS: [ESP + EDI]
  6. OpCode: '0xFF 0x15 0x012345678' -> CALL DWORD PTR DS: [0x012345678]
  7. OpCode: '0xFF 0x16' -> CALL DWORD PTR DS: [ESI]
  8. Код операции: '0xFF 0x16' -> CALL DWORD PTR DS: [EDI]

«5» указано в «Руководстве по Intel», но на «6» никогда не ссылаются напрямую, и никогда прямо не говорится, что вы не можете вызвать его из регистра EBP. Я знаю, что это не бесполезная функция, но мне было интересно, почему Intel выбрала эти два регистра для использования, это был просто выбор дизайна или я что-то упустил? (У меня есть предположение, но мне любопытно, какова настоящая причина.)

1 Ответ

4 голосов
/ 06 января 2011

Вы можете звонить через EBP, он просто закодирован по-разному.Вам нужна последовательность

0xff 0x55 0x00

Дело в том, что нет способа кодировать EBP без смещения (выше указано, что EBP с байтовым смещением 0), как кодирование, которое вы обычно ожидаетеEBP без смещения (0x15) вместо этого означает 32-битный абсолют.

Также обратите внимание на ваш пример 0xff 0x14 - в этом случае есть 3-й байт (байт SIB), который кодирует базовый регистр, регистр индекса,и масштабный коэффициент.ESP + EDI, как в вашем примере, имеет 3-й байт 0x3c - вы хотите, чтобы 3-й байт был 0x24, чтобы получить только ESP

Что касается , почему они выбрали EBP и ESPчто касается регистров, которые не могут быть просто закодированы, то это потому, что ESP является указателем стека (как правило, к нему обращаются инструкции push / pop), а EBP является указателем фрейма, поэтому вы редко хотите напрямую разыменовывать его без смещения.По крайней мере, это был тот случай, когда был разработан 80386.

...