4-argument Lea 不带碱基
Posted
技术标签:
【中文标题】4-argument Lea 不带碱基【英文标题】:4-argument Lea with the base left out 【发布时间】:2021-07-27 08:23:13 【问题描述】:看在我的份上,我无法弄清楚这一点。
我会假设指令
lea 0x0(,%rcx,4),%esi
表示“将 %esi 设置为 %rcx 乘以 4 的结果”。 但事实并非如此。那么这是什么意思呢?首先很奇怪 偏移量是 0x0 并且没有使用 mul 代替...
编辑: 我认为某些东西被隐含地用作基础。但我不知道是什么。
【问题讨论】:
0 用作基础。它是 0+[0+rcx*4] 。是什么让你不这么认为。您从 ESI 获得什么价值?指令执行前RCX的值是多少? “将 %esi 设置为 %rcx 乘以 4 的结果”——这正是这条指令的作用。会不会是还没填的搬迁? 看我的回答:)。 【参考方案1】:这是我的错。我忽略了目的地被标记为 32 位的事实。 这意味着如果乘法的结果高于此,它将被截断。
因此,如果您有一些长值,例如 2400923063, 2400923063*4=0x23c6cb6dc,但最后半字节将被截断,您将得到 0x3c6cb6dc 作为结果 (1013757660)。
【讨论】:
是的,最终结果只是简单的左移 2。使用lea
而不是 shl
的原因是非破坏性地将结果放入另一个寄存器而不是修改 ECX . (在您的问题中,您说“奇怪的是没有使用 mul”,但是对于 2 的幂,这将是疯狂的,除非您正在优化代码大小而不是速度,那么是的 imul $4, %ecx, %esi
可能会更多比mov
+ shl
.Using LEA on values that aren't addresses / pointers? / Efficient Assembly multiplication更紧凑以上是关于4-argument Lea 不带碱基的主要内容,如果未能解决你的问题,请参考以下文章