Разница в сборке между [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 и посмотреть, что там содержится, а затем мы используем это значение в качестве адреса для доступа.

Затем необходимо использовать два шага, когда вы используете указатель:

  1. Перейдите в EAX и посмотрите, какое значение оно содержит (например, EAX = 0xBABA);

  2. Перейдите по адресу, указанному 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 или как целое число, зависит от вас, потому что они имеют одинаковое значение.

Другие вопросы по тегам