С учетом следующего кода:
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]
Также известен как нагрузка.
Это означает, что регистр должен использоваться как указатель для фактического местоположения, а не действовать на сам регистр.