This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:multiasm:papc:chapter_6_6 [2026/02/19 20:26] – [Instruction opcode] ktokarz | en:multiasm:papc:chapter_6_6 [2026/02/19 20:48] (current) – [Scale Index Base byte] ktokarz | ||
|---|---|---|---|
| Line 86: | Line 86: | ||
| <code asm> | <code asm> | ||
| mov BYTE PTR [ebx], 5 ;DS as the default segment | mov BYTE PTR [ebx], 5 ;DS as the default segment | ||
| - | mov BYTE PTR ES:[ebx], 5 ;ES segment override (results in appearance of the byte 0x26 as the prefix) | + | mov BYTE PTR ES:[ebx], 5 ;ES segment override |
| + | ;(results in appearance of the byte 0x26 as the prefix) | ||
| </ | </ | ||
| * 0x2E – CS segment override | * 0x2E – CS segment override | ||
| Line 171: | Line 172: | ||
| * 0x8F Three-byte XOP | * 0x8F Three-byte XOP | ||
| VEX-encoded instructions are written with V at the beginning. Let's look at the example of the blending instruction. | VEX-encoded instructions are written with V at the beginning. Let's look at the example of the blending instruction. | ||
| - | < | + | < |
| ;encoding | ;encoding | ||
| blendvpd xmm0, xmm1 ; | blendvpd xmm0, xmm1 ; | ||
| Line 206: | Line 207: | ||
| Let's look at some examples of instruction encoding. First, look at the data transfer between two registers. | Let's look at some examples of instruction encoding. First, look at the data transfer between two registers. | ||
| <code asm> | <code asm> | ||
| - | ; | + | ;encoding |
| - | mov al, dl ;encoded as 0x88, 0xD0 11 010 000 | + | mov al, dl ;0x88, 0xD0 11 010 000 |
| - | mov ax, dx ;encoded as 0x89, 0xD0 11 010 000 | + | mov ax, dx ;0x89, 0xD0 11 010 000 |
| - | mov dx, si ;encoded as 0x89, 0xF2 11 110 010 | + | mov dx, si ;0x89, 0xF2 11 110 010 |
| - | mov si, dx ;encoded as 0x89, 0xD6 11 010 110 | + | mov si, dx ;0x89, 0xD6 11 010 110 |
| </ | </ | ||
| Notice that in the first and second lines, different opcodes are used, but the MOD R/M bytes are identical. The type of instruction determines the order of data transfer. | Notice that in the first and second lines, different opcodes are used, but the MOD R/M bytes are identical. The type of instruction determines the order of data transfer. | ||
| Line 216: | Line 217: | ||
| Now, a few examples of indirect addressing without displacement. | Now, a few examples of indirect addressing without displacement. | ||
| <code asm> | <code asm> | ||
| - | | + | ;encoding |
| - | mov dx, | + | mov dx, |
| - | mov dx, | + | mov dx, |
| - | mov dx,[bx+di];encoded as 0x8B, 0x11 00 010 001 Reg. only addr. | + | mov dx,[bx+di] ;0x8B, 0x11 00 010 001 Reg. only addr. |
| - | mov cx,[bx+di];encoded as 0x8B, 0x09 00 001 001 Reg. only addr. | + | mov cx,[bx+di] ;0x8B, 0x09 00 001 001 Reg. only addr. |
| </ | </ | ||
| Now, a few examples of indirect addressing with displacement. | Now, a few examples of indirect addressing with displacement. | ||
| <code asm> | <code asm> | ||
| - | | + | ;encoding |
| - | mov dx,[bp+62];encoded as 0x8B, 0x56, 0x3E 01 010 110 | + | mov dx,[bp+62] ;0x8B, 0x56, 0x3E 01 010 110 |
| - | mov [bp+62],dx;encoded as 0x89, 0x56, 0x3E 01 010 110 | + | mov [bp+62],dx ;0x89, 0x56, 0x3E 01 010 110 |
| - | mov dx,[si+13];encoded as 0x8B, 0x54, 0x0D 01 010 100 | + | mov dx,[si+13] ;0x8B, 0x54, 0x0D 01 010 100 |
| - | mov si, | + | mov si, |
| </ | </ | ||
| - | If we look in first two lines, we can observe that the MOD R/M bytes are identical. The only difference is the opcode, which determines the direction of the data transfer. | + | If we look at the first two lines, we can observe that the MOD R/M bytes are identical. The only difference is the opcode, which determines the direction of the data transfer. |
| Notice also that the last instruction is encoded as BP + displacement, | Notice also that the last instruction is encoded as BP + displacement, | ||
| Line 317: | Line 318: | ||
| <code asm> | <code asm> | ||
| ;MOD R/M (second byte) is 0x04 for all instructions: | ;MOD R/M (second byte) is 0x04 for all instructions: | ||
| - | ; MOD REG R/M | + | ; MOD REG R/M |
| - | | + | |
| ;SIB (third byte) is 0x0B, 0x4B, 0x8B or 0xCB: | ;SIB (third byte) is 0x0B, 0x4B, 0x8B or 0xCB: | ||
| - | ; Scale Index Base Scale Index Base | + | ; |
| - | mov eax, [ebx+ecx] | + | mov eax, [ebx+ecx] |
| - | mov eax, [ebx+ecx*2] | + | mov eax, [ebx+ecx*2] ;0x8B, 0x04, 0x4B 01 |
| - | mov eax, [ebx+ecx*4] | + | mov eax, [ebx+ecx*4] ;0x8B, 0x04, 0x8B 10 |
| - | mov eax, [ebx+ecx*8] | + | mov eax, [ebx+ecx*8] ;0x8B, 0x04, 0xCB 11 |
| </ | </ | ||
| Line 332: | Line 333: | ||
| <code asm> | <code asm> | ||
| ;REX prefix (first byte) is 0x48 for all instructions: | ;REX prefix (first byte) is 0x48 for all instructions: | ||
| - | ; | + | ; |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| ;MOD R/M (second byte) is 0x04 for all instructions: | ;MOD R/M (second byte) is 0x04 for all instructions: | ||
| - | ; MOD R.REG R/M | + | ; MOD R.REG R/M |
| - | | + | |
| - | ; Scale X.Index B.Base | + | ; |
| - | mov rax, [rbx+rcx] | + | mov rax, [rbx+rcx] |
| - | mov rax, [rbx+rcx*2] | + | mov rax, [rbx+rcx*2] ;0x48, 0x8B, 0x04, 0x4B 01 |
| - | mov rax, [rbx+rcx*4] | + | mov rax, [rbx+rcx*4] ;0x48, 0x8B, 0x04, 0x8B 10 |
| - | mov rax, [rbx+rcx*8] | + | mov rax, [rbx+rcx*8] ;0x48, 0x8B, 0x04, 0xCB 11 |
| </ | </ | ||
| Line 352: | Line 353: | ||
| <code asm> | <code asm> | ||
| - | ; Scale X.Index B.Base | + | ; |
| - | mov rax, [r10+rcx] | + | mov rax, [r10+rcx] |
| - | mov rax, [rbx+r11] | + | mov rax, [rbx+r11] |
| - | mov r12, [rbx+rcx] | + | mov r12, [rbx+rcx] |
| - | ;Last instruction has the MOD R/M REG field extended | + | ;Last instruction has the MOD R/M REG field extended |
| - | | + | |
| - | | + | |
| - | | + | |
| </ | </ | ||