Адресация данных в памяти в 32-битном защищенном режиме с использованием NASM - PullRequest
0 голосов
/ 24 мая 2011

Итак, моя книга говорит, что я могу определить таблицу слов следующим образом:

Таблица: DW "13,37,99,99"

и что я могу вырвать значения из таблицы, увеличив индекс на адрес таблицы следующим образом:

Мовор, [таблица + 2]; должен дать мне 37

но вместо этого он помещает 0x2c33 в топор, а не 0x3337

это из-за разницы в архитектуре системы? может, потому что книга предназначена для 386, а я бегу 686?

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

0x2C - это запятая ,, а 0x33 - это символ 3, и они появляются в позициях 2 и 3 в вашей строке, как и ожидалось.(Я немного сбит с толку относительно того, что вы ожидали, так как вы сначала говорите «должен дать мне 37», а потом говорите «вместо 0x3337».)

0 голосов
/ 15 сентября 2011

Вы определили строковую константу, когда я подозреваю, что вы не хотели.Следующее:

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.

Я рекомендую вам установить hex hex и провести эксперимент с проверкой выходных данных NASM.

...