请把下面的程序修改成可以输入100的程序(现在的程序无法输入100进行运行)
18,在输入十个学生成绩后,在界面显示及格人数x个,不及格人数y个。
DISP_STR MACRO X;宏定义:提示信息显示。
MOV DX,OFFSET X
MOV AH,09H
INT 21H
ENDM
DRLF MACRO;宏定义:回车换行。
MOV DL,0DH;回车
MOV AH,02H;系统功能调用
INT 21H
MOV DL,0AH;换行
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT;数据段,对字符串和操作数进行定义。
MSG1 DB 'Please input ten scores:','$'
MSG2 DB 'Input error!','$'
MSG3 DB 'Ten scores are:','$'
MSG4 DB 'The number of students who have passed the exam is:','$'
MSG5 DB 'The number of students who have failed the exam is:','$'
MSG6 DB 'Please input ten scores again:','$'
BUF DB 128 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
DISP_STR MSG1;提示输入信息。
MOV CX,10 ;循环输入十个两位十进制数据。
MOV SI,0 ;设置数据区的首地址。
IN_LOOP:
MOV AH,1 ;以下8行是输入一个数据的第一个字符。
INT 21H
CMP AL,'0'
JB IN_ERROR
CMP AL,'9' ;若输入的字符的ASCII字符比'0'小或比'9'大,提示输入错误。
JA IN_ERROR
MOV [BUF+SI],AL
INC SI ;每输入一个字符,地址加1。
MOV AH,1 ;以下8行是输入一个数据的第二个字符。
INT 21H
CMP AL,'0'
JB IN_ERROR
CMP AL,'9'
JA IN_ERROR
MOV [BUF+SI],AL
INC SI
MOV AH,1 ;输入时用空格将输入的数据隔开,但空格并不保存在内存中,
INT 21H ;即输入的数据在内存中是连续存放的。
LOOP IN_LOOP ;一个数据输入完,输入下一个数据。
JMP OUT_PUT1 ;十个数据输入完之后,跳转到out_put1。
IN_ERROR: ;输入错误时,提示输入“input error”。
DISP_STR MSG2 ;换行提示重新输入十个数据。
DRLF
DISP_STR MSG6
MOV SI,0
MOV CX,10
JMP IN_LOOP
OUT_PUT1: ;out_put1是提示输出信息。
DRLF
DISP_STR MSG3
MOV SI,0
MOV CX,10
OUT_PUT2: ;out_put2是在屏幕上显示输出输入的十个分数。
MOV DL,[BUF+SI] ;以下四行是输出一个数据的第一个字符。
INC SI
MOV AH,2
INT 21H
MOV DL,[BUF+SI] ;以下四行是输出一个数据的第二个字符。
INC SI
MOV AH,2
INT 21H
MOV DL,' ' ;输出显示的两数据之间用空格隔开。
MOV AH,2
INT 21H
LOOP OUT_PUT2 ;一个数据输出完,输出下一个数据。
MOV CX,20 ;以下deal1, deal2, deal3是对十个数据进行处理。
MOV SI,0
DEAL1: ;deal1 是将每个字符的ASCII值减去30H得到该字符的真值。
MOV AL,[BUF+SI]
SUB AL,30H
MOV [BUF+SI],AL
INC SI
LOOP DEAL1
MOV SI,0
MOV CX,10
DEAL2: ;deal2 是将偶地址中真值乘以10再加上紧跟其后的奇地址中的真值
MOV AL,[BUF+SI] ;从而得到输入的两位十进制数的真值,并将此真值以字的形式
MOV BH,0 ;存入以buf为始的内存单元。
MOV BL,[BUF+SI+1]
MOV DH,10
MUL DH
ADD AX,BX
MOV WORD PTR[BUF+SI],AX
ADD SI,2
LOOP DEAL2
MOV BL,0
MOV SI,0
MOV CX,10
DEAL3: ;deal3 是将得到的分数与59作比较。
MOV AX,WORD PTR[BUF+SI] ;若大于59,则及格,转移到count记数。
ADD SI,2 ;
CMP AX,59
JA COUNT
RETURN: ;return是返回,判断完一个数以后进行下一个数的判断。
LOOP DEAL3
JMP OUT_PUT3 ;如果判断完,则转移到out_put3.
COUNT: ; count是用于记数,记录及格的人数。
INC BL
JMP RETURN
OUT_PUT3: ;out_put3是用于显示及格与否的人数。
DRLF
DISP_STR MSG4 ;先显示及格人数。
MOV DL,BL
ADD DL,30H
MOV AH,2
INT 21H
DRLF
DISP_STR MSG5 ;再显示不及格人数。
MOV DL,10
SUB DL,BL
ADD DL,30H
MOV AH,2
INT 21H
PRO_END: ;程序结束,返回DOS。
MOV AH,4CH
INT 21H
CODE ENDS
END START