#memory #nasm
#память #nasm
Вопрос:
Итак, в моей книге говорится, что я могу определить таблицу слов следующим образом:
таблица: dw «13,37,99,99»
и что я могу извлекать значения из таблицы, увеличивая индекс до адреса таблицы вот так:
mov ax, [таблица 2]; должно дать мне 37
но вместо этого он помещает 0x2c33 в ax, а не 0x3337
связано ли это с различием в системной архитектуре? может быть, потому, что книга предназначена для 386, а я использую 686?
Ответ №1:
0x2C — это запятая ,
, а 0x33 — символ 3
, и они появляются на позициях 2 и 3 в вашей строке, как и ожидалось. (Я немного сбит с толку относительно того, чего вы ожидали, поскольку вы сначала говорите «должно дать мне 37», а позже говорите «вместо 0x3337».)
Ответ №2:
Вы определили строковую константу, хотя я подозреваю, что вы этого не хотели. Следующее:
dw "13,37,99,99"
Приведет к следующему результату:
Offset 00 01 02 03 04 05 06 07 08 09 0A 0B
31 33 2C 33 37 2C 39 39 2C 39 39 00
Почему? Потому что:
- 31 — это код ASCII для ‘1’
- 33 — это код ASCII для ‘3’
- 2C — это ASCII-код для ‘,’
- …
- 39 — это код ASCII для ‘9’
- NASM также завершает вашу строку нулем, помещая 0 байт в конце (если вы не хотите, чтобы ваши строки заканчивались нулем, используйте вместо этого одинарные кавычки,
'13,37,99,99'
)
Примите во внимание, что он ax
содержит два байта, и должно быть достаточно ясно, почему он ax
содержит 0x2C33
.
Я подозреваю, что то, что вы хотели, было больше похоже на это (без кавычек, и мы используем db
, чтобы указать, что мы объявляем данные размером с байт вместо dw
, которые объявляют данные размером со слово):
db 13,37,99,99
Это все равно дало бы вам 0x6363
( ax
содержит два байта / преобразование 99, 99 в шестнадцатеричное). Не уверен, откуда вы взяли 0x3337
.
Я рекомендую вам самостоятельно установить шестнадцатеричный редактор и провести эксперимент по проверке выходных данных из NASM.