Ok, então eu estava lendo os manuais do AMD64 e sabendo que isso nop
é realmente um arquivo xchg eax, eax
, olhei xchg
e encontrei algo interessante, que parece que um byte pode ser codificado na instrução para especificar os registros (desculpas, estou no meu iPod) :foto.
Então, o que estou me perguntando é como o processador sabe se há um byte depois para trabalhar ou se esse registro extra tem que ser do tipo, rAX
fazendo com que ele ainda seja o único byte0x90
Responder1
Olhei o xchg e descobri algo interessante, parece que um byte pode ser codificado na instrução para especificar os registradores
Sim, é assim que a maioria das instruções x86 funciona. As instruções são buscadas 32 ou 64 bits por vez (comprimento da palavra da máquina), e não bytes por vez.
Especificar um XCHG
of rAX
with rAX
(onde rAX
está EAX
em uma máquina de 32 bits e RAX
em uma máquina de 64 bits) será 0x90
, porque o código mux do registrador para rAX
is 0x00
(efetivamente uma operação de um ciclo que não faz nada). Da mesma forma, a instrução XCHG rBX, rAX
será montada em 0x93
(o código mux de rBX
ser 0b011
).
A codificação do opcode deve estar listada em algum outro lugar do manual, ou você pode consultar um mapa de opcode x86 (que ajuda a entender como tudo está misturado). Você pode encontrar um noManuais para desenvolvedores de software das arquiteturas Intel 64 e IA-32(Volume 2, Apêndice A.3).
Então, o que estou me perguntando é como o processador sabe se há um byte depois para trabalhar ou se esse registro extra deve ser do tipo rAX, fazendo com que ele ainda seja o byte 0x90
Aqui é o contrário. Para o modo de 64 bits, existe na verdade umprefixona própria palavra de instrução para indicar isso ( REX
prefixo). O processador sabe o que procurar com base na presença ou ausência do REX
prefixo - e na ausência dele, a instrução ainda é apenas 0x90
.