Entendendo o (s) byte (s) nop

3

Ok, então eu estava lendo os processadores AMD64 e sabendo que nop é realmente um xchg eax, eax , eu olhei para o xchg e achei algo interessante, que parece que um byte pode ser codificado na instrução para especificando os registradores (desculpas que eu estou no meu iPod): imagem .

Então, o que eu estou querendo saber é como o processador sabe se há um byte depois de trabalhar ou se é que esse registro extra deve ser do tipo rAX , fazendo com que ele ainda seja o único byte 0x90

    
por Cole Johnson 05.06.2012 / 16:11

1 resposta

4

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 .

    
por 05.06.2012 / 16:27