Ассемблер по-разному обрабатывает две константы.Внутри значение в регистре EAX хранится в формате с прямым порядком байтов.Вы можете увидеть это, написав:
mov eax, 1
Если вы осмотрите регистр, вы увидите, что его значение равно 0x00000001
.
Когда вы скажете ассемблеру, что вы хотите константузначение 0x78ff5abc
, это именно то, что хранится в регистре.Старшие 8 битов EAX будут содержать 0x78
, а регистр AL содержит 0xbc
.
Теперь, если вы хотите сохранить значение из EAX в памяти, оно будет заложенов памяти в обратном порядке.То есть, если бы вы написали:
mov [addr],eax
А затем проверили память в [addr], вы увидите 0xbc, 0x5a, 0xff, 0x78.
В случае 'WXYZ', ассемблер предполагает, что вы хотите загрузить значение таким образом, что если бы вы записали его в память, оно было бы расположено как 0x57, 0x58, 0x59, 0x5a.
Посмотрите на байты кодачто генерирует ассемблер, и вы увидите разницу.В случае mov eax,0x78ff5abc
вы увидите:
<opcodes for mov eax>, 0xbc, 0x5a, 0xff, 0x78
В случае mov eax,WXYZ
вы увидите:
<opcodes for mov eax>, 0x57, 0x58, 0x59, 0x5a