Что означает MOV EAX, DWORD PTR DS: [ESI] и для чего он нужен? - PullRequest
43 голосов
/ 12 июля 2010

Хорошо, у меня есть эта строка в моей сборке

MOV EAX, DWORD PTR DS:[ESI]

, где ESI 00402050 (ascii, "123456789012")

После этой инструкции: EAX = 34333231

Что на самом деле здесь произошло?Как рассчитывается это значение и почему?
Где я могу получить хорошую ссылку на подобные вещи?

1 Ответ

67 голосов
/ 12 июля 2010

Регистры в квадратных скобках, такие как [ESI], являются указателями с разыменованными ссылками. Указанная вами инструкция перемещает DWORD (32-битное / 4-байтовое значение) в ячейке памяти, заданной ESI, в регистр EAX. В вашем случае ячейка памяти 00402050, читаемая как DWORD, содержит 34333231.

Написано в псевдо-C:

DWORD EAX;   /* Declaring the registers as we find them in silico */
DWORD ESI;

ESI = 0x00402050;  /* Set up your initial conditions for ESI */
EAX = *((DWORD *)ESI);   /* mov EAX, DWORD PTR [ESI] */
/*  ^ ^  ^^^^^^^    */
/*  | |     |       */
/*  | |     +-----------  From "DWORD PTR" we get "DWORD *" in C.          */
/*  | |             */ 
/*  | +-----------------  The C dereferencing operator * replaces [].      */
/*  |               */ 
/*  +-------------------  The C assignment operator = replaces mov opcode. */ 

В вашем случае, это неправда, что 0x00402050 "равно" строке "1234567890" - скорее она указывает на память, которая содержит эту строку.

Полученное вами значение 0x34333231 состоит из значений ASCII для цифр "1234", которые являются первыми четырьмя байтами (т. Е. Первым DWORD) строки. Они отображаются в обратном порядке, потому что архитектура Intel является «прямым порядком байтов» в байтовом представлении DWORD в памяти.

В вашем примере в это время инструкция mov загружает символы ASCII, как если бы они были четырьмя байтами значения unsigned long, когда они на самом деле являются строкой однобайтовых символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...