В чем разница между использованием "смещения" и "[]" в метках памяти и регистрах в сборке GAS .intel-syntax? - PullRequest
1 голос
/ 06 мая 2020

Использование G CC, компиляция для 32-битной архитектуры Intel, с .intel_syntax noprefix. Предположим, у меня есть следующий раздел .data:

A: .int 0x1, 0x2

В чем разница между следующими, когда они используются в качестве операнда: A, [A], offset A? Кроме того, в чем разница, когда [..] используется в регистре и на метке памяти?

На разницу между простой записью регистра и помещением его в [..] был дан ответ здесь хорошо.

1 Ответ

1 голос
/ 06 мая 2020

Позвольте дать вам краткое пояснение.
[] скобки означают что-то вроде «работают не с контентом, а с адресом». При использовании помеченных DATA их можно опустить (это зависит от синтаксиса вашего ассемблера, но в MASM это определенно работает так). Зачем? Нет возможности напрямую работать с данными в памяти; вместо этого вы просто работаете с данными где-то в памяти (по какому-то адресу) . Так что двусмысленности быть не может, вы всегда работаете с данными по адресу. Когда вы используете их с регистрами, это совсем другая история:

MOV EAX, 10

просто загружает 10 (0x0000000A) в регистр EAX. Вы работаете напрямую с реестром. Но:

MOV EAX, 666
MOV BYTE PTR [EAX], 77

загружает 77 в адрес памяти 666. Директива BYTE PTR необходима, потому что ассемблер не знает, следует ли использовать 1, 2, 4 и c. байтов. [EAX] говорит: «Не работайте с EAX, вместо этого работайте с АДРЕСОМ (ячейкой памяти), содержащимся в EAX.

Если вы хотите выяснить разницу между [VAR], VAR и OFFSET VAR, попробуйте пошагово ввести этот код:

.DATA
VAR DWORD 77

.CODE
    MOV EAX, VAR
    MOV EBX, OFFSET VAR
    MOV ECX, [VAR]
    MOV EDX, OFFSET [VAR]

Вы четко увидите разницу.

...