x86汇编中的mov指令

19

根据我所阅读的关于 mov 的资料,它会将第二个参数复制到第一个参数中。那么这段代码是做什么用的呢?

movl    8(%ebp),    %edx

它将 ebp 偏移量为 +8 的参数内容复制到了函数的第一个参数(因为 +8 是第一个参数的偏移量)?

我觉得这实际上意味着将第一个参数移动到了 edx 寄存器中,但是我在维基百科上读到的是相反的说法?

1个回答

30
movl 8(%ebp), %edx

这里使用的是“AT&T语法”,在此语法中,源地址在前,目标地址在后。因此,您的想法是正确的。大多数文档使用“Intel语法”,其顺序相反。这对于新手来说是一个很大的困惑点。

在Intel语法中,您的指令将被写成:

mov edx, [ebp + 8]

请注意,在寄存器名称前没有%,而是使用方括号代替圆括号表示地址,并且指令后缀中没有l。这些都是判断您正在查看哪种汇编形式的明显特征。

有两种不同汇编语言方言的原因是什么?正如您所指出的,这可能是新手常见的困惑之源,因为它们使用完全不同的约定。 - greatwolf
@Victor T.:Intel语法是Intel最初指定的;AT&T语法是贝尔实验室汇编语法的一种适应多个平台使用的改编版本。 - Stephen Canon
@Stephen: Intel Synax 有一个错误。应该是 mov [ebp + 8], edx :) - Ilya Matveychikov
2
@Ilya:那应该是一个存储,而不是一个加载。在Intel语法中,参数顺序与AT&T语法相反。 - Stephen Canon
请原谅我,同样的 movl 8(%ebp), %edx,操作员说它将第二个参数复制到第一个参数中,因此是 1 <- 2,但这里说 '在这种语法中,源先于目标',所以是 1 -> 2,然后 所以,是的,你的想法是正确的,现在完全困惑了。 - http8086

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接