x86-64:为什么括号会根据上下文做不同的事情?

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

我正在上一门关于装配的课程。我和一些朋友正在讨论 %rdi 和 (%rdi) 在以下情况下的区别:

假设 %rdi 以 ascii 形式保存字符值“w”。据我所知,如果我们执行 %rdi,我们将处理值“w”本身,而如果我们执行 (%rdi),我们将处理“w”指向的值(或更多)具体来说,地址处的值编号为 'w' 的 ascii 代码)。

类似地,如果 %rdi 保存值“0x1007bf”,我相信 %rdi 给我们提供数值 0x1007bf 本身,而 (%rdi) 给我们地址 0x1007bf 处的值...

正确的解释是什么?

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

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

你基本上是正确的,

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

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

    %rdi
    (%rdi)
    都可以出现在源或目标位置(或源/目标),因此这意味着读与写(与先读后写)。

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

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