x86-32架构下手动计算跳转偏移及指令取指方式咨询
x86-32相对跳转/调用的偏移计算与取指方式
一、x86-32的指令取指方式
x86是变长指令集,单条指令长度从1字节到15字节不等,CPU执行时逐条取指:每次解析当前指令的操作码确定指令长度,执行完毕后将程序计数器(PC)更新到下一条指令的起始地址,不存在MIPS那样固定4字节块取指的规则。
二、相对jmp/call的偏移计算规则
x86中相对跳转(jmp)和调用(call)的偏移量,是相对于指令执行后的PC值(即当前跳转/调用指令的下一条指令的起始地址)计算的,核心公式为:
偏移量 = 目标地址 - (当前指令的起始地址 + 当前指令的长度)
对比MIPS 32的规则:MIPS指令固定4字节,执行时PC自动指向下一条指令(当前指令地址+4),所以偏移公式简化为偏移量=目标地址-(当前指令地址+4),本质逻辑和x86一致,但x86因指令长度不固定,必须用当前指令的实际长度替代MIPS的固定4字节。
三、结合论文示例的验证
以论文中的代码为例:
1. jmp指令的偏移计算
假设jmp指令的起始地址为0x00,指令长度为2字节,因此执行后PC值为0x00 + 2 = 0x02。
论文中jmp的偏移为0x26,根据公式可推导出目标地址(即call指令的起始地址)为:
目标地址 = 执行后PC值 + 偏移量 = 0x02 + 0x26 = 0x28
2. call指令的偏移计算
call指令的长度为5字节,假设其起始地址为0x28,执行后PC值为0x28 +5 =0x2D。
论文中call的偏移为-0x2b,目标地址(即popl %esi的起始地址0x02)验证如下:
目标地址 = 执行后PC值 + 偏移量 =0x2D + (-0x2b)=0x02
完全符合代码逻辑(call跳回popl指令)。
内容的提问来源于stack exchange,提问作者Abhishek Ghosh
相关产品推荐
相关产品推荐

