[英]C Pointers & AT&T Movl Syntax
我试图了解AT&T汇编语言中这两个命令之间的区别。
movl %edx, %eax
movl (%ebx), %eax
我知道第一个命令将值放入%edx,并将该值放入%eax。 我的理解是第二个是与指针有关的东西。 但是%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相同:了解开关条件,edx eax ecx和Assembly中的Pointers ,但是说实话,我没有阅读这些内容,因为我不想从帖子中了解答案,我想学习如何做,并对照他们检查我的工作。
谢谢您的帮助!
http://en.wikipedia.org/wiki/X86_assembly_language#Syntax
ATT语法在目标之前使用源
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位数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.