首先是一开始的代码,目的是将从键盘输入的字符串进行输出
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
INPUT DB 50,0,50 DUP(0) ;INPUT只是一个标号, 50为最大允许输入字符数,0仅做占位,输入后将会填入实际输入字符数,后面再占上50个字节
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INPUT
MOV AH,10
INT 21H
MOV DI,OFFSET INPUT+1 ;取得实际输入字符数所在的偏移地址
MOV BL,[DI] ;取得实际输入字符数,注意用BL,若用BX,则会取得一个字(两个字节)
MOV AX,'$' ;不能直接将'$'写入内存,要借助寄存器
MOV [BX+DI+1],AX ;加入结束符
MOV AH,9 ;调用9号中断,将输出DS:DX为首地址,到'$'为止的字符串
MOV DX,OFFSET INPUT+2 ;将偏移地址送入DX
INT 21H ;中断显示输出
MOV AX,4C00H ;4号中断返回
INT 21H
CODE ENDS
END START
看起来这段代码好像没有什么问题,
但实测效果如下
看起来好像并没有输出,再进入debug模式调试一番,看看原因
字符串明显已经读入内存
上图显示输出也没问题,那是什么原因的
不妨对上述代码稍作补充
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
INPUT DB 50,0,50 DUP(0)
STRING DB "YOUR INPUT IS:$"
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INPUT
MOV AH,10
INT 21H
MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX
MOV DX,OFFSET STRING
MOV AH,9
INT 21H
MOV DX,OFFSET INPUT+2
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
运行结果如下:
显然是输出把输入的字符覆盖了
即输出字符之前应先进行回车
那只需在数据段里加上如下代码
NEWLINE DB 13,10,'$'
每次输出前先输出回车和换行即可
整理后代码如下
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
NEWLINE DB 13,10,'$'
INPUT DB 50,0,50 DUP(0)
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INPUT
MOV AH,10
INT 21H
MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX
MOV DX,OFFSET NEWLINE
MOV AH,9
INT 21H
MOV DX,OFFSET INPUT+2
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
运行效果如下
另外对于结束符的添加,此处做记录
MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX