You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:33:22