关于汇编语言“jmp far ptr 标号”指令的问题

keesss 2016-01-13 03:13:38
汇编语言中“jmp far ptr 标号”可以实现长跳转,这时候编译过后机器码中已经贴上了跳转点的具体地址,而不是偏移量。我想知道为什么编译器知道程序的具体地址?程序加载进内存时地址不是固定的,标号如何知道每次程序加载进内存后的地址?
...全文
923 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2016-01-14
  • 打赏
  • 举报
回复
jmp far ptr 这样的指令,是指 dos16 模式下的吧,对 win32 来说普通软件里不会有的。
dos16 下,加载地址的不同,是指起始段址的不同,程序完结后,偏移就是固定的了,所以,jmp far ptr 里,偏移部分是确定的,段址就需要重定位;在最后的代码里,段址部分是相对程序开头的段偏移,这样在进行修正时,只要对需要修正的项加上程序载入的起始段址就可以了。
keesss 2016-01-13
  • 打赏
  • 举报
回复
你的意思是涉及到这种转移指令的时候编译器并没有贴上实际地址,而是运行的时候让操作系统填入吗?
zara 2016-01-13
  • 打赏
  • 举报
回复
重定位项,就是解决这个问题的吧,这类需要根据加载地址进行修正的地方,在 exe 文件里有个专门空间存放的,载入程序后会根据载入的地址对涉及到的地方相应的修正。

21,459

社区成员

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

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