Я понял, что в скобках 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
Дирк