对leal感到困惑。它是不是也访问内存地址的内容?

Posted

技术标签:

【中文标题】对leal感到困惑。它是不是也访问内存地址的内容?【英文标题】:Confused about leal. Does it access the contents of a memory address, too?对leal感到困惑。它是否也访问内存地址的内容? 【发布时间】:2014-09-30 02:15:31 【问题描述】:

32 位,AT&T/GAS 语法

有时我对存储到寄存器中的内容有点困惑。它是一个值还是一个地址?

假设我们函数的开头在它的代码中有这个。

 movl 12(%ebp), %eax //Get i
 leal (%eax,%eax,2), %eax //Compute 3*i

所以 12(%ebp) 不是 i 本身的值。它具有 i 的值在内存中实际所在的地址。所以这意味着 &i 被发送到寄存器 eax。

下一行 莱尔。它实际上是否取消引用 eax 中的地址?

这就是我认为 leal 的作用。这是关于加载地址并将其发送到 %eax 寄存器。

如果我遵循我的定义,它实际上是否将 eax 中的 &i 乘以 2,然后再将其自身相加?所以它是 &i + &i*2?显然这不可能。如果 &i 是 FFFF FFF1 (不可能,但只是一个例子),它将计算一个超出我的内存范围的地址。

这条线不应该是……

  movl (%eax,%eax,2), %eax

它将访问存储在 eax 中的内存位置,并在该内存地址处看到 i 可以等于,例如 5。

 (If you wanted to know the rest of the code, here it is. It's about get an array element's address)
 movl 16(%ebp), %edx //Get j
 sall $2, %edx Compute //j*4
 addl 8(%ebp), %edx //ComputexA+4j
 movl (%edx,%eax,4), %eax //Read fromM[xA+4j+12i]

谢谢。

【问题讨论】:

【参考方案1】:

虽然lea代表“加载有效地址”,但它实际上并不执行加载。相反,它计算内存操作数将引用的地址,并将该值留在目标寄存器中。或许应该叫“计算有效地址”。

在这种情况下,它只是(ab)用于计算 reg + reg * 2,乘以 3。看起来 x3 已从乘以 12 中扣除(我想是数组元素大小)为了使用寻址模式更有效地执行乘法工作。这是 x86 代码中很常见的模式。

【讨论】:

【参考方案2】:

一般来说,助记符参数的含义差异很大。 您应该以不同的方式看待“movl”的论点和 leal 的论点。

movl 12(%ebp), %eax //Get i

movl 表示“将长数据从第一个参数的位置移动到第二个参数的位置”。 12(%ebp) 是内存上的一个位置,上面 12 来自“基本指针”(%ebp)。这也是内存中变量“i”的位置。该分配由编译器确定,编译器在注释中输出该信息。

“#eax”是芯片上名为“ax”的寄存器位置。

为了将这些结合在一起,“movl 12(%ebp)”表示将 &i 处的数据移动到寄存器“ax”。

leal (%eax,%eax,2), %eax //Compute 3*i

leal 表示“对第一个参数进行数学运算并将结果存储到第二个参数的位置”。

(%eax,%eax,2) 表示 ('ax' * 2) + 'ax'。 ('ax' 表示存储在寄存器“ax”中的值)

结果,'ax' 的值乘以 3。 "ax" 的值为 i,所以 'ax' 在 leal 执行后变为 i*3 的值。

【讨论】:

以上是关于对leal感到困惑。它是不是也访问内存地址的内容?的主要内容,如果未能解决你的问题,请参考以下文章

对删除分配给结构数组的动态内存感到困惑

对访问数组中的可变字典感到困惑

对 Android TV 应用与其他设备的兼容性感到困惑

算术和逻辑操作

对课堂上的会员访问火车感到困惑?

持久和瞬态对象 - 对术语感到困惑