2010-07-11 2 views
30

Хорошо так у меня есть эта линия в моей сборкеЧто означает MOV EAX, DWORD PTR DS: [ESI] означает и что он делает?

MOV EAX, DWORD PTR DS:[ESI] 

где ESI является 00402050 (ASCII, "123456789012")

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

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

ответ

54

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

+32

Следует также упомянуть, что обозначение 'DS: [ESI]' означает, что 'ESI' содержит * смещение * от адреса в DS (регистр сегмента данных), поэтому инструкция перемещает двойное слово (32-битное значение) из адреса 'DS + ESI' для регистрации' EAX'. –

+13

Я не уверен на 100%, согласен с тем, что на этом этапе будет педагогическим. В защищенном режиме DS является селектором, а не сегментом. Я считаю, что OP находится в защищенном режиме, потому что Linux, Windows и MacOS все работают в защищенном режиме с поддержкой VM и OP, похоже, не является программистом встраиваемых систем. Учитывая сложную ситуацию, которая на самом деле очень проста (DS отображается на весь диапазон адресов, а база селектора равна нулю), зачем пытаться очистить этот лук? –

+4

@ Николай, я рад, что это было упомянуто здесь для некоторой «полноты». –

Смежные вопросы