我正在上一门关于装配的课程。我和一些朋友正在争论
%rdi
和 (%rdi)
在以下情况下有什么区别:
假设 RDI 以 ASCII 形式保存字符值
'w'
。据我所知,如果我们执行 %rdi,我们将处理值 'w'
本身,而如果我们执行 (%rdi)
,我们将处理 'w'
指向的值(或更具体地说) ,编号为'w'
的ASCII码地址处的值,即绝对地址0x0000000000000077
)。
类似地,如果 RDI 持有值
0x1007bf
,我相信 %rdi
为我们提供数值 0x1007bf
本身,而 (%rdi)
为我们提供地址 0x1007bf
处的值...
正确的解释是什么?
注意:所有这些都在 mov 和 cmp 函数的上下文中
你基本上是正确的,
%rdi
是寄存器直接寻址模式,而(%rdi)
是寄存器间接,不过让我们注意两件事:
源与目标:两种形式,
%rdi
和(%rdi)
都可以出现在源或目标位置(或源/目标),因此这意味着读与写(与先读后写)。 (所以你所说的对于阅读来说是准确的。)
%rdi
单独指定 64 位操作数/操作,因为它是 64 位寄存器。而 (%rdi)
指定有效地址,但不指定操作数大小(它指定使用 64 位寄存器进行解引用,例如与 (%edi)
形成对比,它表示使用 32 位寄存器进行解引用),但它的大小位于该内存地址的项仅凭此未指定,我们需要知道更大的上下文(操作码或其他操作数)来了解内存访问的大小,无论是字节、字、双字还是qword。