Turbo 汇编器多输入重叠

Turbo Assembler Multiple Inputs Overlap

我是汇编语言的新手,我的代码有问题。起初我尝试了 1 个输入,然后是 1 个输出,它工作得很好。但是当我尝试 2 个输入时。这就是问题出现的时候。当它询问 "Gender" 输入 1 和输出 1 似乎与它重叠。

我已经彻底搜索并设法找到了一个问同样问题的问题,但 his/hers 是不同的,我似乎无法理解。我希望有人能帮帮忙。这是给学校的。

完整代码:

.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

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

newline db 13,10,"$"

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

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

另外 message4 应该是 "Your gender is: ","$"

您应该在每次 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 如何将终端作为模拟打字机进行管理,带有单独的回车 return 和换行符。 CR (0x0d) 仅将 "writing head" 设置为行首,但不会前进到下一行。在 DOS 中,这是通过写入换行符 (ASCII 0x0a) 来完成的,它完全独立于 CR。可以在任何水平位置移动到下一行并继续键入。 当输入名称时,显然输入服务 AH=0Ah 将在内部键入 CR 和 LF,允许在单独的行上打印下一条消息,但输入缓冲区将只有 CR。