我无法理解将两个值相加的行为,一个在寄存器中,一个在内存中。
假设我们有内存:
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) 作为加法的目的地时,我们写入 0x100。
有人可以解释一下吗?
最佳答案
when we read the value to perform the addition
(%eax)
gives us back 0xFF, but when we use(%eax)
as the destiation of addition, we write to 0x100. Can someone explain this please?
在这两种情况下,使用(%eax)
作为操作数意味着引用%eax
中包含的地址处的内存。您示例中的地址是 0x100,该地址处的双字包含值 0xFF。
如果您阅读 - 例如movl (%eax),%ecx
- 您只需获取 0x100 处的值,即可得到 0xFF
。
如果你执行 addl %ecx,(%eax)
你首先从内存地址 0x100 读取(即值 0xFF),添加 %ecx
的值(1 ) 以获取值 0x100,然后将结果写回您从中读取它的相同地址 (0x100)。请注意,%eax
的值在此操作期间永远不会改变;只是%eax
指向的值发生了变化。
关于c - AT&T 汇编中的算术运算(添加内存和寄存器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27542122/