C指针& AT& T Movl语法

时间:2014-03-23 18:57:39

标签: c pointers assembly att

我试图理解AT& T汇编语言中这两个命令之间的区别。

movl    %edx, %eax
movl    (%ebx), %eax

我知道第一个命令采用%edx中的值并将该值放在%eax中。 我的理解是,第二个是......与指针有关的东西。但不会ebx%ebx是地址,它包含的值是该地址的值吗?

我查了很多不同的教程,wiki文章,powerpoint和堆栈溢出帖子,但我找不到任何能够清楚解释它的人。我见过的最好的是http://www.scs.stanford.edu/nyu/04fa/notes/l2.pdf

他们给出了例子

movl    %edx, %eax    //edx = eax
movl    (%ebx), %eax  //edx = *((int32_t*) ebx)

这证实了我对第一个是正确的,但第二个是将ebx强制转换为指针或..?这是课堂作业的一部分,我在搜索现有问题时偶然遇到了答案。作业几乎与C, Assembly : understanding the switch condition, edx eax ecxPointers in Assembly相同,但说实话,我没有读过这些作品,因为我不想从帖子中了解答案,我想学习怎么做,并检查我的工作对他们。

谢谢,如果你能提供帮助!!

1 个答案:

答案 0 :(得分:3)

http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

ATT语法在目标之前使用source,所以

movl %edx, %eax

相当于

eax = edx

更复杂的例子

movl (%ebx), %eax

相当于

eax = *((int32 *) ebx;

int32的原因是指令末尾有l字母(小写字母L)。不同的字母指定不同的类型,但l指定带符号的32位数字。 (%ebx)周围的括号表示正在指定有效地址。有效地址只有一个必需元素(BASE地址)和3个可选元素。在您的示例中,仅提供了必需的基址。当给出带有效地址的指令时,地址计算如下

address = base + index * scale + displacement

在语句的C版本中,将ebx转换为(int32 *)会将ebx中的值转换为指向有效地址处的int32的指针,然后取消引用指针读取该地址的32位数字。