Прежде всего, извините за основные вопросы - я новичок в языке ассемблера /MASM. Я очень смутился с использованием OFFSET, квадратных скобок и де-ссылки.
Это мое понимание:
-
Переменные/метки данных - это адреса памяти. Квадратные скобки подразумевают де-ссылку, поэтому [var] будет извлекать содержимое по адресу var. Команды MASM автоматически разыгрывают операнды памяти, поэтому следующее будет копировать содержимое var в eax:
MOV eax, var MOV eax, [var]
-
Чтобы переместить адрес var в регистр, вам нужно будет сделать
MOV reg, OFFSET var
Но теперь похоже, что var и [var] больше не эквивалентны:
var DWORD 10h mov esi, OFFSET var mov eax, [esi] ; eax = 10h mov eax, esi ; eax = address of var
Здесь начинается мое замешательство. Такое разыменование всегда подразумевается, когда нужны квадратные скобки? Когда они являются необязательными?
-
Кроме того, следующее будет инициализировать var2 с адресом для var1
var1 byte 10h,20h,30h,40h var2 dword var1 var2 dword OFFSET var1 ; equivalent
Теперь, когда var1 ссылается на адрес? Когда это относится к контенту?