【问题标题】:What's the difference between 0(%eax) and (%eax)?0(%eax) 和 (%eax) 有什么区别?
【发布时间】:2017-05-17 20:35:04
【问题描述】:

如果eax中有一个char数组的地址,0(%eax)和(%eax)有什么区别?还是一样,都是指数组的第一个元素?

【问题讨论】:

  • 当您组装然后拆卸它们时,您发现它们有什么不同吗?
  • 想想0(%eax)是什么意思。这意味着与 eax 中的值有 0 的偏移量。现在,(%eax) 是什么意思?表示eax 中的值。所以只要x == x + 0,不,显然没有区别。
  • 如果您在反汇编程序输出中看到类似0(%eax) 的内容(而不是汇编源代码),那么 0 可能是重定位的目标,当目标文件发生时会更改它的其他值已链接。

标签: assembly x86 cpu-registers att


【解决方案1】:

它们完全一样。您可以通过组装然后反汇编这两个指令来轻松证明这一点:

movl (%eax),%edx
movl 0(%eax),%edx
Disassembly of section .text:

0000000000000000 <.text>:
   0:   67 8b 10                mov    (%eax),%edx
   3:   67 8b 10                mov    (%eax),%edx

请注意,它们的字节编码完全相同。

【讨论】:

    【解决方案2】:

    它们是一样的。

    假设您已正确设置 eax 以指向数组中第一个元素的地址,则可以使用 movb 将一个字节的数据放入数组中。

    【讨论】:

    • MOVB 和这里有什么关系?如果只是一个随机的例子,那就特别令人困惑,因为你不能将MOVBEAX一起使用,如问题所示;需要一个字节大小的寄存器。也许一个更好的例子是MOVZBL?或者只是 MOVL 来存储一个 DWORD 大小的值。
    • 这个问题是关于 eax 中的 char 数组,所以访问数组的元素需要一个 movb。即:movb $32, 0(%eax)
    猜你喜欢
    • 2017-01-26
    • 2017-05-05
    • 1970-01-01
    • 2013-09-10
    • 2011-02-11
    • 2016-05-29
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多