在MASM32中混淆括号

时间:2014-08-05 00:54:25

标签: assembly masm masm32

我正试图掌握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中的方括号,或者指出一个很好的参考。

1 个答案:

答案 0 :(得分:13)

MASM对于汇编语言来说是不寻常的,因为它有类型。 MASM知道您是如何定义符号item的,它是DWORD类型的内存位置。当您将其用作操作数时,您知道您(可能)意味着您希望存储在地址中的值,而不是地址的值。因此,如果您使用item[item] MASM并不重要,则假设您的意思是后者。如果您真的想要项目的地址,则需要使用OFFSET item

另一方面,如果您使用itemitem = 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与要用作立即值的符号一起使用。