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 跳转指令的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )