Адресация данных памяти в 32-разрядном защищенном режиме с помощью nasm

#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.