【问题标题】:4-argument Lea with the base left out4-argument Lea 不带碱基
【发布时间】: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 的结果”——这正是这条指令的作用。会不会是还没填的搬迁?
  • 看我的回答:)。

标签: assembly x86 gdb att


【解决方案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更紧凑
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2019-10-12
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多