a dw 0xDEAD
Указывает ассемблеру хранить 2 байта (DW - Определить слово (16 бит), между прочим - DB = 8 бит, DD = 32 бита) и использовать a
, чтобы указать на него.Поскольку (держу пари, что вы используете компьютер с архитектурой x86-64, это 'little endian', что означает, что он хранит многобайтовые значения, начиная с младшего байта, поэтому в памяти ваше значение 0xDEAD
будет сохранено следующим образом: 0xAD
first, 0xDE
далее.Так как ваш сегмент данных наверняка будет дополнен, скажем, 16 байтами (например), он, вероятно, дополнен нулями.Теперь, если мы предположим, что ваш сегмент данных составляет 16 байтов - первые 2 определяют вашу переменную a
- остальные будут равны нулю.
Теперь сегмент данных выглядит следующим образом (при условии заполнения нуля до 16 байтов) (шестнадцатеричные значениябез префикса 0x):
AD, DE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^
\__ (a+1) points here at DE
Написав dword ptr [a + 1]
, вы говорите ассемблеру, чтобы он закодировал такую инструкцию машинного кода таким образом, чтобы захватить dword
(4 байта) с адреса a+1
.Это будут байты: DE, 0, 0, 0 Поскольку (как я уже говорил ранее) x86 имеет младший порядок байтов, эти 4 байта, если считать 4-байтовое значение, означают 0x00000DE
, следовательно, EAX равно этому значению.
OfКонечно, ваш сегмент данных может быть не 16 байтов, но, вероятно, имеет полную длину страницы, но это бессмысленно.