Turbo Assembler перекрытие нескольких входов

Я новичок в ассемблере, и у меня проблемы с моим кодом. Сначала я попробовал 1 вход, а затем 1 выход, и он работает просто отлично. Но когда я пытаюсь 2 входа. Вот когда проблема обнаруживается. Когда он запрашивает "Пол", ввод 1 и вывод 1, кажется, перекрывают его.

Я тщательно искал и смог найти тот, который спрашивает то же самое, но его / ее был другим, и я не могу понять. Я надеюсь, что кто-то может помочь. Это для школы.

Полный код:

.model small
.stack 200
.data
    message db "Name: ","$"
    message2 db "Your name is: ","$"
    message3 db "Gender: ","$"
    message4 db "Your name is: ","$"
    BUF DB 100  
    DB 100 DUP("$") 

.code
MOV ax,@data
mov ds,ax

LEA dx,message  
mov ah,09h
int 21h
mov ah,0ah ;
mov dx, offset buf
int 21h

LEA dx,message2 
mov ah,09h
int 21h
LEA DX,BUF  
ADD DX,02   
MOV AH,09H
INT 21H

LEA dx,message3 
mov ah,09h
int 21h
mov ah,0ah 
mov dx, offset buf
int 21h


LEA dx,message4 
mov ah,09h
int 21h
LEA DX,BUF  
ADD DX,02   
MOV AH,09H
INT 21H

MOV AX,4C00H
INT 21H
END

2 ответа

Решение

Вся печать выполняется на одной линии. Чтобы перейти к следующей строке, вам нужно напечатать \n\r, но, конечно, это не так, поскольку они интерпретируются языками высокого уровня. Вам нужно использовать их коды ASCII: 13,10. Поэтому расширите свой код (раздел.data) следующим образом:

newline db 13,10,"$"

и где бы вы ни захотели перейти на новую строку, просто напечатайте это:

 lea dx, newline
 mov ah, 09h
 int 21h

Также message4 должно быть "Ваш пол: ","$"

Вы должны написать завершающий символ '$' явно после каждого вызова AH=0Ah (или использовать отдельные буферы). В противном случае, если вы сначала наберете строку "123456", а затем "abc", буфер будет удерживаться первым 123456\n$$$$$$... а также abc\n56\n$$$$$ в следующий раз.

Прерывание AH=0Ah поместит число символов, считанных в позицию DX + 1. По какой-то причине входное прерывание использует '\n' в качестве завершающего символа, в то время как AH=09h / строка печати использует '$'.

 ;; given dx == offset buf, replace the Carriage Return
 ;; with the terminating character '$'
 fix_end_of_string:
 mov bx, dx
 mov al, [bx + 1]
 mov ah, 0
 add bx, ax
 mov al, '$'
 mov [bx + 2], al
 ret

Некоторая случайная ссылка на услуги AH=0Ah / AH=09h

Другая проблема, как указано в другом ответе, заключается в том, как DOS управляет терминалом как имитированной пишущей машинкой с отдельным возвратом каретки и переводом строки. CR (0x0d) только устанавливает "пишущую головку" в начало строки, но не переходит к следующей строке. В DOS это делается написанием перевода строки (ASCII 0x0a), и оно полностью не зависит от CR. Можно перейти к следующей строке в любом горизонтальном положении и продолжить ввод. Когда кто-то вводит имя, очевидно, что Служба ввода AH=0Ah будет внутренне печатать и CR, и LF, позволяя печатать следующее сообщение в отдельной строке, но входной буфер будет иметь только CR.

Другие вопросы по тегам