Я посмотрел на 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
.