32bit,AT & T/GAS语法对leal感到困惑。它也访问内存地址的内容吗?
有时我会对存储到寄存器的内容有些困惑。这是价值还是地址?
假设我们的函数的开头在代码中有这个。
movl 12(%ebp), %eax //Get i
leal (%eax,%eax,2), %eax //Compute 3*i
所以12(%ebp)不是我自己的价值。它具有我的值实际位于内存中的地址。这意味着&我正在发送到寄存器eax。
下一行 Leal。它实际上取消了eax中的地址吗?
这是我认为leal所做的。这是关于加载地址并将其发送到%eax寄存器。
如果我按照我的定义,它是否真的采取我在eax &我乘以2,然后再添加自己?所以它是& i + &我* 2?显然这是不对的。如果&我是FFFF FFF1(不可能,但只是一个例子),它会计算一个超出我的记忆范围的地址。
不应该行......
movl (%eax,%eax,2), %eax
在那里将访问存储在EAX的存储位置,看到那个的内存地址,我可以平等的,说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]
谢谢。