Steve Woods 的帖子给我的印象是他认为 & 是一个取消引用运算符。& 是 C 的引用运算符。* 是 C 的解引用运算符。OP有一个合理的担忧。[] 似乎可以同时发挥作用,具体取决于上下文。它既不是取消引用也不是引用运算符。它是“这是一个内存地址!!!” 操作员。
https://nasm.us/doc/nasmdoc3.html#section-3.3
有效地址是引用内存的指令的任何操作数。在 NASM 中,有效地址有一个非常简单的语法:它们由一个计算为所需地址的表达式组成,用方括号括起来。
; assume wordvar was used as a label, and the linker gave it address 6291668
; or mostly equivalently, you used wordvar equ 6291668
mov eax,wordvar ; eax = 6291668. Move value 6291668 to eax.
mov eax,[wordvar] ; eax = 12. Move contents of address 6291668 to eax.
mov eax,13
; mov wordvar,eax ; Move eax to value 6291668. syntax error.
mov [wordvar],eax ; mem(6291668) = 13. Move eax to address 6291668.
当操作数是内存地址时,它必须用方括号括起来以告诉 nasm 是这种情况。它不是取消引用它,它只是让 nasm 知道发生了什么。如果它等价于解引用运算符,
mov [wordvar], eax
将内存位置 12 设置为 13。
这不是取消引用运算符。这是“这是一个内存地址”运算符。这似乎是在不同情况下的解引用和引用,因为 x86 和 x86_64 指令的行为基于其操作数是内存位置还是值而有所不同。我正在自学组装,我必须自己解释这一点才能弄清楚。