汇编代码“lea”指令输入。Lea (,reg1,reg2) [重复]

Assembly code "lea" instruction inputs. lea (,reg1,reg2) [duplicate]

提问人:Zayed Aldhaheri 提问时间:11/15/2023 最后编辑:Peter CordesZayed Aldhaheri 更新时间:11/15/2023 访问量:70

问:

lea 指令有一些让我感到困惑的情况。 例如,“leaq (,%rsi, %rdi), %rdx”,我认为它的意思是“rdx = rdi * rsi”。 从公式中,我得到的是“lea D(Rb,Ri,S) = D + Rb + S*Ri”。在本例中,Rb 为 null,Ri 为 rsi,S 为 rdi。

我相信“leaq (,%rsi, %rdi), %rdx”的答案是以下选项之一: “rdx = rsi + rdi” 或 “RDX = RSI * RDI”。

我从教授的讲座中了解到,lea 最多可以有 3 个论点。我们将寄存器相加,如果有一个刻度(在最后一个参数处),我们将其乘以最后一个寄存器参数。我只需要澄清一下。

TL;博士 “Leaq (,%RSI,%RDI), %RDX” 算术是什么意思?

C 程序集 x86-64 寻址模式

评论

4赞 fuz 11/15/2023
leaq (, %rsi, %rdi), %rdx是语法错误。第三个成员必须是 1、2、4 或 8 之一。也可以省略它,其行为就像是 1 一样。
1赞 Erik Eidt 11/15/2023
S 是一个比例因子,它不是寄存器,而是一个小整数常数。
2赞 Peter Cordes 11/15/2023
你的例子是CS:APP全球版的练习题吗?如果是这样,那么请看我正确地猜到了函数的缺失部分,但 gcc 生成的汇编代码与此 LEA 错误的另一个情况的答案不匹配,并且 CS:APP 示例使用带有两个操作数的 idivq? 有关详细信息 - 发布者雇用了不称职的人来弥补新问题,他们只是编造了无效的 x86-64 汇编。在机器代码中,组件被编码为 2 位移位计数。S
2赞 fuz 11/15/2023
@ZayedAldhaheri我建议你尝试用这些案例组装代码,如果它组装了,就拆开它,看看它的结果是什么。 不是语法错误,但会造成混淆,即没有索引寄存器。避免使用这种表示法。(reg1, S)(reg1, , S)
1赞 Zayed Aldhaheri 11/15/2023
@PeterCordes是的,我刚刚查了一下,这是CS:APP第三版全球版。

答: 暂无答案