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

标签 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) 作为加法的目的地时,我们写入 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/

相关文章:

c - 为什么 x86 的 INC 指令不是原子的?

assembly - 为什么RV32I包含ADDI和XORI等指令而不包含BLTI?

c++ - 编译器将 cpu 寄存器中的这种结构传递给函数是否有意义?

c - 8051 中外部中断的质数例程

c - 我怎样才能找到我的系统使用 C 的 RAM 总量

c - 访问目录和文件

C/汇编子程序段错误

c++ - 如何使用 6502 的相应枚举存储处理器状态标志的值

c++ - 整数和寄存器大小之间有关系吗?

似乎无法将 %ES 添加到 clobberlist(内联汇编、GCC)