Предположим, у меня заявлено следующее:
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. И связал другие вопросы и ответы).