Что означают скобки в x86 asm? - PullRequest
55 голосов
/ 08 января 2010

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

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1

Что обозначают скобки ([L1])?

Ответы [ 8 ]

46 голосов
/ 08 января 2010

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

34 голосов
/ 13 сентября 2014

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

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

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

mov eax, [ebp - 4]

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

lea eax, [ebp - 4]

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

30 голосов
/ 08 января 2010

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

Если вам нравится C, то подумайте об этом так: [L1] - это то же самое, что и *L1

6 голосов
/ 08 января 2010

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

mov eax, [1234]

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

1234 00001

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

2 голосов
/ 08 января 2010

Прямая адресация памяти - al будет загружена со значением, расположенным по адресу памяти L1.

1 голос
/ 08 января 2010

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

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

mov al, [ebx]

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

0 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...