从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区
检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母;
将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。
DATAS SEGMENT
MAXLEN DB 10 ;0ah子功能入口参数,指定最大字符数
INPTLEN DB ? ;0ah子功能出口参数,返回实际输入的字符数
STR1 DB 11 DUP(0) ;oah子功能的字符缓冲区
STR2 DB 11 DUP(0) ;o9h子功能的字符缓冲区
DATAS ENDS
STACKS SEGMENT
DW 40H DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MAXLEN ;输入字符串
MOV AH,0AH
INT 21H
XOR CX,CX
MOV CL,INPTLEN ;循环次数为实际输入的字符数
LEA SI,STR1
LEA DI,STR2
CALL DELETENUM
CALL TRANaA
mov [DI],'$' ;在结果的末端加“$”
CALL NEWLINE ;调用回车换行子程序
LEA DX,STR2 ;回显操作结果
MOV AH,09H
INT 21
MOV AH,4CH
INT 21H
DELETENUM PROC ;检测并清除数字字符
PUSHF
PUSH AX
PUSH DX
LOP1:CMP [SI],30H ;判断当前字符是否为数字字符
JAE L1
JMP L2
L1: CMP [SI],39H
JA L2
JMP L3
L2: MOV AL,[SI] ;若不是,保存至STR2
MOV [DI],AL
INC DI
L3: INC SI ;若是,不保存
LOOP LOP1
POP DX
POP AX
POPF
RET
DELETENUM ENDP
TRANaA PROC ;将小写转化为大写
PUSHF
PUSH AX
PUSH DX
LOP:CMP [SI],'a'
JAE L4
JMP L7
L4: CMP [SI],'z'
JNB L6
JMP L7
L6: SUB [SI],20H
L7: MOV AL,[SI]
MOV [DI],AL
INC DI
INC SI
LOOP LOP
POP DX
POP AX
POPF
RET
TRANaA ENDP
NEWLINE PROC ;回车换行子程序
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
CODES ENDS
END START
这程序能到运行阶段?编译时就有不少的错误吧,如 mov [DI],'$' 这样的没有指定操作数大小的问题,应该写成 mov byte ptr [DI],'$' ,下面还有好几处。
主要的错误是转大写时,没有指定源和目标地址以及计数器 CX 导致程序意外操作。