我是汇编语言的新手,我的代码遇到了问题。起初我尝试了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
答案 0 :(得分:3)
你应该写下终止字符' $'在每次AH = 0Ah调用之后显式地(或使用单独的缓冲区)。否则,如果您首先输入字符串' 123456'然后' abc',缓冲区将在下次保留123456\n$$$$$$...
和abc\n56\n$$$$$
。
中断AH = 0Ah将在DX + 1位置读取字符数。由于某种原因,输入中断使用' \ n'作为终止字符,而AH = 09h / print字符串使用' $'。
;; 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
Some random reference to AH=0Ah / AH=09h services
另一个问题,如其他答案所示,是DOS如何将终端作为具有单独回车和换行的模拟打字机进行管理。 CR(0x0d)仅设置"写入头"到行的开头,但不会前进到下一行。在DOS中,这是通过写入换行符(ASCII 0x0a)来完成的,它完全独立于CR。可以在任何水平位置移动到下一行并继续键入。 当输入一个名称时,显然输入服务AH = 0Ah将在内部键入CR和LF,允许下一条消息打印在单独的行上,但输入缓冲区只有CR。
答案 1 :(得分:2)