我正在学习汇编程序,但实际上我对 [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:

将三个符号生成到符号表中, variable1variable2label1

当你在代码中使用它们中的任何一个时,比如 mov eax,<symbol> ,它没有信息是由 dbdw 定义的还是作为标签,所以当你做 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/

10-15 03:10