【问题标题】:C Pointers & AT&T Movl SyntaxC 指针和 AT&T Movl 语法
【发布时间】: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 ecxPointers in Assembly 几乎相同,但老实说,我没有阅读这些内容,因为我不想从帖子中了解答案,我想学习如何去做并检查我的工作反对他们。

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

【问题讨论】:

  • 在第二种情况下,ebx 被视为一个地址。在C 中将是int32_t *ebx; *ebx = eax
  • 要记住两件事:汇编程序中没有与 C 中相同的“类型”。第二件事是指针是其值是指向值的地址的东西。如果你不是很明白(%ebx)这个语法的真正含义,你需要先更好地学习汇编。
  • @BuellaGábor 那真的是 *ebx = eax 吗? eax 不是设置的值吗?
  • @JoachimPileborg - 我同意我真的需要更好地学习组装。这就是我正在上的这门课,这就是我在这里发帖寻求更多帮助的原因:)
  • @ElliottPost 我一般不使用汇编,所以我不记得哪个语法有什么顺序等等。无论如何,重点是,(%ebx) 表示寻址内存,所以如果%ebx == 76 然后(%ebx) 表示在 RAM 中的地址 76 处获取/设置值

标签: c pointers assembly att


【解决方案1】:

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 位那个地址的号码。

【讨论】:

  • 一个通用的问题来检查我的理解:如果 ebx = 0x00FF,那么 movl (%ebx), %eax,找到内存位置 0x00FF 的值并将其放入 %eax?因此,在本例中,有效地址是 0x00FF?
  • 是的,没错。 0x00ff 处的字节进入 %eax 的最低 8 位。 0x0100 处的字节进入 %eax 的第二低 8 位,依此类推,共四个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2021-11-25
  • 2020-08-01
  • 1970-01-01
  • 2021-03-28
  • 2014-03-25
相关资源
最近更新 更多