Предположим, у меня заявлено следующее:
section .bss
buffer resb 1
И эти инструкции следуют в section .text
:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
Правильно ли я понимаю, что bl будет содержать значение 5, а cl будет содержать адрес памяти переменной buffer
?
Я запутался в различиях между
- перемещать немедленный в регистр,
- перемещение регистра в немедленное (что входит, данные или адрес?) и
- перемещение немедленного в регистр без скобок
- Например,
mov cl, buffer
противmov cl, [buffer]
- Например,
ОБНОВЛЕНИЕ: после прочтения ответов, я думаю, что следующее резюме является точным:
mov edi, array
помещает адрес памяти индекса нулевого массива вedi
. то есть адрес этикетки.mov byte [edi], 3
помещает ЗНАЧЕНИЕ 3 в нулевой индекс массива- после
add edi, 3
,edi
теперь содержит адрес памяти третьего индекса массива mov al, [array]
загружает данные в нулевом индексе вal
.mov al, [array+3]
загружает данные в третьем индексе вal
.mov [al], [array]
недопустим, потому что x86 не может кодировать 2 явных операнда памяти, а также потому, чтоal
имеет только 8 битов и не может использоваться даже в 16-битном режиме адресации. Ссылка на содержимое ячейки памяти. (режимы адресации x86)mov array, 3
недопустим, потому что вы не можете сказать: "Эй, мне не нравится смещение, при котором хранитсяarray
, поэтому я назову его 3". Непосредственным может быть только исходный операнд.mov byte [array], 3
помещает значение 3 в нулевой индекс (первый байт) массива. Спецификаторbyte
необходим, чтобы избежать неоднозначности между байтом/словом/двойным словом для инструкций с памятью, непосредственными операндами. В противном случае это будет ошибка времени сборки (неоднозначный размер операнда).
Пожалуйста, укажите, является ли какой-либо из них ложным. (примечание редактора: я исправил синтаксические ошибки/неоднозначности, поэтому действительные из них на самом деле являются действительным синтаксисом NASM. И связал другие вопросы и ответы).