3

Итак, я читал мануалы AMD64 и, зная, что nop на самом деле является xchg eax, eax , я посмотрел на xchg и обнаружил кое-что интересное, что кажется, что байт можно закодировать в инструкцию для указания регистров (извинения я на моем iPod): изображение.

Так что мне интересно, как процессор узнает, есть ли байт после работы с ним, или же этот дополнительный регистр должен быть типа rAX результате чего он фактически остается однобайтовым 0x90

1 ответ1

4

Я посмотрел на xchg и обнаружил что-то интересное: кажется, что байт может быть закодирован в инструкции для указания регистров

Да, так работает большинство инструкций x86. Инструкции выбираются либо 32, либо 64 битами за раз (длина слова машины), а не байтами за раз.

Указание XCHG из rAX с rAX (где rAX является EAX на 32-битной машине, и RAX на 64-битной машине) будет 0x90 поскольку регистр Мультиплексор код rAX является 0x00 (фактически операция один цикл , который делает делает ничего такого). Аналогично, инструкция XCHG rBX, rAX будет собираться в 0x93 (код мультиплексирования rBX 0b011).

Кодировка кода операции должна быть указана где-то еще в руководстве, или вы можете посмотреть на карте кода операции x86 (которая помогает понять, как все смешано). Вы можете найти его в Руководствах разработчиков программного обеспечения для архитектуры Intel 64 и IA-32 (Том 2, Приложение A.3).

Так что мне интересно, как процессор узнает, есть ли байт после работы с ним, или же этот дополнительный регистр должен быть типа rAX, в результате чего он фактически остается однобайтовым 0x90?

Здесь все наоборот. Для 64-битного режима в самом командном слове фактически есть префикс для указания этого (префикс REX ). Процессор знает, что искать, основываясь на наличии или отсутствии префикса REX а при отсутствии инструкция по-прежнему всего 0x90 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .