Подтвердить что ты не робот

Что означает MOV EAX, DWORD PTR DS: [ESI] и что он делает?

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

MOV EAX, DWORD PTR DS:[ESI]

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

После этой команды: EAX = 34333231

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

4b9b3361

Ответ 1

Регистры в квадратных скобках, такие как [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, когда они фактически представляют собой строку однобайтовых символов.