Почему столько байтов записывается на стандартное устройство вывода? - PullRequest
3 голосов
/ 13 марта 2019

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

d1  db 1,2
d2  dw 3
d3  db 'ABC'
d4  db 'DE'
d5  db 'F'
d6  db '$'

Я запускаю этот набор инструкций в DOSbox:

mov dx, offset d2
add dx, 2
mov ah, 9
int 21h

Почему это стандартное устройство вывода будет записывать 6 байтов?Я понимаю, что d2 - это слово, поэтому это 2 байта данных.Но я не совсем понимаю, почему будет вывод на 6 байт?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Ваш код:

mov dx, offset d2
add dx, 2
mov ah, 9
int 21h

делает то же самое, что и:

mov dx, offset d3 ; offset d3 equals offset d2 + 2, because d2 is a word.
mov ah, 9
int 21h

Несколько инструкций данных db создают последовательные байты в памяти (здесь), так что:

d3  db 'ABC'
d4  db 'DE'
d5  db 'F'
d6  db '$'

эквивалентно следующему:

d3  db 'ABCDEF$' ; assuming you don't need labels d4, d5, d6 somewhere else

Таким образом, вы передаете строку 'ABCDEF$' в int 21h, функцию AH=9, «Показать строку» , и это печатает все символы строки, которую вы передаете в DX, вплоть до финального '$'.Таким образом, он печатает

ABCDEF

, как и ожидалось.

3 голосов
/ 13 марта 2019

Вы перемещаете смещение d2 в DX . Это указывает на два байта, начиная с dw 3. Затем 2 добавляется к DX , таким образом, DX теперь указывает сразу за 2-байтовым словом, которое оказывается началом d3. Int 21 / ah = 9 будет печатать символы до (и не включая $), начиная со смещения в DX . Символы, начинающиеся со смещения d3 (и заканчивающиеся на $), должны быть напечатаны. Это должно быть ABCDEF, то есть 6 символов, которые вы должны были видеть на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...