2014-09-30 41 views
0

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] 

谢谢。

回答

0

助记符参数的含义差别很大。 你应该考虑“movl”的参数和leal的参数。

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

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

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

为了将这些结合在一起,“movl 12(%ebp)”意思是移动数据&我注册“ax”。

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

leal表示“对第一个参数进行数学运算并将结果存储到第二个参数的位置”。 (%ax,* 2)+'ax'。 ('ax'表示存储在寄存器“ax”中的值)

结果,'ax'的值乘以3. “ax”的值为i,所以'ax'成为值i *执行leal后3。

1

尽管lea代表“加载有效地址”,但它并不实际执行加载。它会计算内存操作数将引用的地址,并将该值留在目标寄存器中。也许它应该被称为“计算有效地址”。

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