Запутанные скобки в MASM32

Я пытаюсь справиться с MASM32 и меня смущает следующее:

Я думал, что скобки были использованы для косвенного обращения, поэтому, если у меня есть предопределенная переменная

 .data
   item dd 42

затем

 mov ebx, item

поместил бы содержимое элемента, то есть число 42, в ebx и

 mov ebx, [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 ответ

Решение

MASM необычен для ассемблера в том смысле, что имеет типы. MASM знает из-за того, как вы определили символ item это ячейка памяти типа DWORD, Когда вы используете его как операнд, он знает, что вы (вероятно) имеете в виду, что вы хотите, чтобы значение хранилось по адресу, а не значение адреса. Так что не имеет значения, если вы используете item или же [item] МАСМ предполагает, что вы имеете в виду позже. Если вы действительно хотите адрес элемента вместо этого вам нужно использовать 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 с символами, которые вы намереваетесь использовать в качестве непосредственных значений.

Другие вопросы по тегам