【问题标题】:Arithmetic operations in AT&T assembly (adding memory and a register)AT&T 汇编中的算术运算(添加内存和寄存器)
【发布时间】: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 时您没有在任何地方写信。 addregisters 进行操作,获取src 的值并将其添加到target 寄存器。您的困惑来自0xFF + 0x1 = 0x100.您有一个0x100内存地址,并且您有一个等于0x100加法结果,但就任何写而言,两者都不相关 担心。我希望这比泥浆更清晰。在汇编中,您将值加载到寄存器中并使用add 对它们进行操作。您使用movsstos 编写并使用mov 移动值。

标签: c assembly cpu-registers


【解决方案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 指向的值发生了变化。

【讨论】:

  • 我想知道是谁给他设置了这个问题。那肯定是一个有害的地址选择。
  • 现在绝对有意义,基本上当我阅读它时,我会得到内容,当我写它时,我会替换内容。就地址而言,它指向同一个位置,只是内容发生了变化。谢谢。
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2015-11-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多