问个关于jmp相对位移转移的问题

Gwanwlw 2013-11-25 02:46:33
我们都知道:
“jmp short/near 标号 ”是依据位移进行的转移,编译程序在编译时会算出8/16位的位移;
而 “jmp far ptr 标号” 是直接根据标号处的段选择符和偏移地址对CS和IP修改

----------
问题来了:

编译程序在对 ”jmp short/near标号“算相对位移时肯定也要知道“标号”处的段选择符和偏移地址,先作减法得出位移,然后又加上位移,,这这不是多此一举么????

还不如直接像“jmp far ptr 标号“那样标号处的段选择符和偏移地址对CS和IP修改,我怎么觉得“jmp far ptr 标号”在一定程度上完全可以代替jmp short/near 标号 ”????

王爽汇编书上说相对位移是为了方便程序段在内存中的浮动装配,但我感觉用jmp far ptr也可以实现啊,,??

----------


...全文
178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gwanwlw 2013-11-25
  • 打赏
  • 举报
回复
引用 5 楼 zara 的回复:
引用
这样经过取得标号偏址,减,加三个步骤下来是不是效率上还不如jmp far那样直接取得偏址,将偏址赋给IP呢?
你说的前两个操作,是编译阶段进行的,在程序运行时,只需要进行最后一个操作,然后置 ip ;对段间转移来说,则一般是要通过访问内存来设置 ip 和 cs 两个项,复杂度和性能上要逊 short/near 不少。
嗯 领教了
zara 2013-11-25
  • 打赏
  • 举报
回复
引用
这样经过取得标号偏址,减,加三个步骤下来是不是效率上还不如jmp far那样直接取得偏址,将偏址赋给IP呢?
你说的前两个操作,是编译阶段进行的,在程序运行时,只需要进行最后一个操作,然后置 ip ;对段间转移来说,则一般是要通过访问内存来设置 ip 和 cs 两个项,复杂度和性能上要逊 short/near 不少。
Gwanwlw 2013-11-25
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
“jmp short/near 标号 ”指令编码短,而且执行速度快。 “jmp far ptr 标号” 指令编码长,速度慢,在保护模式下要进行权限检查。
谢谢 哦 ,好像懂了,,原来是效率的问题 short/near 的位移顶多2字节 而far的段址偏址部分要4个字节 那保护模式下要进行权限检查是什么回事了??
Gwanwlw 2013-11-25
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
只有同一段内的才能进行 short/near 类的转移,所以计算偏移只需要知道“标号”处的偏址,只就偏址进行计算,不考虑段;段只在是否适用上做个判定。
谢谢! short/near在计算位移时是将标号偏址 减去 jmp下一句的偏址, 然后将当前偏址 加上 前面计算的位移, 这样经过取得标号偏址,减,加三个步骤下来是不是效率上还不如jmp far那样直接取得偏址,将偏址赋给IP呢?
  • 打赏
  • 举报
回复
“jmp short/near 标号 ”指令编码短,而且执行速度快。 “jmp far ptr 标号” 指令编码长,速度慢,在保护模式下要进行权限检查。
zara 2013-11-25
  • 打赏
  • 举报
回复
只有同一段内的才能进行 short/near 类的转移,所以计算偏移只需要知道“标号”处的偏址,只就偏址进行计算,不考虑段;段只在是否适用上做个判定。

21,459

社区成员

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

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