假设我想使用以下操作码进行短跳转:
EB CB或JMP rel8“跳转短路,RIP = RIP 8位位移符号扩展到64位”(其中CB是一个字节有符号值,表示与EIP寄存器中的方向相关的相对偏移)
也许总是偏移量将偏移2,因为此短跳转中的执行时间(参考方向)中的EIP是twobyte指令的基础,但是加数occurs always
eb 30 = jmp 0x00000032(30)eb e2 = jmp 0xffffffe4(-30)然后EIP可以是故意相同的方向,因为fe 2是00或EIP . eb fe = jmp 0x00000000
我发现令人惊讶的是,虽然数字是负数,但是过度偏移也是分叉的 . 但在英特尔,我发现没有提及(可能因为3000页) .
英特尔®64和IA-32架构软件开发人员手册:Vol . 2A 3-423近跳转,跳跃范围从当前EIP值限制为-128到127 .
然后我考虑了三种可能性:
-
是2,因为是执行时间内EIP的后/后值
-
编码值不是2s分量编码的有符号数 .
-
这出现在手册中,但我没有看到,因为我很愚蠢
3 回答
无论是's short jump or not, it'总是
destination - source + sizeof(instruction)
. 在你的情况下(无条件短跳),sizeof(instruction)
是2.这个加法背后的原因是因为一旦cpu执行了指令获取阶段,指令指针就会指向分支之后的指令 .跳转短路相对于跳转指令的末尾(长度为两个字节)采用EIP,并采用一个字节操作数,该操作数被符号扩展并添加到EIP .
rel8
相对于下一条指令的内存地址,可以通过创建两个可执行文件并将其拆解来轻松确认:这反汇编为(有了ndisasm,它在16位,32位和64位代码中是相同的):
然后,另一个可执行
因此,
rel8
始终相对于jmp
之后的下一条指令进行编码 . 但是,反汇编程序(至少ndisasm
和udcli
)显示它相对于jmp
指令本身 . 这可能会引起一些混乱 .