ModR/M e SIB
Entendendo os byte ModR/M e SIB.
Como jĆ” foi mencionado anteriormente o byte ModR/M Ć© usado em algumas instruƧƵes para especificar o operando na memĆ³ria ou registrador.
Em Assembly existem dois "tipos" de instruƧƵes que recebem dois operandos:
  1. 1.
    As que tem um operando registrador e imediato. Exemplo: mov eax, 123
  2. 2.
    As que tem um operando na memĆ³ria ou dois operandos registradores. Exemplos: mov [ebx], 123 e mov eax, ebx.
O primeiro tipo nĆ£o precisa do byte ModR/M, pois o registrador destino Ć© especificado nos 3 Ćŗltimos bits do byte do opcode. Por exemplo o opcode B8 da instruĆ§Ć£o mov eax, 123 Ć© o seguinte em binĆ”rio: 10111000 Onde o nĆŗmero zero (000) Ć© o cĆ³digo para identificar o registrador EAX.
Um jeito mais simples de especificar esse campo no opcode sem precisar lidar com binĆ”rio Ć© simplesmente somar o opcode "base" (correspondente ao uso de AL/AX/EAX) mais o cĆ³digo do registrador. Por exemplo se a instruĆ§Ć£o B8 (B8 + 0) corresponde a mov eax, 123, entĆ£o o opcode BB (B8 + 3) Ć© mov ebx, 123. E se eu quiser fazer mov bx, 123 basta adicionar o prefixo 66 Ć  instruĆ§Ć£o.
JĆ” as instruƧƵes do segundo tipo usam o byte ModR/M para definir o operando destino na memĆ³ria (no caso de instruƧƵes sem o operando registrador) ou os dois operandos. Onde o byte ModR/M consiste nos trĆŖs campos:
  • MOD - Os primeiros 2 bits que definem o "modo" do operando R/M.
  • REG - Os 3 prĆ³ximos bits que definem o cĆ³digo do operando registrador.
  • R/M - Os 3 Ćŗltimos bits que definem o cĆ³digo do operando R/M.
O byte define 2 operandos:
  1. 1.
    Um operando que Ć© sempre um registrador, definido no campo REG.
  2. 2.
    Um operando que pode ser um registrador ou operando na memĆ³ria.
Para que o campo R/M defina tambĆ©m o cĆ³digo de um registrador, assim como o REG, o valor 3 (11 em binĆ”rio) deve ser usado no campo MOD.
Um adendo sobre o byte ModR/M Ć© que em algumas instruƧƵes o campo REG Ć© usado como uma extensĆ£o do opcode. Ɖ o caso por exemplo das instruƧƵes inc dword [ebx] (FF 03) e dec dword [ebx] (FF 0B) que contĆ©m o mesmo byte de opcode mas fazem operaƧƵes diferentes. Repare como o campo R/M Ć© necessĆ”rio para especificar o operando na memĆ³ria mas o REG fica "sobrando", por isso os engenheiros da Intel tomaram essa decisĆ£o minimamente confusa (vulgo gambiarra), afim de aproveitar dessa peculiaridade em instruƧƵes que precisam de um operando na memĆ³ria mas nĆ£o precisam de um operando registrador.
Para os demais valores do campo MOD os seguintes endereƧamentos sĆ£o feitos de acordo com o valor de R/M:

EndereƧamento em 16-bit

MOD 00

R/M
EndereƧamento
000
[BX+SI]
001
[BX+DI]
010
[BP+SI]
011
[BP+DI]
100
[SI]
101
[DI]
110
displacement 16-bit
111
[BX]

MOD 01

R/M
EndereƧamento
000
[BX+SI] + displacement 8-bit
001
[BX+DI] + displacement 8-bit
010
[BP+SI] + displacement 8-bit
011
[BP+DI] + displacement 8-bit
100
[SI] + displacement 8-bit
101
[DI] + displacement 8-bit
110
[BP] + displacement 8-bit
111
[BX] + displacement 8-bit

MOD 10

R/M
EndereƧamento
000
[BX+SI] + displacement 16-bit
001
[BX+DI] + displacement 16-bit
010
[BP+SI] + displacement 16-bit
011
[BP+DI] + displacement 16-bit
100
[SI] + displacement 16-bit
101
[DI] + displacement 16-bit
110
[BP] + displacement 16-bit
111
[BX] + displacement 16-bit

EndereƧamento em 32-bit

MOD 00

