#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
from1521h
или что-то в этом роде и забыли обновить комментарий. Но да,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
from1521h
или что-то в этом роде и забыли обновить комментарий. Но да,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). Для каждой печати символов необходимо загрузить текущую позицию курсора, напечатать один символ и обновить позицию курсора. Положение курсора — единственное состояние, удерживаемое между печатью символов. Вот почему строка не просто печатается посимвольно в положение экрана, указанное вашей недопустимой позицией курсора, но она переходит в совершенно другую (но теперь достоверно описанную) позицию после печати пары символов.