下面这行是什么意思:
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
内存地址前面的星号是什么意思?
另外,当内存访问方法缺少第一个寄存器值时,这意味着什么?
通常它类似于 ("%register", %rax, 8),但在这种情况下它没有第一个寄存器。
有小费吗?
它是 AT&T 汇编语法:
- 来源先于目的地
- 助记符后缀表示操作数的大小(
q
用于四轮车等)
- 寄存器前缀为
%
和立即值$
- 有效地址的形式为
DISP(BASE, INDEX, SCALE)
(显示 + 基数 + 索引 * 比例)
- 间接跳转/调用操作数用
*
(与直接相对)。
所以,你有一个jmpq
用于跳转到存储在的绝对地址%rax * 8 + 0x402680
,并且是一个四字长。
AT&T 语法需要一种方法来区分 RIP = foo (jmp foo
) from RIP = 从某个符号地址加载 (jmp *foo
)。请记住movl $1, foo
是存储到绝对地址foo
.
对于其他寻址模式,您正在执行的跳转/调用类型之间没有歧义,除了裸标签之外的任何内容都必须是间接的。 (GAS 将推断这一点并警告间接跳跃,而无需*
如果你这样做jmp %rax
or jmp 24(%rax)
或除裸符号名称之外的任何名称。)
(在 64 位模式下,您通常会实际使用jmp *foo(%rip)
将全局变量加载到 RIP 中,不要使用 32 位绝对地址,例如jmp *foo
。但这种可能性是存在的,在 x86-64 之前,当 AT&T 语法设计时,这是正常的处理方式。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)