鱼C论坛

 找回密码
 立即注册
查看: 3393|回复: 1

[已解决]jmp远转移绝对地址是怎么确定的

[复制链接]
发表于 2021-2-1 18:28:17 | 显示全部楼层 |阅读模式

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

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

x
jmp远转移指令中包含目标地址, 也就是说机器码中就包含了目标地址, 但是程序在运行时才能确定地址, 这个目标地址是怎么得来的, 难道是程序加载内存的时候, 动态改变的?
最佳答案
2021-2-1 22:02:27
本帖最后由 jackz007 于 2021-2-1 22:26 编辑

       你说的是王爽汇编?不管是长跳转还是短跳转,只要不是跨段跳转,计算的都是从目的地和当前指令(跳转指令)之间的相对距离,也就是需要跨越的指令字节数。
  1. 149C:0100 EB00          JMP        0102                              
  2. 149C:0102 E9FB7E        JMP        8000                              
  3. 149C:0105 B8004C        MOV        AX,4C00                           
  4. 149C:0108 CD21          INT        21               
复制代码

        先看看短跳转,JMP 102  的指令字节是 EB 00,其中,操作码是 EB,操作数是 0,指令长度是 2 字节,就是说,从偏移地址 100 跳到 102,需要跨越的指令字节数是0,事实上也是如此,因为偏移地址 102 正好是下一条指令。
        再看看长跳转,JMP 8000 的指令字节是 E9 FB 7E,其中,操作码是 E9 ,操作数是 7EFB,指令长度是 3 个字节,下一条指令地址是 105,这些地址与指令之间,满足下面的关系:7EFB + 105 = 8000。
        由此可以看出,跳转指令、call 指令等等都是根据指令间的相对跨度关系来定位目标内存地址的,典型的 "水涨船高" 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-1 22:02:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-2-1 22:26 编辑

       你说的是王爽汇编?不管是长跳转还是短跳转,只要不是跨段跳转,计算的都是从目的地和当前指令(跳转指令)之间的相对距离,也就是需要跨越的指令字节数。
  1. 149C:0100 EB00          JMP        0102                              
  2. 149C:0102 E9FB7E        JMP        8000                              
  3. 149C:0105 B8004C        MOV        AX,4C00                           
  4. 149C:0108 CD21          INT        21               
复制代码

        先看看短跳转,JMP 102  的指令字节是 EB 00,其中,操作码是 EB,操作数是 0,指令长度是 2 字节,就是说,从偏移地址 100 跳到 102,需要跨越的指令字节数是0,事实上也是如此,因为偏移地址 102 正好是下一条指令。
        再看看长跳转,JMP 8000 的指令字节是 E9 FB 7E,其中,操作码是 E9 ,操作数是 7EFB,指令长度是 3 个字节,下一条指令地址是 105,这些地址与指令之间,满足下面的关系:7EFB + 105 = 8000。
        由此可以看出,跳转指令、call 指令等等都是根据指令间的相对跨度关系来定位目标内存地址的,典型的 "水涨船高" 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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