鱼C论坛

 找回密码
 立即注册
查看: 102|回复: 2

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

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

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

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

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
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
关于不同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
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 11:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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