I looked at the xchg and found something interesting, that it seems a byte can be encoded into the instruction for specifying the registers
Sim, é assim que a maioria das instruções do x86 funciona. As instruções são buscadas 32 ou 64 bits por vez (comprimento da palavra da máquina), não bytes de cada vez.
A especificação de XCHG
de rAX
com rAX
(onde rAX
é EAX
em uma máquina de 32 bits e RAX
em uma máquina de 64 bits) será 0x90
, porque o código mux de registro para rAX
é 0x00
(efetivamente uma operação de ciclo único que não faz nada). Da mesma forma, a instrução XCHG rBX, rAX
será montada em 0x93
(o código mux de rBX
sendo 0b011
).
A codificação opcode deve estar listada em algum outro lugar no manual, ou você pode procurar em um mapa de opcode x86 (o que ajuda a entender como tudo é combinado). Você pode encontrar um nos Manuais do desenvolvedor de software de arquiteturas Intel 64 e IA-32 (Volume 2, Apêndice A.3).
So what I am wondering is how does the processor know if there is a byte after to work with or is it that that extra register has to be of type rAX causing it to actually still be the one byte 0x90
Aqui, é o oposto. Para o modo de 64 bits, há realmente um prefixo na própria palavra de instrução para indicar que ( REX
prefixo). O processador sabe o que procurar com base na presença ou ausência do prefixo REX
- e, na ausência de, a instrução ainda é apenas 0x90
.