Кронштейны на регистрах в синтаксисе сборки Intel x86

Я понял, что в скобках x86 собраны. В этом примере регистр ax должен содержать X, поскольку скобки представляют текущий адрес LABEL.

mov ax, [LABEL]

LABEL:
db "X", 0

Но я не понимаю следующие две сборочные линии:

mov al, [ebx]

Зачем нужны скобки? Это потому, что ebx - регистр 32 бит и ax 16 бит? В чем разница:

mov al, ebx

Или этот, я не понимаю, зачем мне нужны скобки...

mov [edx], ax

Ответ 1

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

В:

mov ax, [LABEL]

LABEL:
db "X", 0

Вы устанавливаете ax с value, назначенным LABEL, в этом случае вы копируете "X" (0x58 ASCII) в регистр ax.

LABEL содержит адрес, в котором находится "X".

Это не действительная операция:

mov al, ebx

И это:

mov [edx], ax

Вы перемещаете значение ax в первые два байта "значение, на которое указывает edx", так как ax - это 16-разрядный регистр, а edx - 32-разрядный регистр, который содержит адрес памяти.

Ответ 2

Если мы используем 32-битный регистр "EDX" как регистратор адресов с использованием скобок, тогда значение внутри EDX будет использоваться в качестве адреса, указывающего на местоположение плунжера. Начиная с этого места мы можем читать или писать один байт, два байта или четыре байта.

Примеры записи одного байта, двух байтов и четырех байтов:

location DB ?, ?, ?, ?
mov edx, offset location
mov eax, 04030201h

запись одного байта:

mov [edx], al
result:
location DB 01, ?, ?, ?

запись другого байта:

mov [edx], ah
result:
location DB 02, ?, ?, ?

запись двух байтов:

mov [edx], ax
result:
location DB 01, 02, ?, ?

запись четырех байтов:

mov [edx], eax
result:
location DB 01, 02, 03, 04

Дирк