主题:汇编初学者求救
输入一个字符串,然后统计字符数和字母数字的个数,为什么统计不了??
LENGTH=128
;
DSEG SEGMENT
BUFF DB LENGTH
DB ?
DB LENGTH DUP(0)
MESS0 DB 'Please input a string:','$'
MESS1 DB 'Length = ','$'
MESS2 DB 'Digtal = ','$'
MESS3 DB 'ZIMU = ', '$'
DSEG ENDS
;
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX, OFFSET MESS0
CALL DISPMESS
MOV AH,0AH
INT 21H
CALL NEWLINE
MOV BH,0
MOV BL,0
MOV CL,BUFF+1
MOV CH,0
JCXZ COK
MOV SI,OFFSET BUFF+2
AGAIN: MOV AL,[SI]
INC SI
CMP AL,'0'
JB NEXT
CMP AL,'9'
JA NODEC
INC BH
; JMP NEAR NEXT
NODEC: OR AL,20H
CMP AL,'a'
JB NEXT
CMP AL,'z'
JA NEXT
INC BL
NEXT: LOOP AGAIN
;
COK: MOV DX,OFFSET MESS1
CALL DISPMESS
MOV AL,BUFF+1
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
LEA DX,MESS2;
CALL DISPMESS
MOV AL,BH
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
LEA DX,MESS3;
CALL DISPMESS
MOV AL,BL
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
MOV AX,4C00H
INT 21H
;
DISPAL PROC
MOV CX,3
MOV DL,10
DISP1: DIV DL
XCHG AH,AL
ADD AL,'0'
PUSH AX
XCHG AH,AL
XOR AH,AH
LOOP DISP1
MOV CX,3
DISP2: POP DX
CALL ECHOCH
LOOP DISP2
RET
DISPAL ENDP
;
DISPMESS PROC
MOV AH,9
INT 21H
RET
DISPMESS ENDP
;
ECHOCH PROC
MOV AH,2
INT 21H
RET
ECHOCH ENDP
;
NEWLINE PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
CSEG ENDS
END START
LENGTH=128
;
DSEG SEGMENT
BUFF DB LENGTH
DB ?
DB LENGTH DUP(0)
MESS0 DB 'Please input a string:','$'
MESS1 DB 'Length = ','$'
MESS2 DB 'Digtal = ','$'
MESS3 DB 'ZIMU = ', '$'
DSEG ENDS
;
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX, OFFSET MESS0
CALL DISPMESS
MOV AH,0AH
INT 21H
CALL NEWLINE
MOV BH,0
MOV BL,0
MOV CL,BUFF+1
MOV CH,0
JCXZ COK
MOV SI,OFFSET BUFF+2
AGAIN: MOV AL,[SI]
INC SI
CMP AL,'0'
JB NEXT
CMP AL,'9'
JA NODEC
INC BH
; JMP NEAR NEXT
NODEC: OR AL,20H
CMP AL,'a'
JB NEXT
CMP AL,'z'
JA NEXT
INC BL
NEXT: LOOP AGAIN
;
COK: MOV DX,OFFSET MESS1
CALL DISPMESS
MOV AL,BUFF+1
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
LEA DX,MESS2;
CALL DISPMESS
MOV AL,BH
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
LEA DX,MESS3;
CALL DISPMESS
MOV AL,BL
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
MOV AX,4C00H
INT 21H
;
DISPAL PROC
MOV CX,3
MOV DL,10
DISP1: DIV DL
XCHG AH,AL
ADD AL,'0'
PUSH AX
XCHG AH,AL
XOR AH,AH
LOOP DISP1
MOV CX,3
DISP2: POP DX
CALL ECHOCH
LOOP DISP2
RET
DISPAL ENDP
;
DISPMESS PROC
MOV AH,9
INT 21H
RET
DISPMESS ENDP
;
ECHOCH PROC
MOV AH,2
INT 21H
RET
ECHOCH ENDP
;
NEWLINE PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
CSEG ENDS
END START