- 论坛徽章:
- 0
|
10、 Displacement 与 Immediate
Displacement 与 Immediate 是嵌入指令编码中的。在编码组合序列里 Displacement 先于 Immediate。
Displacement 与 immediate 最大 4 个字节。可是在 64 位 Long 模式下,一些应用场合下 displacement 与 immediate 可以是 8 个字节。
Immediate 是符号数;大部分情况下 displacement 是符号数。可是在直接内存寻址下 displacement 不是符号数。
10.1、 displacement
Displacement 意即基于基址的偏移量,意同 offset。常见于基址+disp 的形式。
10.1.1、 displacement 的符号数
在两种寻址模式下,displacement 是符号值,有符号数的语义。
(1)基址+displacement 的寻址模式下
这种寻址是使用 ModRM 进行,相对于基址的偏移量。这时 displacement 是符号数,当 displacement 为 8 位时,会符号扩展至 32 位。
典型的指令如:lea eax, [ebp - 0x0c]
(2)相对转移寻址
这种寻址是基于 rip(instruction pointer)的相对寻址,这时 displacement 是个基于 rip 的符号数偏移量。如:call Jz 和 Jmp Jz 等。同样,displacement 为 8 位时,会符号扩展至 32 位来计算结果。
典型的指令如:jmp $+0xc(短跳转)
相反,在直接内存寻址下,displacement 不是符号值,它不含符号数的语义。能提供直接内存寻址有两种方式:
(1)基于 ModRM 寻址中的 [disp32] 寻址
在 ModRM = 00-XXX-101 能提供直接内存寻址。或者:ModRM = 00-XXX-100 + SIB = 00-100-101 也能提供直接内存寻址。
典型的编码是:c7 04 25 44 33 22 11 01 00 00 00
它的指令是:mov dword ptr [0x11223344], 1
(2)寻址模式直接嵌入 Opcode 中的情况
另一种是在 Opcode 中就提供直接内存寻址模式。这种 Opcode 为数少,典型的编码是:a1 44 33 22 11
它的指令形式是:mov eax, [0x11223344]
10.1.2、 64 位的 displacement 值
64 位 Long 模式下,只有一种情况 displacement 是 64 位。前面已经提到:采用嵌在 Opcode 中的直接内存寻址,displacement 是可以为 64 的,仅止而已。 |
mov rax, Ov 这条指令中它的内存寻址属性字符是 Ov,它是不依赖于 ModRM 的直接内存寻址。
典型的编码是:48 a1 88 77 66 55 44 33 22 11
指令形式是:mov rax, qword ptr [0x1122334455667788]
它仅能对 rax 寄存器寻址提供 64 位的 displacement 值。
10.2、immediate
Immediate 相对简单多了,采用 immediate 寻址的 Opcode 要么就是嵌入 Operand,要么就是 Group 属性的 Opcode。
Immediate 是个符号数,32 位下 imme8 会符号扩展到 32 位。64 位下会符号扩展到64位。
10.2.1、采用 Immediate 的寻址模式
(1)、 采用 Immediate 单 Operand 的指令寻址模式
只有 1 个操作数下,Immediate 寻址模式在 Opcode 嵌入寻址模式,典型的如:push Iv 或 push Ib 指令,仅此而已。
(2)、两个以上的 Operands 的 Immediate 寻址模式
一种是与 GPRs 之间的寻址,如指令:mov eax,0x10 这条指令的目标操作数是 rax,源操作数是 Iv。其中 rax 的寻址已嵌入到Opcode中。
它的编码是:b8 10 00 00 00
还有就是与 mem 之间的寻址,如指令:mov dword ptr [eax], 1 这种指令是 Group 属性的指令。
10.2.2、 64 位 Immediate 值
64 位下,只有与 GPRs 之间的传送,才可能是 64 位,仅止而已。
|
但 push Iv 和 push Ib 这类 push 指令它的缺省操作数是 64 位的。虽然指令编码不能有 64 位 immediate 值,但它会符号扩展至 64 位,其结果是 64 位的。
记住:
1、64 位下 displacement / immediate 与 GPRs 之间的寻址才可能是 64 位,仅止而已。
2、displacement 含有偏移的语义时,它是符号数。它是直接内存寻址时,它是非符号数;immediate 则是符号数。 |
x86 & x64 平台的指令编码已经讲解完毕。 |
|