Понимание байта(ов) nop

Понимание байта(ов) nop

Итак, я читал руководства по 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.

Связанный контент