【问题标题】:Addresses in assembly code and "lea"汇编代码和“lea”中的地址
【发布时间】:2012-04-22 00:08:18
【问题描述】:

如果我说:

lea (%eax,%eax,2), %edx

我被教导它本质上意味着:

edx = eax + eax * 2

这个格式是如何工作的?

我猜这会引出第二个问题。如果我有这样的事情:

add -0x4(%esi, %ebx, 4), %eax

我知道第一个操作数被添加到第二个操作数然后存储在第二个操作数中,但是我不明白的是第一个操作数的符号。另一个例子是如果我有:

cmp %eax, (%esi, %ebx, 4)

...,这是否意味着正在将 %eax 的值与以下值进行比较:

esi + ebx * 4

...?我尝试搜索了很多这样的东西,但我想我没有使用正确的词来找到有意义的答案,所以我决定在这里发帖。

【问题讨论】:

  • 您的行是“AT&T 汇编器语法”,正如 Gnu 汇编器 (GAS) 使用的那样。网上有一些手册。

标签: assembly x86 addressing-mode


【解决方案1】:

使用lea 计算值让人想起此操作更快(因为它是由执行地址计算的电路计算的)或代码大小更小。请注意,只需一个操作,您就可以在一步中进行加法和乘法运算。当前的处理器可能会更快地执行此操作,而不是 add 后跟 mul,但考虑到推测执行、算术单元复制等,尚不清楚。

对于以下说明,只要您看到括号,就表示您正在取消引用该地址,因此:

add -0x4(%esi, %ebx, 4), %eax

表示将%eax的内容放入-4 + esi + ebx*4给出的地址中,因此它意味着访问内存中的该位置并将存储在那里的内容分配给%eax。

【讨论】:

  • 我怀疑比例因子曾经被实现为乘法,它可能只是左移。
  • 谢谢!我想我在取消引用时对“公式”感到困惑。
  • 你有一个错字:它是-4,而不是+4。
  • @Gabriel 是的,你是对的。这是一个转变。我的汇编器生锈了,但就是这样。如果编译器(或您)可以设法以这种方式安排计算,则将两个操作合二为一。凯:哎呀,你是对的。由 Bo Persson 编辑。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多