gpt4 book ai didi

assembly - 在 x86-64 AT&T 汇编中,地址前面的星号 * 意味着什么?

转载 作者:行者123 更新时间:2023-12-01 17:59:41 43 4
gpt4 key购买 nike

下面这行是什么意思:

...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...

内存地址前面的星号是什么意思?另外,当内存访问方法缺少第一个寄存器值时,这意味着什么?

通常它类似于 ("%register", %rax, 8),但在这种情况下它没有第一个寄存器。

有什么建议吗?

最佳答案

这是 AT&T 汇编语法:

  • 来源先于目的地
  • 助记符后缀表示操作数的大小(q 表示四元组等)
  • 寄存器以 % 为前缀,立即数以 $ 为前缀
  • 有效地址的格式为DISP(BASE, INDEX, SCALE) (DISP + BASE + INDEX * SCALE)
  • 间接跳转/调用操作数用 * 表示(与直接相反)。

因此,您有一个 jmpq 用于跳转到存储在 %rax * 8 + 0x402680 中的绝对地址,并且是一个四字长。

<小时/>

AT&T 语法需要一种方法来区分 RIP = foo (jmp foo) 和 RIP = 从某个符号地址加载 (jmp *foo)。请记住,movl $1, foo 是对绝对地址 foo 的存储。

使用其他寻址模式,您正在执行的跳转/调用类型之间没有歧义,除了裸标签之外的任何内容都必须是间接的。 (如果您执行 jmp %raxjmp 24(%rax) 或任何其他操作,GAS 会推断出这一点,并警告没有 * 的间接跳转而不是纯粹的符号名称。)

(在 64 位模式下,您通常实际上使用 jmp *foo(%rip) 将全局变量加载到 RIP 中,而不是使用像 jmp 这样的 32 位绝对地址*foo。但是这种可能性是存在的,在 x86-64 之前设计 AT&T 语法时,这是正常的处理方式。)

关于assembly - 在 x86-64 AT&T 汇编中,地址前面的星号 * 意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9223756/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com