AT& T汇编中的算术运算(添加存储器和寄存器)

时间:2014-12-18 08:29:15

标签: c assembly cpu-registers

我无法理解添加两个值的行为,一个在寄存器中,一个在内存中。

假设我们有记忆:

Address   Value
0x100     0xFF

假设寄存器,我们有:

 Register    Value
 %eax        0x100
 %ecx        0x1

现在我的不确定性是当你使用(%eax)作为操作数时,你所做的是引用该地址的内存,即你将得到值0xFF,即

(%eax) = 0xFF

但是当(%eax)是加法或减法的目的地时,引用(%eax)会返回内存中的地址而不是引用内存(类似于lea行为),即

addl %ecx, (%eax)    

将0x1 + 0xFF写入0x100。令我困惑的是,当我们读取执行添加的值(%eax)时,我们返回0xFF,但是当我们使用(%eax)作为添加的destiation时,我们写入0x100。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

  

当我们读取执行加法(%eax)的值时,我们返回0xFF,但当我们使用(%eax)作为加法的时候,我们写入0x100。   有人可以解释一下吗?

在这两种情况下,使用(%eax)作为操作数意味着在%eax中包含的地址处引用内存。示例中的地址为0x100,该地址的双字包含值0xFF。

如果您进行阅读 - 例如movl (%eax),%ecx - 您只需获取0x100处的值,即可获得0xFF

如果执行addl %ecx,(%eax),则首先从内存地址0x100(即值0xFF)读取,将%ecx(1)的值添加到其中以获取值0x100,然后写入结果返回到您从(0x100)读取的相同地址。请注意,%eax的值在此操作期间永远不会更改;它只是由%eax改变的指向的值。