assembly x86-64和远调用/跳转

wooyq4lh  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

快速总结:在x86-64模式下,远跳转是否和x86-32模式一样慢?
在x86处理器上,跳转分为三种类型:

  • 短,PC偏移为+/-127字节(2字节指令)
  • near,带有+/-32 k偏移量,“滚动”当前段(3字节指令)
  • far,可以跳到任何地方(5字节指令)

短跳和近跳需要1-2个时钟周期,而远跳需要50-80个时钟周期,这取决于处理器。从我阅读的文档来看,这是因为它们“走到CS之外,即当前代码段”。
在x86-64模式下,不使用代码段--代码段实际上总是0... infinity。因此,不应该因为超出代码段而受到惩罚。
因此,问题是:如果处理器处于x86-64模式,时钟周期数是否会因远跳而改变?
相关奖金问题:大多数运行在32位保护模式下的类 * nix操作系统显式地将段大小设置为0. infinity,并完全通过页表管理线性->物理转换。它们是否从远调用时间(更少的时钟周期)方面获得了好处,或者从8086开始就存在的段寄存器大小的内部CPU遗留问题?

lmyy7pcs

lmyy7pcs1#

CS不仅用于基础和限制,还用于权限。CPL在那里编码,以及其他字段,例如:

  • D位- 32位或16位默认段大小
  • L位-为段选择兼容性或64位模式(在这种情况下,基数和限制是重要的)

远跳转也可以通过任务门,远调用也可以通过调用门。所有这些都必须处理,不管64位模式如何。
综上所述,在64位模式下的远跳转并不比在32位模式下快,事实上,考虑到当64位模式被启用时,段描述符是64位模式被禁用时的两倍大,所有的字节表访问被加倍,这可能会延长跳转的时间。

相关问题