我无法理解添加两个值的行为,一个在寄存器中,一个在内存中。
假设我们有记忆:
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。
有人可以解释一下吗?
答案 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
改变的指向的值。