С учетом следующего кода:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Что представляют собой скобки ([L1])?
С учетом следующего кода:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Что представляют собой скобки ([L1])?
[L1]
означает содержимое памяти по адресу L1. После запуска mov al, [L1]
здесь регистр al
получит байт по адресу L1 (буква "w" ).
Просто означает получить память по адресу, помеченному меткой L1.
Если вам нравится C, тогда подумайте об этом следующим образом: [L1]
совпадает с *L1
Операнды этого типа, такие как [ebp]
, называются операнды памяти.
Все ответы здесь хороши, но я вижу, что никто не говорит о предостережении, следуя этому как жесткое правило - если скобки, затем разыменовываются, , за исключением случаев, когда команда lea
.
lea
является исключением из приведенного выше правила. Скажем, мы
mov eax, [ebp - 4]
Значение ebp
вычитается на 4, а скобки указывают, что результирующее значение принимается за адрес, а значение, находящееся по этому адресу, сохраняется в eax
. Однако в случае lea
скобки не означают, что:
lea eax, [ebp - 4]
Значение ebp
вычитается на 4, а результирующее значение сохраняется в eax
. Эта инструкция просто рассчитала адрес и сохранила рассчитанное значение в регистре назначения. Подробнее см. этот пост.
Скобки означают удаление ссылки на адрес. Например
mov eax, [1234]
означает, перемещает содержимое адреса 1234 в EAX. Итак:
1234 00001
EAX будет содержать 00001.
Прямая адресация памяти - al
будет загружено значением, расположенным по адресу памяти L1
.
Как и во многих языках ассемблера, это означает косвенность. Другими словами, первый mov
загружает al
с содержимым L1
(байт 'w'
другими словами), а не адресом.
Второй mov
фактически загружает eax
с адресом L1
, и вы можете позже разыменовать это, чтобы получить или установить его содержимое.
В обоих случаях L1
концептуально считается адресом.
Они означают, что вместо перемещения значения регистра или числового значения L1
в регистр al
обрабатывать значение регистра или числовое значение L1
как указатель в память, извлекать содержимое этого адреса памяти, и переместите это содержимое в al
.
В этом случае L1 является местом памяти, но та же логика будет применяться, если в скобках указано имя регистра:
mov al, [ebx]
Также известен как нагрузка.
Это означает, что регистр должен использоваться как указатель для фактического местоположения, а не действовать на сам регистр.