|
关于不同JMP指令的解析说明
- JMP START 和 JMP SHORT START 的处理:
这两个指令最终都会编译为短跳转(2字节)。虽然写法不同,但编译器会自动优化:
- EB FE JMP START ; FE是-2补码(跳转到自身)
- EB FC JMP SHORT START ; FC是-4补码(同样跳转到自身)
复制代码
由于是循环跳转,disp=目标地址-当前指令结束地址,计算结果为负数补码
- JMP NEAR PTR START 的特殊性:
强制要求生成3字节近跳转指令:
- E9 F9 FF ; E9是近跳转,F9 FF是小端模式-7补码
复制代码
注意:近跳转的偏移计算包含指令自身长度(3字节),因此实际偏移 = 目标地址 - (当前地址+3)
- JMP FAR PTR START 的跨段特性:
生成5字节远跳转指令:
- EA 00 00 06 A0 ; EA是远跳转,0000是偏移量,A006是段地址(小端模式)
复制代码
这里出现段地址是因为FAR JUMP需要完整的CS:IP地址,但在实模式下会被转换为物理地址计算
为什么DEBUG显示都为JMP 0000?
DEBUG的反汇编器在显示跳转目标时存在简化:
1. 对短/近跳转只显示偏移量计算结果
2. 对远跳转会显示完整的段:偏移地址
3. 由于所有跳转目标都是自身(死循环),最终都会指向代码段起始地址0000(假设段寄存器CS=当前代码段)
建议用专用反汇编工具(如NDISASM)查看更准确的地址解析。不同JMP类型的机器码长度差异会直接影响程序的内存布局,这在编写自修改代码时需要特别注意。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|