求解答,汇编语言如何设计10个学生成绩统计

从内存SCORE单元开始,连续存放着10个学生的某门课成绩。

①编写程序统计90~100,80-89, 70~79, 60~69, 60以下各段人数。并将结果放在数据段、偏移地址为RESULT开始的顺序单元中。
②试编程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。
③要求显示结果。

要求如此,请达人解答

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,
; 并送显示屏显示,未考虑四舍五入
; 入口:AH=二进制数,BH=除数,CX=保留小数位数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;显示一个小数点
pop ax
mov bl,10 ;乘数
@@Dec_Frac: mov al,ah ;余数不为0,处理小数部分
mul bl ;余数乘10,继续做除法
div bh ;除以除数,取商数作为结果的一位小数
or al,30h
mov dl,al
call Output_Chr ;显示一位小数
loop @@Dec_Frac
ret
Dec_Frac EndP
; -------------------------------------
SCORE db 56,69,84,82,73,88,99,63,100,80 ; 成绩单
Elements equ ($-SCORE)/Type SCORE ;元素个数
RESULT db 6 dup(0) ; 各分数段计数
SUM dw 0 ;总分
AVER db ? ;平均分
prompt_Res db '00---59: $'
prompt_Ave db 13,10,'Average: $' ;提示显示平均分
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -------------------------------------
; 统计低于60分、60-69、70-79、80-89、90-100各分数段人数并显示
lea si,SCORE ; 成绩首地址
mov cx,Elements ;成绩数目
mov dl,10 ; 用于除10
cld
@@Statics: lodsb ; 提取成绩
xor ah,ah
add SUM,ax ;累计总分
div dl ; 除10
cmp al,5 ; >5,及格
jg $+4
mov al,5 ; <=5,不及格
sub al,5 ; 减5,分数段计数地址偏移量
cbw ;
push ax
pop bx
inc RESULT[bx] ; 计数增1
loop @@Statics ; 循环,统计下一个成绩
mov al,RESULT[5] ;取100分人数
add RESULT[4],al ;加到90-100分数段
mov bl,59h
mov cx,5
lea si,RESULT ;各分数段计数数组首地址
lea dx,prompt_Res ; 统计结果字符串地址
List_Res: mov ah,9 ;显示分数段提示信息
int 21h
lodsb ;读入计数值
xor ah,ah
call Dec_ASCII ; 显示统计结果
call Output_CTLF ;输出一个回车、换行
mov al,bl
inc al
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res[5],ax
pop cx
loop List_Res
; -------------------------------------
; 计算并显示平均分
Output prompt_Ave ;提示显示平均分
mov bl,Elements
mov ax,SUM ;取总分
div bl ;平均分取整数部分
mov AVER,al ;保存平均分
xor ah,ah
call Dec_ASCII ;显示平均分
Exit_Proc: lea dx,Press_Key ;提示操作完成,按任意键结束程序
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-12-20

要求不算太难,程序也用不上多长。

参考下列的吧:

第2个回答  2009-11-21
求助完了,怎么不来看看啊?