когда я пытаюсь увеличить размер строки в текстовом режиме в сборке 8086, он переполняет большую часть текста в нужном месте, за исключением последних 3 символов

#assembly #x86-16 #masm #tasm #cursor-position

#сборка #x86-16 #masm #tasm #положение курсора

Вопрос:

 .Model small

.stack 64

.data

mesg db "What is your name? ",'

изображение ошибки, которая произошла со мной


Комментарии:

1. mov dx,1521 - десятичное число, а не шестнадцатеричное. Предполагалось ли, что mov dx,1521h DH = 0x15 и DL = 0x21? Или mov dx,0F15h иметь DH = 15 и DL = 21 (десятичное число)? IDK если это полностью объясняет странность, которую вы видите, возможно, я поспешил закрыть его как дубликат.

2. Если исправление этого не устраняет проблему, мы можем снова открыться. Но на данный момент, я думаю, нет необходимости, чтобы больше людей тратили время на просмотр его в этом состоянии.

3. я знаю проблему .... я делаю это специально, я просто не мог понять, почему он переполняет 'me?' вверх, а не вниз, как остальная часть строки ..... потому что mov dx, 1521 означает строку 5 и 241 col, что означает 5*80 241 =641, итак, это должно означать row = 641/80 = 8 и col = 641% 80 = 1, и это верно для большей части сообщения, но не подходит для последних 3 символов "я?"

4. Комментарии в вашем коде говорят "строка = 15 col = 20", так что либо код, либо комментарий являются ошибкой. По-видимому, это комментарий, который является ошибкой; Я предполагаю, что вы удалили h from 1521h или что-то в этом роде и забыли обновить комментарий. Но да, 1521 есть 0x05f1 . Я бы рекомендовал написать вашу константу таким образом, чтобы она не выглядела как ошибка, и обновить комментарий до соответствия.

Ответ №1:

Ваш код вызывает то, что пользователи C назвали бы "неопределенным поведением". Похоже, вы случайно забыли h в своей константе, и теперь вам интересно, почему ваша программа ведет себя так, как она. Как вы сами подсчитали в комментариях, вы сказали BIOS поместить курсор в столбец 241. С video BIOS на вашем ПК (эмулятор) это работает, как и ожидалось, до столбца 255, то есть для 15 символов. Когда BIOS увеличивает столбец курсора с 255 до 0, он замечает перенос и применяет экстренное исправление: он вводит новую строку (поскольку он также вводил бы новую строку, когда он увеличивает столбец курсора с 79 до 80 в режимах 80 символов). Это заставляет курсор перемещаться из строки 5, столбца 256 в строку 6, нулевой столбец.

Вы должны знать, что печать строки с использованием функции DOS вызывает драйвер вывода консоли (INT 29) для каждого отдельного символа, а драйвер вывода консоли пересылает каждый символ по отдельности в службу BIOS "print TTY character" (INT 10, AH = 0E). Для каждой печати символов необходимо загрузить текущую позицию курсора, напечатать один символ и обновить позицию курсора. Положение курсора - единственное состояние, удерживаемое между печатью символов. Вот почему строка не просто печатается посимвольно в положение экрана, указанное вашей недопустимой позицией курсора, но она переходит в совершенно другую (но теперь достоверно описанную) позицию после печати пары символов.

.code

Main PROC far

mov ax,@data

mov ds,ax

; clear the screen

mov ax,0600h

mov cx,0

mov dx,184FH

int 10h

; change to text mode

mov ax,3

int 10h

; place cursor on row=15 col=20

mov ah,2

mov dx,1521

int 10h

; Prompt Mesg into the screen

mov ah,09

mov dx,offset mesg

int 21h

Main ENDP

end Main
изображение ошибки, которая произошла со мной

Комментарии:

1. mov dx,1521 — десятичное число, а не шестнадцатеричное. Предполагалось ли, что mov dx,1521h DH = 0x15 и DL = 0x21? Или mov dx,0F15h иметь DH = 15 и DL = 21 (десятичное число)? IDK если это полностью объясняет странность, которую вы видите, возможно, я поспешил закрыть его как дубликат.

2. Если исправление этого не устраняет проблему, мы можем снова открыться. Но на данный момент, я думаю, нет необходимости, чтобы больше людей тратили время на просмотр его в этом состоянии.

3. я знаю проблему …. я делаю это специально, я просто не мог понять, почему он переполняет ‘me?’ вверх, а не вниз, как остальная часть строки ….. потому что mov dx, 1521 означает строку 5 и 241 col, что означает 5*80 241 =641, итак, это должно означать row = 641/80 = 8 и col = 641% 80 = 1, и это верно для большей части сообщения, но не подходит для последних 3 символов «я?»

4. Комментарии в вашем коде говорят «строка = 15 col = 20», так что либо код, либо комментарий являются ошибкой. По-видимому, это комментарий, который является ошибкой; Я предполагаю, что вы удалили h from 1521h или что-то в этом роде и забыли обновить комментарий. Но да, 1521 есть 0x05f1 . Я бы рекомендовал написать вашу константу таким образом, чтобы она не выглядела как ошибка, и обновить комментарий до соответствия.

Ответ №1:

Ваш код вызывает то, что пользователи C назвали бы «неопределенным поведением». Похоже, вы случайно забыли h в своей константе, и теперь вам интересно, почему ваша программа ведет себя так, как она. Как вы сами подсчитали в комментариях, вы сказали BIOS поместить курсор в столбец 241. С video BIOS на вашем ПК (эмулятор) это работает, как и ожидалось, до столбца 255, то есть для 15 символов. Когда BIOS увеличивает столбец курсора с 255 до 0, он замечает перенос и применяет экстренное исправление: он вводит новую строку (поскольку он также вводил бы новую строку, когда он увеличивает столбец курсора с 79 до 80 в режимах 80 символов). Это заставляет курсор перемещаться из строки 5, столбца 256 в строку 6, нулевой столбец.

Вы должны знать, что печать строки с использованием функции DOS вызывает драйвер вывода консоли (INT 29) для каждого отдельного символа, а драйвер вывода консоли пересылает каждый символ по отдельности в службу BIOS «print TTY character» (INT 10, AH = 0E). Для каждой печати символов необходимо загрузить текущую позицию курсора, напечатать один символ и обновить позицию курсора. Положение курсора — единственное состояние, удерживаемое между печатью символов. Вот почему строка не просто печатается посимвольно в положение экрана, указанное вашей недопустимой позицией курсора, но она переходит в совершенно другую (но теперь достоверно описанную) позицию после печати пары символов.