Почему вы должны разыменовать метку данных, чтобы что-то там хранить: Assembly 8086 FASM - PullRequest
0 голосов
/ 08 апреля 2020

Рассмотрим следующий пример:

mov al, [variable1]

Это имеет смысл, поскольку вы сохраняете в регистре все содержимое (таким образом разыменовывая его) переменной 1.

Теперь рассмотрим этот пример:

mov dword L6, 1

Это не правильно; правильная форма:

mov dword [L6], 1

Если мы перемещаем 1 в память, я должен сказать, что она должна храниться по этому адресу, а не в содержимом. Скажем, вы говорите кому-нибудь go в определенное место для вечеринки, вы даете им адрес этой вечеринки, а не людей там *

Итак, почему это так?

1 Ответ

2 голосов
/ 08 апреля 2020

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; вот что происходит.

...