2014-09-04 2 views
1

Я понимаю, что dword ptr - это директива размера, указывающая размер перемещаемого объекта где и я знаю, что mov eax, eax - это форма nop-кода, но что это делает?Что делает mov eax, dword ptr [eax]?

I думаю он меняет адрес eax с шестнадцатеричным значением внутри, но я не слишком уверен или даже знаю, почему это произойдет.

ответ

3

инструкции:

mov eax, eax 

может представлять собой почти-nop коды (кроме установки флагов), но это не то, что вы здесь. Вы загружаетесь с памяти (как указано [] «содержимое-из» символов).

Он загружает eax с содержания памяти (32-битный DWORD в данном случае), который в настоящее время указал на отeax.

Возможно графическое изображение поможет:

Before: 
    eax:     0x12345678 
    memory @ 0x12345674: 0xeeeeeeee 
         8: 0xffffffff 
After: 
    eax:     0xffffffff 
    memory @ 0x12345674: 0xeeeeeeee 
         8: 0xffffffff 
+0

о, я на самом деле не знаю [] означало содержание. Возможно ли сделать «dword ptr eax» без скобок? – user2893243

+0

@ пользователь2893243, это не имеет смысла. 'eax' - 32-битное значение _definite_, тогда как вы можете загрузить из памяти один байт, слово, dword или (по крайней мере, в x64) квадрат (для' rax', а не 'eax'). – paxdiablo

+0

ah ok, поэтому, если бы я хотел сделать слово ptr eax, которое не имеет смысла, в первую очередь я бы просто сделал: 'ax'. Кстати, вы знаете хорошие книги для сборки? – user2893243

2

Он загружает EAX со значением DWORD, на которое первоначально указывал EAX.

С точки С его разыменовании значение, которое первоначально находился в EAX следующим образом: «EAX = * EAX»

+0

+1 для _ «разыменования» _ указатель, это на мой взгляд самый простой правильный ответ – xmojmr

1

dword ptr [eax] - указывает на память, адрес которого EAX, поэтому это утверждение копирует 32 битное значение из памяти в eax