Вопрос

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

  1. OPCODE: '0xFF 0x10' -> Вызов DWORD PTR DS: [EAX
  2. OPCODE: '0xFF 0x11' -> Вызов DWORD PTR DS: [ECX
  3. OPCODE: '0xFF 0x12' -> Вызов DWORD PTR DS: [edx
  4. OPCODE: '0xFF 0x13' -> Вызов DWORD PTR DS: [EBX
  5. OPCODE: '0xFF 0x14' -> Вызов DWORD PTR SS: [ESP + EDI
  6. OPCode: '0xFF 0x15 0x012345678' -> Вызов DWORD PTR DS: [0x012345678
  7. OPCODE: '0xFF 0x16' -> Вызов DWord PTR DS: [ESI
  8. OPCode: '0xff 0x16' -> Вызов dword ptr ds: [edi

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

Это было полезно?

Решение

Вы можете позвонить через 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top