Итак, я читал руководства по AMD64 и, зная, что nop
это на самом деле xchg eax, eax
, я посмотрел на xchg
и нашел кое-что интересное, что, похоже, байт можно закодировать в инструкцию для указания регистров (извините, я с iPod):картина.
Так вот что мне интересно, так это как процессор узнает, есть ли после него байт, с которым можно работать, или этот дополнительный регистр должен иметь тип, rAX
из-за которого он фактически все равно будет одним байтом?0x90
решение1
Я посмотрел на 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, Приложение А.3).
Так вот что мне интересно, так это как процессор узнает, есть ли после него байт, с которым можно работать, или этот дополнительный регистр должен иметь тип rAX, из-за чего на самом деле он все равно будет одним байтом 0x90?
Здесь все наоборот. Для 64-битного режима есть на самом делепрефиксв самом слове инструкции, чтобы указать, что ( REX
префикс). Процессор знает, что искать, основываясь на наличии или отсутствии префикса REX
- и при отсутствии, инструкция по-прежнему просто 0x90
.