Разница в сборке между [var] и var
Я изучаю Ассемблер и дохожу до того, что на самом деле понятия не имею о разнице между [variable]
а также variable
, Как говорится в учебниках, оба указателя, так какой в этом смысл? И почему я должен использовать type Identifier
до []
? мой ассемблер: nasm x86_64 running on Linux--> Ubuntu
3 ответа
В x86 синтаксис Intel [expression]
означает содержимое памяти по адресу expression
,
expression
без скобок зависит от того, какой ассемблер вы используете.
NASM:
mov eax,variable ; moves address of variable into eax
lea eax,[variable] ; equivalent to the previous one (LEA is exception)
mov eax,[variable] ; moves content of variable into eax
MASM (TASM):
mov eax,variable ; content of variable (for lazy programmers)
mov eax,OFFSET variable ; address of variable
lea eax,[variable] ; address of variable
mov eax,[variable] ; content of variable
GAS (AT & T синтаксис): .. Я не собираюсь беспокоиться, это не синтаксис Intel.
Во всех случаях variable
это псевдоним для обозначения символа конкретным местом в памяти, где появилась метка. Так:
variable1 db 41
variable2 dw 41
label1:
производит три символа в таблицу символов, variable1
, variable2
а также label1
,
Когда вы используете любой из них в коде, как mov eax,<symbol>
, он не имеет информации, был ли он определен db
или же dw
или как ярлык, так что он не даст вам никакого предупреждения, когда вы делаете mov [variable1],ebx
(перезаписывает 3 байта за пределы определенного первого байта).
Это просто адрес в памяти.
Идентификатор типа должен использоваться в большинстве ассемблеров только тогда, когда тип не может быть выведен из операндов инструкции.
mov [ebx],eax ; obviously 32 bits are stored, because eax is 32b wide
mov [ebx],1 ; ERROR: how "wide" is that immediate value 1?
mov [ebx],WORD 1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD [ebx],1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD PTR [ebx],1 ; MASM/TASM syntax
Небольшой пример использования регистров и указателей:
mov eax, 10
означает: переместить в регистр EAX значение 10. В этом случае EAX используется только для хранения чего-либо. То, что содержит EAX, не имеет никакого значения для программиста, так как оно все равно будет стерто.
mov [eax], 10
означает: переместить значение 10 в адрес, сохраненный в регистре EAX. В этом случае значение, хранящееся в EAX, очень важно для нас, так как это указатель, что означает, что мы должны пройти регистрацию EAX и посмотреть, что там содержится, а затем мы используем это значение в качестве адреса для доступа.
Затем необходимо использовать два шага, когда вы используете указатель:
Перейдите в EAX и посмотрите, какое значение оно содержит (например, EAX = 0xBABA);
Перейдите по адресу, указанному EAX (в нашем случае 0xBABA), и напишите в нем 10.
Конечно, указатели не обязательно используются с регистрами, этот маленький пример просто для объяснения того, как он работает.
Поскольку вы уже знаете C++, я собираюсь ответить на него и показать вам, каковы C-эквиваленты этих выражений.
Когда ты пишешь
[variable]
в сборке, это эквивалентно
*variable
в с. То есть лечить variable
в качестве указателя и разыменования этого указателя - получите значение, на которое указывает указатель.
Аналогично, "идентификаторы типов" подобны приведению указателя к другому типу:
ASM:
dword ptr [variable]
C:
*((uint32_t*) variable)
ASM:
word ptr [variable]
C:
*((uint16_t*) variable)
Я надеюсь, что это поможет вам понять значение этих выражений.
(этот раздел относится к приложению, которое с тех пор было удалено из исходного вопроса)
Я не совсем уверен, с какой проблемой вы сталкиваетесь при "преобразовании в ascii", но я подозреваю, что вы просто озадачены тем, как он визуально отображается в выводе или что-то в этом роде.
Например, если у вас есть такой код:
myInteger db 41
mov AL, byte ptr [myInteger]
mov
скопирует значение 41
из памяти в AL
регистр. Число 41
случается, представление ASCII для )
характер, но это ничего не меняет. Будет ли значение интерпретироваться как символ ascii или как целое число, зависит от вас, потому что они имеют одинаковое значение.