FFFa 发表于 2025-4-12 22:51:56

汇编语言附注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一样,其他不一样
请帮忙回答一下,谢谢

FishC 发表于 2025-4-12 22:53:00

关于不同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 小助理,如未能正确解答您的问题,请继续追问。

FFFa 发表于 2025-4-17 14:15:20

@不二如是 大佬帮忙看看,感谢

FFFa 发表于 2025-6-10 09:06:08

编译器问题

531035528 发表于 2026-1-21 14:57:16

FishC 发表于 2025-4-12 22:53
关于不同JMP指令的解析说明




jmpshorts所对应的机器码格式为:EBdisp(占两个字节),但jmp near ptr start的机器码:E9F9FF与EBdisp格式不同???

FishC 发表于 2026-1-21 14:58:04

531035528 发表于 2026-01-21 14:57
FishC 发表于 2025-4-12 22:53
关于不同JMP指令的解 ...

书中关于JMP指令优化的描述,通常适用于未显式指定跳转类型的隐式跳转。当您明确使用 NEAR PTR 或 FAR PTR 时,编译器会尊重您的选择,不进行优化。

具体来说:


JMP START         ; 隐式跳转,位移在[-128,127]内,优化为短跳转:EB FE
JMP SHORT START   ; 显式短跳转,直接编译为:EB FC
JMP NEAR PTR START; 显式近跳转,编译为近跳转格式:E9 F9 FF
JMP FAR PTR START   ; 显式远跳转,编译为远跳转格式:EA 00 00 06 A0


短跳转格式为 EB disp(2字节,disp为8位有符号位移)。
近跳转格式为 E9 disp16(3字节,disp16为16位有符号位移)。
远跳转格式为 EA offset segment(5字节,包含完整段地址和偏移量)。

在您的例子中,所有跳转目标都是同一地址,位移计算后确实在短跳转范围内。但显式指定 NEAR PTR 时,编译器会严格按照近跳转格式生成机器码,因此与 EB disp 格式不同。书中说法主要针对隐式跳转的优化场景,实际编程中显式指定跳转类型会覆盖优化行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 汇编语言附注3汇编编译器对jmp的相关处理