Что означают скобки в x86 asm?

С учетом следующего кода:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1

Что представляют собой скобки ([L1])?

Ответ 1

[L1] означает содержимое памяти по адресу L1. После запуска mov al, [L1] здесь регистр al получит байт по адресу L1 (буква "w" ).

Ответ 2

Просто означает получить память по адресу, помеченному меткой L1.

Если вам нравится C, тогда подумайте об этом следующим образом: [L1] совпадает с *L1

Ответ 3

Операнды этого типа, такие как [ebp], называются операнды памяти.

Все ответы здесь хороши, но я вижу, что никто не говорит о предостережении, следуя этому как жесткое правило - если скобки, затем разыменовываются, , за исключением случаев, когда команда lea.

lea является исключением из приведенного выше правила. Скажем, мы

mov eax, [ebp - 4]

Значение ebp вычитается на 4, а скобки указывают, что результирующее значение принимается за адрес, а значение, находящееся по этому адресу, сохраняется в eax. Однако в случае lea скобки не означают, что:

lea eax, [ebp - 4]

Значение ebp вычитается на 4, а результирующее значение сохраняется в eax. Эта инструкция просто рассчитала адрес и сохранила рассчитанное значение в регистре назначения. Подробнее см. этот пост.

Ответ 4

Скобки означают удаление ссылки на адрес. Например

mov eax, [1234]

означает, перемещает содержимое адреса 1234 в EAX. Итак:

1234 00001

EAX будет содержать 00001.

Ответ 6

Как и во многих языках ассемблера, это означает косвенность. Другими словами, первый mov загружает al с содержимым L1 (байт 'w' другими словами), а не адресом.

Второй mov фактически загружает eax с адресом L1, и вы можете позже разыменовать это, чтобы получить или установить его содержимое.

В обоих случаях L1 концептуально считается адресом.

Ответ 7

Они означают, что вместо перемещения значения регистра или числового значения L1 в регистр al обрабатывать значение регистра или числовое значение L1 как указатель в память, извлекать содержимое этого адреса памяти, и переместите это содержимое в al.

В этом случае L1 является местом памяти, но та же логика будет применяться, если в скобках указано имя регистра:

mov al, [ebx]

Также известен как нагрузка.

Ответ 8

Это означает, что регистр должен использоваться как указатель для фактического местоположения, а не действовать на сам регистр.