【发布时间】:2020-08-01 21:31:20
【问题描述】:
有人告诉我 lea %rax, %rdx 是无效语法,因为源代码需要放在括号中,即 lea (%rax), %rdx
我想我显然误解了 lea 和括号的用途。
我以为 lea %rax, %rdx 会将存储在 %rax, 中的内存地址移动到 %rdx,但显然这就是 lea (%rax), %rdx 的作用?
让我感到困惑的是,我认为括号表示转到内存中的某个地址,并获取该地址的值。因此,通过使用方括号 lea 会将值从存储在 %rax 中的内存地址移动到目标寄存器中。
因此,如果您只是想将存储在 %rax 中的地址移动到 %rdx 中,我认为会使用 lea %rax, %rdx
在 lea 指令的情况下,有人可以向我解释括号的意义吗?
【问题讨论】:
-
这也让我作为初学者感到困惑。它基本上只是在说“将其视为间接内存访问,具有相同的计算和约束,但最后不要取消引用它,只需给我最终地址”。但是因为除了实际访问之外,它的处理方式与间接访问相同,因此它具有相同的语法。
-
lea对于偏移量和乘数更有用。lea (%rax), %rdx与mov %rax, %rdx没有什么不同。但是你也可以做类似lea (%rdx, %rdx, 4), %rax这样的事情,它本质上是rax = rdx + rdx * 4,即rax = rdx * 5,你不能用一个mov来做。这种算术用法(而不涉及任何实际内存地址)本质上是间接寻址模式允许的(有限)数学运算的副产品。 -
@CherryDT 我明白了,谢谢,所以括号只是表示我们将其视为间接内存地址,而不是内存中的值?
-
是的,它基本上做了
mov (...)会做的所有事情,除了实际读取内存地址内容的最后一步。
标签: assembly x86-64 att instruction-set