Compreendendo o(s) byte(s) nop

Compreendendo o(s) byte(s) nop

Ok, então eu estava lendo os manuais do AMD64 e sabendo que isso nopé realmente um arquivo xchg eax, eax, olhei xchge 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, rAXfazendo 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 XCHGof rAXwith rAX(onde rAXestá EAXem uma máquina de 32 bits e RAXem uma máquina de 64 bits) será 0x90, porque o código mux do registrador para rAXis 0x00(efetivamente uma operação de um ciclo que não faz nada). Da mesma forma, a instrução XCHG rBX, rAXserá montada em 0x93(o código mux de rBXser 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 ( REXprefixo). O processador sabe o que procurar com base na presença ou ausência do REXprefixo - e na ausência dele, a instrução ainda é apenas 0x90.

informação relacionada