我试图理解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 ecx和Pointers in Assembly相同,但说实话,我没有读过这些作品,因为我不想从帖子中了解答案,我想学习怎么做,并检查我的工作对他们。
谢谢,如果你能提供帮助!!
答案 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位数字。