汇编语言附注3汇编编译器对jmp的相关处理
1)如果dispE[-128,1271,则不管汇编指令格式是:
jmps
jmp short s
jmpnearptrs
jmp far ptr S
中的哪一种,**都将它转变为jmpshorts所对应的机器码
jmpshorts所对应的机器码格式为:EBdisp(占两个字节)**
书中说都换被编译优化成jmp short 所对应的机器码,我在实际编译后再debug中并不是如书中所说
源码:
assume cs:code
code segment
START: JMP START
JMP SHORT START
JMP NEAR PTR START
JMP FAR PTR START
code ends
end START
debug中为
EBFE JMP 0000
EBFC JMP 0000
E9F9FF JMP 0000
EA000006A07 JMP 0000
只有jmp start和jmp short start一样,其他不一样
请帮忙回答一下,谢谢
关于不同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 小助理,如未能正确解答您的问题,请继续追问。 @不二如是 大佬帮忙看看,感谢
页:
[1]