【发布时间】:2014-03-23 18:57:38
【问题描述】:
我正在尝试了解 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 : understanding the switch condition, edx eax ecx 和Pointers in Assembly 几乎相同,但老实说,我没有阅读这些内容,因为我不想从帖子中了解答案,我想学习如何去做并检查我的工作反对他们。
如果您能提供帮助,谢谢!
【问题讨论】:
-
在第二种情况下,ebx 被视为一个地址。在
C中将是int32_t *ebx; *ebx = eax -
要记住两件事:汇编程序中没有与 C 中相同的“类型”。第二件事是指针是其值是指向值的地址的东西。如果你不是很明白
(%ebx)这个语法的真正含义,你需要先更好地学习汇编。 -
@BuellaGábor 那真的是 *ebx = eax 吗? eax 不是设置的值吗?
-
@JoachimPileborg - 我同意我真的需要更好地学习组装。这就是我正在上的这门课,这就是我在这里发帖寻求更多帮助的原因:)
-
@ElliottPost 我一般不使用汇编,所以我不记得哪个语法有什么顺序等等。无论如何,重点是,
(%ebx)表示寻址内存,所以如果%ebx == 76然后(%ebx)表示在 RAM 中的地址76处获取/设置值