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