2017-09-23 56 views
3

我是新来的汇编语言,我遇到了我的代码问题。起初,我尝试了1输入,然后1输出,它工作得很好。但是当我尝试2个输入。这是问题出现的时间。当它询问“性别”输入1和输出1似乎重叠时。Turbo Assembler多输入重叠

我已经彻底搜索并设法找到一个要求相同的事情,但他/她的不同,我似乎无法理解。我希望有人能帮帮忙。这是给学校的。

全码:

.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

打印新行以前进到下一行。 –

+0

请问你能更具体吗? – eLjA

回答

2

全部印刷在同一行完成。为了推进到下一行,您需要打印\ n \ r,但当然不是这样,因为这些是由高级语言解释的。你需要使用他们的ASCII码:13,10。所以用这个扩展代码(.data段):

newline db 13,10,"$" 

无论您想去哪里去新线刚刚打印:

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

enter image description here

而且message4应该是“您的性别是:“,”$“

+0

我在下面添加了“newline db 13,10”,$“”。数据 但是我似乎在添加“newline mov,ah,09h”时出现错误。 – eLjA

+0

格式不正确 –

+0

非常感谢!我得到它的工作! :) – eLjA

3

您应该在每个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 

Some random reference to AH=0Ah/AH=09h services

另一个问题,如在对方的回答表明,是DOS如何管理该终端为具有单独的回车和换行的模拟打字机。 CR(0x0d)仅将“写头”设置为行的开头,但不会前进到下一行。在DOS中,这是通过写入换行符(ASCII 0x0a)完成的,它完全独立于CR。可以在任何水平位置移动到下一行并继续输入。 当输入一个名字时,显然输入服务AH = 0Ah将在内部键入CR和LF,允许下一条消息被打印在单独的行上,但输入缓冲区只有CR。

+0

感谢您的答案。我也会尝试这个。 – eLjA