鱼C论坛

 找回密码
 立即注册
查看: 1040|回复: 5

汇编语言附注3汇编编译器对jmp的相关处理

[复制链接]
发表于 2025-4-12 22:51:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1)如果dispE[-128,1271,则不管汇编指令格式是:
     jmps
     jmp short s
     jmpnearptrs
     jmp far ptr S
中的哪一种,**都将它转变为jmpshorts所对应的机器码
     jmpshorts所对应的机器码格式为:EBdisp(占两个字节)**


书中说都换被编译优化成jmp short 所对应的机器码,我在实际编译后再debug中并不是如书中所说

源码:
  1. assume cs:code

  2. code segment
  3. START: JMP START
  4.            JMP SHORT START
  5.            JMP NEAR PTR START
  6.            JMP FAR PTR START
  7. code ends

  8. end START
复制代码


debug中为
EBFE JMP 0000
EBFC JMP 0000
E9F9FF JMP 0000
EA000006A07 JMP 0000
只有jmp start和jmp short start一样,其他不一样
请帮忙回答一下,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-12 22:53:00 | 显示全部楼层
关于不同JMP指令的解析说明


  • JMP STARTJMP SHORT START 的处理:
    这两个指令最终都会编译为短跳转(2字节)。虽然写法不同,但编译器会自动优化:

    1. EB FE   JMP START     ; FE是-2补码(跳转到自身)
    2. EB FC   JMP SHORT START ; FC是-4补码(同样跳转到自身)
    复制代码

    由于是循环跳转,disp=目标地址-当前指令结束地址,计算结果为负数补码
  • JMP NEAR PTR START 的特殊性:
    强制要求生成3字节近跳转指令:

    1. E9 F9 FF  ; E9是近跳转,F9 FF是小端模式-7补码
    复制代码

    注意:近跳转的偏移计算包含指令自身长度(3字节),因此实际偏移 = 目标地址 - (当前地址+3)
  • JMP FAR PTR START 的跨段特性:
    生成5字节远跳转指令:

    1. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-17 14:15:20 | 显示全部楼层
@不二如是 大佬帮忙看看,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-10 09:06:08 | 显示全部楼层
编译器问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
FishC 发表于 2025-4-12 22:53
关于不同JMP指令的解析说明

jmpshorts所对应的机器码格式为:EBdisp(占两个字节),但jmp near ptr start的机器码:E9F9FF与EBdisp格式不同???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
531035528 发表于 2026-01-21 14:57
FishC 发表于 2025-4-12 22:53
关于不同JMP指令的解 ...


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

具体来说:


  1. JMP START           ; 隐式跳转,位移在[-128,127]内,优化为短跳转:EB FE
  2. JMP SHORT START     ; 显式短跳转,直接编译为:EB FC
  3. JMP NEAR PTR START  ; 显式近跳转,编译为近跳转格式:E9 F9 FF
  4. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-27 03:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表