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