x64 跳转指令

Posted

技术标签:

【中文标题】x64 跳转指令【英文标题】:x64 Jump instructions 【发布时间】:2015-04-11 04:20:13 【问题描述】:

我理解近距离跳转只是带有立即值、寄存器或地址的偏移量。应该有远(绝对地址)跳转与立即值,寄存器或地址太对了吗? far 指令列出了 m16:16、m16:32 和 m16:64,但这些是什么意思?这是 Intel x64 手册的第 853 页。

【问题讨论】:

【参考方案1】:

“远==绝对”并非如此;虽然所有远跳转都是绝对的,但并非所有绝对跳转都是远的(参见 FF /4,调用近绝对,可选间接)。

远跳转是绝对跳转,也写入cs,m16部分进入cs,另一部分是跳转到的地址。远跳的精确语义相当复杂。

所以可能的跳转是:

          near | far
-----------------------
relative | yes |  no
absolute | yes | yes
indirect | yes | yes

【讨论】:

说我要跳转到0x1000,m16我要放什么?? @RyanBrown 什么都没有,如果你只想跳转到 0x1000,那么使用近跳转。跳远适合特殊场合。 近跳转是当前指令的偏移量,对吧?如果我想跳到 0x1000 那不是远(绝对)跳吗?? 你什么时候需要出于好奇而跳远? @RyanBrown 任何时候您需要更改 cs,例如,如果您处于实模式并跳转到其他段中的某些代码,或者当您想要在长模式之间切换时32 位和 64 位子模式,在某些情况下离开环 0(通常这是一个很远的回报,但并非总是如此)

以上是关于x64 跳转指令的主要内容,如果未能解决你的问题,请参考以下文章

比较条件跳转指令

多条件分支跳转指令

lua语言的跳转指令怎么用?

ARM指令集

arm汇编b指令是绝对地址还是相对地址跳转?

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )