关于汇编转移命令jump的问题

lost_in_crowd 2012-09-23 12:35:57
书上说“jump short 标号”是在编译的时候由编译程序计算出相对地址位移保存到程序代码中,然后在程序执行时用当前IP加上相对地址位移计算出偏移移地址;那请问“jump far ptr 标号”是在什么时候由谁来确定段地址和偏移地址的?
...全文
645 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
编译器通常生成一个可浮动的映像,对DOS .exe,是基于段0开始的,也就是程序的第一个段的段地址设定为0,后面的段顺序排,比如第一个段占用了256字节(16节),那么第二个段的段地址就是16,依此类推。程序执行之前,操作系统的加载器会对涉及绝对地址访问的指令进行重定位,比如mov ax,data这种指令,编译的时候生成的是浮动段值(如果data是第一个段,那就是mov ax,0),然后在文件头中标记这个位置是一个重定位项,加载器把这个位置加上.exe装入内存的起始段,比如1234h,就完成了重定位。
windows的PE格式类似,编译器一般生成的也是浮动地址,同时在文件头中标记一个加载起始地址(0x00401000之类),操作系统的加载器可以根据这些信息调整加载位置(对于PE,也可以剥离重定位信息,那程序只能加载到文件头标记的起始位置,不能调整了),只是PE的重定位与DOS .exe有所不同。
大熊猫侯佩 2012-09-23
  • 打赏
  • 举报
回复
你自己都说了 “偏移”地址,和绝对地址区别在哪?

jmp 有很多种格式,具体你可以看一下指令码。

建议实际写一个看一下,加深理解,一目了然。
lost_in_crowd 2012-09-23
  • 打赏
  • 举报
回复
如果是编译器的话,编译器怎么确定程序会加载到哪个内存区呢?程序加载到内存不是随机的吗?
大熊猫侯佩 2012-09-23
  • 打赏
  • 举报
回复
编译器
  • 打赏
  • 举报
回复
就是标号所在的段和段内偏移地址(如果没有段超越前缀的话)。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