编制一段完整的程序,从键盘上输入一个以‘$’结尾的字符串,然后对其中的数字字符(0~9)和非数字字符个数分别进行统计,并以十进制形式输出显示统计结果。
OUTPUTASTR MACRO STRADDR ;
PUSH AX
PUSH DX
LEA DX, STRADDR
MOV AH, 9
INT 21H
POP DX
POP AX
ENDM
INPUTASTR MACRO SADDR
PUSH DX
PUSH AX
LEA DX, SADDR
MOV AH, 0AH
INT 21H
POP AX
POP DX
ENDM
DATAS SEGMENT
CUE1 db "Please input a string(less than 32 letters): $"
buf db 40H dup('$')
cue2 db "Your string is too long!Please input again: $"
NEWLINE db 13,10,'$'
CUE3 DB "The sum of numbers is: $"
CUE4 DB "The sum of non-numbers is: $"
NUM DB 0, 0
DATAS ENDS
STACKS SEGMENT PARA STACK
DW 20H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
AGAIN:
OUTPUTASTR CUE1
INPUTASTR BUF
MOV AL, BUF+1
CMP AL, 32
JA ILLEGOL
LEA SI, BUF+2
XOR CX, CX
MOV CL, BUF+1
XOR DX, DX
LOP:
MOV BL, [SI]
CMP BL, 30H
JB ISNOTNUM
CMP BL, 39H
JA ISNOTNUM
INC DL ; NUMBER
CONTINUE:
INC SI
LOOP LOP
MOV NUM, DL
MOV NUM[01H], DH
OUTPUTASTR NEWLINE
OUTPUTASTR CUE3
XOR AX, AX
LEA SI, NUM
MOV AL, [SI]
CALL B2D
OUTPUTASTR NEWLINE
OUTPUTASTR CUE4
XOR AX, AX
MOV AL, [SI+1]
CALL B2D
MOV AH,4CH
INT 21H
ISNOTNUM:
INC DH ; NOT NUMBER
JMP CONTINUE
ILLEGOL:
OUTPUTASTR NEWLINE
OUTPUTASTR CUE2
OUTPUTASTR NEWLINE
JMP AGAIN
B2D PROC ;真值转10进制输出
PUSH BX
PUSH CX
PUSH DX
XOR BX, BX
MOV BL, 10
xor CX, CX
LOP1:
DIV BL ;AX / BL = AL ... AH
PUSH AX
inc CL
AND AX, 00FFH
CMP AX, 0
JNE LOP1
lop2:
pop ax
MOV DL, AH
ADD DL, 30H
MOV AH, 2
INT 21H
loop lop2
pop DX
pop CX
pop BX
RET
B2D ENDP
CODES ENDS
END START
编写一个比赛得分程序。共有7个评委,按百分制打分,计分原则是去掉一个最高分和一个最低分,求平均值。
OUTPUTASTR MACRO STRADDR ;输出一个字符串,STRADDR是字符串的首地址
PUSH AX
PUSH DX
LEA DX, STRADDR
MOV AH, 9
INT 21H
POP DX
POP AX
ENDM
DATAS SEGMENT
cue1 db "Please the $"
cue2 db " judges grades: $"
NEWLINE DB 13, 10, '$'
INP DB 30H DUP('$')
NUM DB 10H DUP(0)
RESULT DW 0
ILG DB "illegal! Try again!$"
CUE3 DB "Averange is: $"
DATAS ENDS
STACKS SEGMENT PARA STACK
DW 30H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
RESTART:
xor cx, cx
mov cl, 30h
XOR SI, SI
INPUT:
mov ah, 9h
lea dx, cue1
int 21h
INC CL
mov ah, 02h
mov dl, cl
int 21h
mov ah, 9h
lea dx, cue2
int 21h
PUSH CX; CX = 3XH
SUB CL, 31H
MOV DI, CX
ADD DI, CX
ADD DI, CX
ADD DI, CX
ADD DI, CX
LEA DX, INP[DI]
MOV AH, 0AH
INT 21H
MOV CL, INP[DI+1]
CMP CL, 3
JA ILLEGAL
;EXCHANGE TO TRUE VALUE
XOR AH, AH
MOV BL, 10
XOR DL, DL
INC DI
EXCHANGE:
PUSH CX; CX <= 3
INC DI
MOV AL, INP[DI]
CMP AL, 30H
JB ILLEGAL
CMP AL, 39H
JA ILLEGAL
SUB AL, 30H
ADD AL, DL
CMP CL, 1
JE MULDONE
MUL BL
MULDONE:
MOV DL, AL
CMP DL, 100
JA ILLEGAL
MOV NUM[SI], DL
POP CX
LOOP EXCHANGE
; PREPARE FOR NEXT INPUTMENT
INC SI
LEA DX, NEWLINE
MOV AH, 09H
INT 21H
POP CX
CMP CL, 37H
JNE input
;INPUT PART HAS DONE
;SORT
LEA SI, NUM
CALL SORT
;SORT DONE
; SHOW MEMORY
;MOV CL, 7
;LEA DI, NUM
;OUTPUT:
;OUTPUTASTR NEWLINE
;OUTPUTASTR CUE3
;XOR AX,AX
;MOV AL, [DI]
;CALL B2D
;INC DI
;LOOP OUTPUT
;SHOW MEMORY DONE
;GET sum of the five numbers
LEA DI, RESULT
LEA SI, NUM
CALL SUM
;SHOW SUM
;MOV AX, RESULT
;CALL B2D
OUTPUTASTR NEWLINE
;SHOW AVERANGE
OUTPUTASTR CUE3
MOV AX, RESULT
XOR BX, BX
MOV BL, 5
CALL AVERANGE
EXIT:
MOV AH,4CH
INT 21H
ILLEGAL:
OUTPUTASTR NEWLINE
OUTPUTASTR ILG
OUTPUTASTR NEWLINE
JMP RESTART
AVERANGE PROC;求平均值
PUSH DX
PUSH CX
PUSH BX
PUSH AX
XOR CX, CX
MOV CL, 2
AVE:
DIV BL
PUSH BX
XOR DX, DX
MOV DL, AH
AND AX, 00FFH
CMP CL, 1
JE ROUNDING; 四舍五入
CALL B2D
CMP CL, 2
JE PRINTPOINT
CTN:
MOV AX, DX
MOV BL, 10
MUL BL
POP BX
LOOP AVE
RT:
POP AX
POP BX
POP CX
POP DX
RET
ROUNDING: 四舍五入
PUSH DX
PUSH AX
PUSH BX
MOV AX, DX
MOV BL, 10
MUL BL
POP BX
DIV BL
CMP AH, 4
JBE B
POP AX
ADD AX, 1
CALL B2D
JMP A
B:
POP AX
CALL B2D
A:
POP DX
POP BX
JMP RT
PRINTPOINT:
PUSH AX
PUSH DX
MOV AH, 02H
MOV DL, '.'
INT 21H
POP DX
POP AX
JMP CTN
AVERANGE ENDP
SUM PROC; get sum
; SI SHOULD HAVE BEEN ASSIGNED SCOURSE ADDRESS
; DI SHOULD HAVE BEEN ASSIGNED TARGET ADDRESS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR CX, CX
XOR AX, AX
XOR DX, DX
MOV CL, 5; the numbers which are about to sum are 5
INC SI ;jump to the second number
SUMLOOP:
MOV DL, [SI]
INC SI
ADD AX, DX
LOOP SUMLOOP
MOV [DI], AX
POP DX
POP CX
POP BX
POP AX
RET
SUM ENDP
B2D PROC ; true value to decimal and output
PUSH BX
PUSH CX
PUSH DX
PUSH AX
XOR BX, BX
MOV BL, 10
xor CX, CX
LOP1:
DIV BL ;AX / BL = AL ... AH
PUSH AX
inc CL
AND AX, 00FFH
CMP AX, 0
JNE LOP1
lop2:
pop ax
MOV DL, AH
ADD DL, 30H
MOV AH, 2
INT 21H
loop lop2
POP AX
pop DX
pop CX
pop BX
RET
B2D ENDP
;SORT FUNCTION
SORT PROC; SI SHOULD HAVE BEEN ASSIGNED
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR CX, CX
MOV CL, 7 ;SET COUNTING ELEMENT NUMBER, CAN BE CHANGED
OUTERLOOP:
PUSH CX
SUB CL, 1
PUSH SI
INTERLOOP:
MOV AL, [SI]
MOV BL, [SI+1]
CMP AL, BL
JA ALTB
CONTINUE1:
INC SI
CMP CL, 0
JE CONTINUE2
DEC CL
JNE INTERLOOP
CONTINUE2:
POP SI
POP CX
DEC CX
CMP CX, 0
JNE OUTERLOOP
POP DX
POP CX
POP BX
POP AX
RET
ALTB: ; exchange two unsort numbers
MOV DL, AL
MOV AL, BL
MOV BL, DL
MOV [SI], AL
MOV [SI+1], BL
JMP CONTINUE1
SORT ENDP
CODES ENDS
END START