R/M
EndereƧamento
000
[eax]
001
[ecx]
010
[edx]
011
[ebx]
100
SIB
101
displacement 32-bit
110
[esi]
111
[edi]

MOD 01

R/M
EndereƧamento
000
[eax] + displacement 8-bit
001
[ecx] + displacement 8-bit
010
[edx] + displacement 8-bit
011
[ebx] + displacement 8-bit
100
SIB + displacement 8-bit
101
[ebp] + displacement 8-bit
110
[esi] + displacement 8-bit
111
[edi] + displacement 8-bit

MOD 10

R/M
EndereƧamento
000
[eax] + displacement 32-bit
001
[ecx] + displacement 32-bit
010
[edx] + displacement 32-bit
011
[ebx] + displacement 32-bit
100
SIB + displacement 32-bit
101
[ebp] + displacement 32-bit
110
[esi] + displacement 32-bit
111
[edi] + displacement 32-bit

EndereƧamento em 64-bit

Devido ao prefixo REX o campo R/M Ć© estendido em 1 bit no modo de 64-bit.

MOD 00

R/M
EndereƧamento
0000
[rax/eax]
0001
[rcx/ecx]
0010
[rdx/edx]
0011
[rbx/ebx]
0100
SIB
0101
[rip/eip] + displacement 32-bit
0110
[rsi/esi]
0111
[rdi/edi]
1000
[r8/r8d]
1001
[r9/r9d]
1010
[r10/r10d]
1011
[r11/r11d]
1100
SIB
1101
[rip/eip] + displacement 32-bit
1110
[r14/r14d]
1111
[r15/r15d]

MOD 01

R/M
EndereƧamento
0000
[rax/eax] + displacement 8-bit
0001
[rcx/ecx] + displacement 8-bit
0010
[rdx/edx] + displacement 8-bit
0011
[rbx/ebx] + displacement 8-bit
0100
SIB + displacement 8-bit
0101
[rbp/ebp] + displacement 8-bit
0110
[rsi/esi] + displacement 8-bit
0111
[rdi/edi] + displacement 8-bit
1000
[r8/r8d] + displacement 8-bit
1001
[r9/r9d] + displacement 8-bit
1010
[r10/r10d] + displacement 8-bit
1011
[r11/r11d] + displacement 8-bit
1100
SIB + displacement 8-bit
1101
[r13/r13d] + displacement 8-bit
1110
[r14/r14d] + displacement 8-bit
1111
[r15/r15d] + displacement 8-bit

MOD 10

R/M
EndereƧamento
0000
[rax/eax] + displacement 32-bit
0001
[rcx/ecx] + displacement 32-bit
0010
[rdx/edx] + displacement 32-bit
0011
[rbx/ebx] + displacement 32-bit
0100
SIB + displacement 32-bit
0101
[rbp/ebp] + displacement 32-bit
0110
[rsi/esi] + displacement 32-bit
0111
[rdi/edi] + displacement 32-bit
1000
[r8/r8d] + displacement 32-bit
1001
[r9/r9d] + displacement 32-bit
1010
[r10/r10d] + displacement 32-bit
1011
[r11/r11d] + displacement 32-bit
1100
SIB + displacement 32-bit
1101
[r13/r13d] + displacement 32-bit
1110
[r14/r14d] + displacement 32-bit
1111
[r15/r15d] + displacement 32-bit

Byte SIB

Os endereƧamentos com R/M 100 (em 32-bit e 64-bit) sĆ£o os que usam o byte SIB (exceto MOD 11), que como jĆ” foi explicado anteriormente contĆ©m os campos Scale, Index e Base que sĆ£o calculados de maneira equivalente a expressĆ£o:
base + index * scale
Onde o campo scale sĆ£o os 2 primeiros bits, onde seu valor numĆ©rico Ć© equivalente aos seguintes fatores de escala:
  • 00 - NĆ£o multiplica o index
  • 01 - Multiplica o index por 2
  • 10 - Multiplica o index por 4
  • 11 - Multiplica o index por 8
JĆ” os campos index e base contĆ©m 3 bits cada e os mesmos armazenam o cĆ³digo dos registradores que serĆ£o usados. Os bits dos campos no byte seguem a ordem que o prĆ³prio nome sugere. Como em: SSIIIBBB.
Last modified 5mo ago
Export as PDF
Copy link
On this page
EndereƧamento em 16-bit
EndereƧamento em 32-bit
EndereƧamento em 64-bit
Byte SIB