Позвольте дать вам краткое пояснение.
[] скобки означают что-то вроде «работают не с контентом, а с адресом». При использовании помеченных DATA их можно опустить (это зависит от синтаксиса вашего ассемблера, но в MASM это определенно работает так). Зачем? Нет возможности напрямую работать с данными в памяти; вместо этого вы просто работаете с данными где-то в памяти (по какому-то адресу) . Так что двусмысленности быть не может, вы всегда работаете с данными по адресу. Когда вы используете их с регистрами, это совсем другая история:
MOV EAX, 10
просто загружает 10 (0x0000000A) в регистр EAX. Вы работаете напрямую с реестром. Но:
MOV EAX, 666
MOV BYTE PTR [EAX], 77
загружает 77 в адрес памяти 666. Директива BYTE PTR
необходима, потому что ассемблер не знает, следует ли использовать 1, 2, 4 и c. байтов. [EAX]
говорит: «Не работайте с EAX, вместо этого работайте с АДРЕСОМ (ячейкой памяти), содержащимся в EAX.
Если вы хотите выяснить разницу между [VAR]
, VAR
и OFFSET VAR
, попробуйте пошагово ввести этот код:
.DATA
VAR DWORD 77
.CODE
MOV EAX, VAR
MOV EBX, OFFSET VAR
MOV ECX, [VAR]
MOV EDX, OFFSET [VAR]
Вы четко увидите разницу.