x86 не имеет косвенной адресации данных памяти. Это разница между 0 и 1 уровнями косвенности и адресом символа как непосредственного, а не 1 против 2.
В отличие от C, в синтаксисе FASM (и NASM) упоминание голого имени символа адрес в качестве значения .
например, mov eax, symbol
устанавливает EAX = адрес, на который вы поместили эту метку, с инструкцией mov eax, imm32
, а не загрузкой из памяти.
Конечно, mov symbol, eax
не может работать, потому что непосредственная константа не может быть пунктом назначения, только режим адресации [disp32]
.
, если я думаю о mov как write, это много значит больше смысла. Могу ли я думать о mov
как о записи, а не о «перемещении»
Да. MOV просто копирует из исходного операнда в операнд-адресат. Вот почему адресат должен указывать на память или регистр. Но исходный операнд может быть непосредственным, регистром или памятью.
(Разумеется, sr c и dst не могут быть памятью для одного mov
инструкция; существует различных форм для различных типов операндов.)
Символ asm в FASM и NASM работает примерно так же, как C char arr[]
.
Вы не можете сделать arr = x;
- эквивалент asm равен mov arr, al
, что также недопустимо (в синтаксисе FASM и NASM).
Но вы можете сделать *arr = x;
, который в asm равен mov [arr], al
К вашему сведению: синтаксис MASM отличается : вместо символов, работающих в качестве заполнителя для числа во всех контекстах, mov sym, al
- это храните то же самое, что и mov [sym], al
, и скобки являются необязательными и бессмысленными без регистра.
Если вы видите какой-либо M Примеры ASM или выход GCC / clang .intel_syntax noprefix
; вот что происходит.