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:25] – [Instruction prefixes] 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. | ||
| - | < | + | < |
| - | blendvpd xmm0, xmm1 ; | + | ;encoding |
| - | vblendvpd xmm0, xmm1, xmm2, xmm3 ; encoded as 0xC4, 0xE3, 0x71, 0x4B, 0xC2, 0x30 | + | blendvpd xmm0, xmm1 ; |
| + | vblendvpd xmm0, xmm1, xmm2, xmm3 ;0xC4, 0xE3, 0x71, 0x4B, 0xC2, 0x30 | ||
| </ | </ | ||
| The first blendvpd instruction has only two arguments; in this encoding scheme is not possible to encode more. It uses the mandatory prefix 0x66 and 0x0F, 0x38 escape sequence. The second version, vblendvpd, has four arguments. It is encoded with a three-byte VEX escape sequence 0xC4, 0xE3, 0x71. | The first blendvpd instruction has only two arguments; in this encoding scheme is not possible to encode more. It uses the mandatory prefix 0x66 and 0x0F, 0x38 escape sequence. The second version, vblendvpd, has four arguments. It is encoded with a three-byte VEX escape sequence 0xC4, 0xE3, 0x71. | ||
| Line 205: | 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 215: | 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 316: | 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 331: | 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 351: | 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 |
| - | | + | |
| - | | + | |
| - | | + | |
| </ | </ | ||