在MASM32中混淆括号

Pen*_*ino 7 assembly masm masm32

我试图掌握MASM32,并对以下内容感到困惑:

我认为括号用于间接,所以如果我有一个预定义的变量

 .data
   item dd 42
Run Code Online (Sandbox Code Playgroud)

然后

 mov ebx, item
Run Code Online (Sandbox Code Playgroud)

将'item'的内容,即数字42,放入ebx和

 mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)

将'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
Run Code Online (Sandbox Code Playgroud)

两次打印42次.要获得"项目"的地址,我似乎需要

 mov ebx, [OFFSET item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释MASM中的方括号,或者指出一个很好的参考.

Ros*_*dge 13

MASM对于汇编语言来说是不寻常的,因为它有类型.由于您如何定义作为item类型的内存位置的符号,MASM知道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)
Run Code Online (Sandbox Code Playgroud)

所以没有寄存器方括号只显示你的意图.如果您打算将它们用作内存操作数,则应在符号周围放置方括号,并使用OFFSET您打算用作立即值的符号.