2017-02-12 32 views
1

Я читаю эту https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-purpose_registers_.2864-bit_naming_conventions.29Прямая адресация памяти в Ассамблее и []

На Прямая адресацию памяти он говорит:

.data 
    my_var dw 0abcdh ; my_var = 0xabcd 

.code 
    mov ax, [my_var] ; copy my_var content into ax (ax=0xabcd) 

Интересно, что бы это скопировать топор без [], если а не его значение, равное 0xabcd?

И почему это содержание в первую очередь? Не следует ли обрабатывать 0xabcd в качестве адреса памяти и посмотреть, что хранится по адресу 0xabcd вместо этого?

ответ

4

my_var является символом со ссылкой на какой-то адрес памяти. Директива

my_var dw 0abcdh 

вызывает ассемблер выделить два байта памяти, записать значение 0abcdh к нему, а затем пусть my_var точку в начале этого хранилища.

Комментарий my_var = 0xabcd хочет объяснить, что переменная my_var указывает на это значение. Чтобы понять это, заметим, что в языках высокого уровня, таких как C, когда вы объявить глобальную переменную, имя переменной всегда неявно разыменовываются:

int foo = 1; 
// compiles to 
foo dw 1 

Интересно, что бы это скопировать топор без [] если не его значение, равное 0xabcd?

Если вы не используете ссылку на память, копируется значение символа my_var, то есть адрес этой переменной.

И почему это содержание в первую очередь? Не следует ли обрабатывать 0xabcd в качестве адреса памяти и искать, что хранится по адресу 0xabcd?

No. Чтобы сделать это, вам нужно два обращения к памяти, как сначала нужно извлечь содержимое my_var, чтобы получить 0xabcd и затем извлечь из 0xabcd, чтобы получить то, что есть:

mov bx,[myvar] 
mov ax,[bx] 
+0

'Если вы не используете ссылку на память, копируется значение символа my_var, то есть адрес этой переменной. '- означает ли это, что в сборке, в отличие от HLL, переменная является указателем по умолчанию? – Kotaa

+0

также, 'mov bx, [myvar]' выбирает содержимое my_var, не так ли? но это противоречит этому ответу. http://stackoverflow.com/questions/42050480/storing-a-value-in-a-register-and-when-is-it-address-and-when-pure-value/42050785# 42050785 --- ** .... Не перемещает содержимое esp в eax. ** – Kotaa

+0

@ Kotaa A (статическая) переменная является частью памяти. Символы относятся к адресам, поэтому символ переменной всегда ссылается на адрес этой переменной. Вы не можете изменить значение символа во время выполнения, так как символы будут разрешены до запуска программы. К вашей ссылке: обратите внимание, что 'esp' является регистром, а не символом. Регистры могут содержать значения, и эти значения могут измениться. Объяснение совершенно верно. – fuz

1

Kotaa

В основном:

mov ax, my_var ; Moves the location of my_var into ax 
mov ax, [my_var] ; Moves the content found at the address of my_var 

К вашему второму блоку вопросов. Если, действительно, my_var должен был удерживать указатель на другой блок данных, то:

mov eax, [my_var] ; Get pointer stored at my_var 
mov ebx, [eax]  ; Get data from pointer whose address is in eax 
+1

Заметим, что ' mov bx, [ax] 'не является допустимым режимом адресации. – fuz

+0

@fuz - Спасибо, исправлено –

+0

как об этом http://stackoverflow.com/questions/42050480/storing-a-value-in-a-register-and-when-is-it-address-and-when-pure -value/42050785 # 42050785 --- ** mov eax, [esp] ===> Не перемещает содержимое esp в eax. ** – Kotaa