对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感到困惑。它是不是也访问内存地址的内容?的主要内容,如果未能解决你的问题,请参考以下文章