Turbo汇编器多输入重叠

时间:2017-09-23 12:53:35

标签: assembly tasm

我是汇编语言的新手,我的代码遇到了问题。起初我尝试了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 个答案:

答案 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)

所有打印都在同一行上完成。为了进入下一行,你需要打印\ n \ r,但当然不喜欢那些由高级语言解释的那些。您需要使用他们的ASCII码:13,10。因此,使用以下代码扩展您的代码(.data部分):

newline db 13,10,"$"

无论您想要转到新行,只需打印:

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

enter image description here

同样message4应该是"您的性别是:"," $"