繁体   English   中英

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

[英]Arithmetic operations in AT&T assembly (adding memory and a register)

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

假设内存有:

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。

有人可以解释一下吗?

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

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

如果您进行读取-例如movl (%eax),%ecx您只需在0x100处抓取值,那么您将获得0xFF

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM