Регистры в квадратных скобках, такие как [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
, когда они фактически представляют собой строку однобайтовых символов.
Следует также упомянуть, что обозначение 'DS: [ESI]' означает, что 'ESI' содержит * смещение * от адреса в DS (регистр сегмента данных), поэтому инструкция перемещает двойное слово (32-битное значение) из адреса 'DS + ESI' для регистрации' EAX'. –
Я не уверен на 100%, согласен с тем, что на этом этапе будет педагогическим. В защищенном режиме DS является селектором, а не сегментом. Я считаю, что OP находится в защищенном режиме, потому что Linux, Windows и MacOS все работают в защищенном режиме с поддержкой VM и OP, похоже, не является программистом встраиваемых систем. Учитывая сложную ситуацию, которая на самом деле очень проста (DS отображается на весь диапазон адресов, а база селектора равна нулю), зачем пытаться очистить этот лук? –
@ Николай, я рад, что это было упомянуто здесь для некоторой «полноты». –