MASM 对于汇编语言来说是不寻常的,因为它有类型。 MASM 知道是因为你如何定义符号item
这是一个类型的内存位置DWORD
。当您将它用作操作数时,您(可能)意味着您想要存储在该地址处的值,而不是该地址的值。所以如果你使用也没关系item
or [item]
MASM 假设您指的是后者。如果您确实想要项目的地址,则需要使用OFFSET item
.
另一方面,如果你定义了item
作为常数使用item = 42
then mov ebx, item
将加载立即值。由于这种模糊性,您需要知道如何item
被定义来确定它是立即操作数还是内存操作数,最好避免使用裸符号作为操作数。
我应该补充一点,方括号[]
当您只使用符号或数字时,对于 MASM 来说几乎没有任何意义。仅当您将它们与寄存器一起使用时,它们才有意义。以下是一些示例:
item DD 42
const = 43
mov eax, item ; memory operand (the value stored at item)
mov eax, [item] ; memory operand
mov eax, OFFSET item ; immediate operand (the address of item)
mov eax, [OFFSET item] ; immediate operand
mov eax, const ; immediate operand (43)
mov eax, [const] ; immediate operand
mov eax, ds:[const] ; memory operand (the value at address 43)
mov eax, fs:30h ; memory operand (the value at address 30h + fs base)
mov eax, OFFSET const ; immediate operand
mov eax, [OFFSET const] ; immediate operand
mov eax, 42 ; immediate operand
mov eax, ebx ; register operand (the value of EBX)
mov eax, [ebx] ; indirect operand (the value pointed to by EBX)
因此,如果没有寄存器,方括号只能显示您的意图。如果您打算将符号用作内存操作数,则应该将它们放在方括号中,并使用OFFSET
以及您打算用作立即值的符号。