在 x86 Intel 语法中,[expression] 表示地址 expression 处的内存内容。
(除非在 MASM 中 expression 是数字文字或 equ 没有寄存器的常量,then it's still an immediate)
expression 不带括号取决于您使用的汇编程序。
NASM 风格(NASM、YASM):
mov eax,variable ; moves address of variable into eax
lea eax,[variable] ; equivalent to the previous one (LEA is exception)
mov eax,[variable] ; loads content of variable into eax
MASM 风格(也是 TASM 甚至 GCC/GAS .intel_syntax noprefix):
mov eax,variable ; load content of variable (for lazy programmers)
mov eax,OFFSET variable ; address of variable
lea eax,[variable] ; address of variable
mov eax,[variable] ; content of variable
GAS(AT&T 语法):这不是 Intel 语法,请参阅 the AT&T tag wiki。 GAS 也使用不同的指令(例如 .byte 而不是 db),即使在 .intel_syntax 模式下也是如此。
在所有情况下,variable 是符号标记内存中特定位置的别名,标签出现的地方。所以:
variable1 db 41
variable2 dw 41
label1:
在符号表中生成三个符号,variable1、variable2 和 label1。
当您在代码中使用它们中的任何一个时,例如mov eax,<symbol>,它没有任何信息是由db 或dw 定义的还是作为标签定义的,所以当您使用@ 时它不会给您任何警告987654344@(覆盖定义的第一个字节之外的 3 个字节)。
它只是内存中的一个地址。
(在 MASM 中除外,其中数据部分中标签后的 db 或 dd 确实将大小与其“变量名称”相关联。)
类型标识符仅在无法从指令操作数本身推断出类型时在大多数汇编程序中是必需的。
mov [ebx],eax ; obviously 32 bits are stored, because eax is 32b wide
mov [ebx],1 ; ERROR: how "wide" is that immediate value 1?
mov [ebx],WORD 1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD [ebx],1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD PTR [ebx],1 ; MASM/TASM syntax