Запутанные скобки в 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
с символами, которые вы намереваетесь использовать в качестве непосредственных значений.