Codificação dos registradores
Entendendo a codificação dos registradores em 16-bit, 32-bit e 64-bit
Em modo de 16-bit e 32-bit cada registrador é identificado usando um número de 3 bits, permitindo assim identificar uma variação de 8 registradores diferentes. Porém vários registradores compartilham do mesmo código, e qual especificamente será usado varia de acordo com a instrução sendo utilizada e o tamanho do operando.
Por exemplo instruções da FPU irão sempre usar algum registrador ST0~ST7, então o código em uma instrução da FPU será usado para identificar algum deles.
Como por exemplo a instrução fld st3
que em código de máquina fica D9 C3
, onde C3
é o ModR/M:
Repare que essa instrução usa o campo REG
como extensão do opcode e o R/M é usado para especificar o operando. Não coincidentemente o código 3 (0b011
) é usado para identificar o registrador ST3.
Já instruções que usam registradores de propósito geral, qual especificamente será usado depende do tamanho do operando na instrução (veja Atributos e prefixos).
Por exemplo as seguintes instruções compiladas em modo de 64-bit:
Se convertermos esses opcodes em binário teremos o seguinte:
Esses dois opcodes usam os 3 últimos bits para identificar o registrador. Veja que o mesmo código 000
acabou sendo usado para identificar EAX, AX e AL.
Isso porque na primeira instrução o atributo operand-size padrão de 32-bit foi usado, então o registrador EAX é usado na instrução. Já na segunda o prefixo operand-size override (byte 66
) foi usado, assim o operand-size era de 16-bit e portanto o registrador AX é usado.
Já a última instrução é exclusivamente usada para operandos de 8-bit, e portanto o registrador AL é usado.
Tabela de códigos
Como já foi explicado no tópico que fala sobre o prefixo REX, esse prefixo estende os campos usados em ModR/M, SIB e o campo REG
do opcode em 1 bit. Daí assim o código usado para identificar o registrador, em modo de 64-bit, tem 4 bits de tamanho.
A tabela abaixo lista os códigos usados para identificar os registradores. Lembrando que o bit mais significativo indica um dos bits do REX ligado, ou seja, só é utilizado em modo de 64-bit.
Código | Registrador |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Last updated