【发布时间】:2015-02-16 23:27:10
【问题描述】:
我无法理解添加两个值的行为,一个在寄存器中,一个在内存中。
假设我们有内存:
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。
有人可以解释一下吗?
【问题讨论】:
-
我认为您的断开连接是在使用
add时您没有在任何地方写信。add对registers进行操作,获取src的值并将其添加到target寄存器。您的困惑来自0xFF + 0x1 = 0x100.您有一个0x100的内存地址,并且您有一个等于0x100的加法结果,但就任何写而言,两者都不相关 担心。我希望这比泥浆更清晰。在汇编中,您将值加载到寄存器中并使用add对它们进行操作。您使用movs和stos编写并使用mov移动值。
标签: c assembly cpu-registers