DATAS SEGMENT
MESSAGE DB ‘Please enter a string.’,13,10,’$’
CR DB 13,10,’$’ ;回车换行
STRING4 DB ‘LowAlpha: $’
ALPHAL DB 0 ;小写字母
STRING DB 100
DB 0
DB 80 DUP(0) ;定义缓冲区
DATAS ENDS
STACKS SEGMENT
DB 200 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
HEAD:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESSAGE ;输出提示语
MOV AH,09H
INT 21H
LEA DX,STRING
MOV AH,0AH
INT 21H ;把字符串输入到BUF区
LEA DX,CR
MOV AH,09H
INT 21H ;以上为回车换行
LEA SI,STRING+2 ;把字符串首地址存入BX
MOV CL,STRING+1 ;把字符个数存CX
MOV CH,0
NEXT1:
MOV DL,[SI]
CMP DL,’a’
JB NEXT2
CMP DL,’z’
JA NEXT2 ;ASCII码小于a和大于z的跳过,其余的减32
SUB DL,20H ;大小写字母的ASCII码差32
INC ALPHAL ;ALPHAL++
NEXT2:
MOV AH,02H
INT 21H
INC SI ;BX自加,判断下一个字符
DEC CX ;CX自减,最终将是0
JNE NEXT1 ;CX非零时,跳回NEXT1
MOV DX,OFFSET CR ;输出回车换行
MOV AH,09H
INT 21H
OVER2:
LEA DX,STRING4
MOV AH,9
INT 21H
XOR AX,AX
MOV AL,ALPHAL
CALL DISPLAY
MOV AH,4CH
INT 21H
ENDLINE PROC NEAR ;控制输出格式,输出回车换行子程序
MOV AH,2
MOV DL,0AH
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
RET
ENDLINE ENDP
DISPLAY PROC NEAR ;输出两位数字的子程序
MOV BL,10 ;10送BL
DIV BL ;AX/BL,AL=商,AH=余数
PUSH AX ;保存AX中的信息
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H ;输出十位数
POP AX ;出栈送AX
MOV DL,AH
ADD DL,30H
MOV AH,2
INT 21H ;输出个位数
RET
DISPLAY ENDP
CODES ENDS
END START