我正在学习汇编程序,但实际上我对 [variable]
和 variable
之间的区别一无所知。正如教程所说,两者都是指针,那么这有什么意义呢?为什么我必须在 type Identifier
之前使用 []
?
我的汇编程序:nasm x86_64 running on Linux--> Ubuntu
最佳答案
在 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 。即使在
.byte
模式下,GAS 也使用不同的指令(如 db
而不是 .intel_syntax
)。在所有情况下,
variable
都是符号的别名,用于标记内存中出现标签的特定位置。所以:variable1 db 41
variable2 dw 41
label1:
将三个符号生成到符号表中,
variable1
、 variable2
和 label1
。当你在代码中使用它们中的任何一个时,比如
mov eax,<symbol>
,它没有信息是由 db
或 dw
定义的还是作为标签,所以当你做 mov [variable1],ebx
时它不会给你任何警告(覆盖定义的第一个字节之外的 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
关于[var] 和 var 之间的汇编差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39474332/