我正试图掌握MASM32,并对以下内容感到困惑:
我认为括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
然后
mov ebx, item
会将' item'的内容(即数字42)放入ebx和
mov ebx, [item]
会将' item'的地址,即存储42的地址放入ebx。
但是控制台应用程序中的以下代码:
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
打印42次。要获取'项目的地址'我似乎需要
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
任何人都可以解释MASM中的方括号,或者指出一个很好的参考。
答案 0 :(得分:13)
MASM对于汇编语言来说是不寻常的,因为它有类型。 MASM知道您是如何定义符号item
的,它是DWORD
类型的内存位置。当您将其用作操作数时,您知道您(可能)意味着您希望存储在地址中的值,而不是地址的值。因此,如果您使用item
或[item]
MASM并不重要,则假设您的意思是后者。如果您真的想要项目的地址,则需要使用OFFSET item
。
另一方面,如果您使用item
将item = 42
定义为常量,则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, 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
与要用作立即值的符号一起使用。