2017-05-17 287 views
-3

如果在eax中有一个char数组的地址,那么0(%eax)和(%eax)之间的区别是什么?或者它们是相同的,都是指数组中的第一个元素?0(%eax)和(%eax)有什么区别?

+5

当你组装好然后拆开它们你有没有看到差异? –

+0

想想'0(%eax)'是什么意思。这意味着与'eax'中的值有0的偏移量。现在,'(%eax)'是什么意思?它意味着'eax'中的值。所以只要'x == x + 0',否,显然没有区别。 –

+0

如果您在反汇编程序输出中看到类似'0(%eax)'的东西(与汇编源代码相反),那么0可能是重定位的目标,当链接目标文件时,它会改变它的某个其他值。 –

回答

0

它们是一样的。

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

+0

'MOVB'与这里的任何东西有什么关系?如果它只是一个随机的例子,那就特别令人困惑,因为你不能在'EAX'中使用'MOVB',如问题所示;需要BYTE大小的寄存器。也许更好的例子是'MOVZBL'?或者只是'MOVL'来存储DWORD大小的值。 –

+0

有人问eax中char数组的问题,所以访问数组的元素将需要一个movb。即:movb $ 32,0(%eax) – lostbard

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 

发现,他们有确切的字节相同的编码。

相关问题