28

对不起,我对 x86 组装和一般组装都是全新的。

所以我的问题是,我有类似的东西:

addl %edx,(%eax)

%eax 是一个寄存器,它保存一个指向某个整数的指针。我们称它为 xp

这是否意味着它在说:*xp = *xp + %edx?(%edx是一个整数)

我只是对 addl 将结果存储在哪里感到困惑。如果%eax是指向 int 的指针,则(%eax)应该是该 int 的实际值。那么会addl存储%edx+(%eax)in的结果*xp吗?我真的很想有人向我解释这个!

我真的很感激任何帮助!

4

1 回答 1

51

是的,这条指令正在做你认为它正在做的事情。

大多数 x86 算术指令采用两个操作数:源和目标。在 AT&T 语法(此处使用)中,目标始终是正确的操作数。因此,使用如下指令:

addl %edx, %eax

edx和中的值eax相加,结果存储在eax. 但是,在您的示例中,(%eax)是一个内存操作数;这就是 AT&T 语法中括号的含义(就像 NASM 语法中的方括号)。

这意味着将eax视为指针,因此从 指向的地址中取出右操作数eax,并将结果存储到同一地址。

于 2009-10-24T21:15:23.217 回答