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