为什么 AT&T 语法中括号会根据上下文执行不同的操作?

问题描述 投票:0回答:1

我正在上一门关于装配的课程。我和一些朋友正在争论

%rdi
(%rdi)
在以下情况下有什么区别:

假设 RDI 以 ASCII 形式保存字符值

'w'
。据我所知,如果我们执行 %rdi,我们将处理值
'w'
本身,而如果我们执行
(%rdi)
,我们将处理
'w'
指向的值(或更具体地说) ,编号为
'w'
的ASCII码地址处的值,即绝对地址
0x0000000000000077
)。

类似地,如果 RDI 持有值

0x1007bf
,我相信
%rdi
为我们提供数值
0x1007bf
本身,而
(%rdi)
为我们提供地址
0x1007bf
处的值...

正确的解释是什么?

注意:所有这些都在 mov 和 cmp 函数的上下文中

assembly x86-64 att mov cmp
1个回答
0
投票

你基本上是正确的,

%rdi
寄存器直接寻址模式,而
(%rdi)
寄存器间接,不过让我们注意两件事:

  1. 源与目标:两种形式,

    %rdi
    (%rdi)
    都可以出现在源或目标位置(或源/目标),因此这意味着读与写(与先读后写)。 (所以你所说的对于阅读来说是准确的。)

  2. %rdi
    单独指定 64 位操作数/操作,因为它是 64 位寄存器。而
    (%rdi)
    指定有效地址,但不指定操作数大小(它指定使用 64 位寄存器进行解引用,例如与
    (%edi)
    形成对比,它表示使用 32 位寄存器进行解引用),但它的大小位于该内存地址的项仅凭此未指定,我们需要知道更大的上下文(操作码或其他操作数)来了解内存访问的大小,无论是字节、字、双字还是qword。

© www.soinside.com 2019 - 2024. All rights reserved.