题目没写明白:
没说清array里是所有人的成绩还是只这几个人的;
没说清是所有人都加5分还是只是低于80的加;
没说清总分是所有人的还是只这几个人的、是加分后的还是加分前的;
只好按我的理解来写:
array里可能是全班人的成绩(比如20个人)
只是给不够80分人的加5分、并且只显示出这些人加分后的成绩
总分是所有人调整后的分数和
另外注意程序是把所有低于80分的都处理(而不是数7个完事)
程序如下:
students equ 20
.model small
.stack 2048
.data
array db 100,99,88,77,66,90,80,70,60,40,20,91,95,96,79,76,55,99,100,88
new db students dup (?)
sum dw 0
crlf db 13,10,36
txt db 'SUMMARY OF CLASS: $'
.code
main: mov ax,seg array
mov ds,ax
mov es,ax
mov si,offset array ;将使用lodsb从array中读入分数(由ds:si定位)
mov di,offset new ;并按要求将新分数存至new中(由es:di定位)
mov cx,students ;学生人数即循环次数
cld ;为lodsb/stosb指令清除方向标志
mov bx,1 ;为输出美观,用bx当学号吧
lp: mov dl,'(' ;这段输出学号,学号两边用括号扩起来
call putc
push bx ;学号
call print
mov dl,')'
call putc
mov dl,9 ;用制表符分开
call putc
lodsb ;从array数组读一个分数(字节型数据)
xor ah,ah ;ah清零,算总分时是要加上高8位的
cmp al,80 ;是否高于80分
jae above80 ;大于或等于80分的跳过
add al,5 ;低于80的加5分
mov dl,'*' ;先输出一个星号表示该成绩是调整后的成绩
call putc
above80: stosb ;所有人的最终成绩存回new数组
add sum,ax ;最终成绩加到总分里
push ax ;输出该生最终成绩
call print
mov dx,offset crlf ;回车换行
call puts
inc bx ;假装学号加1
loop lp ;循环
call puts ;再换行一下
mov dx,offset txt ;输出全班总分的标题
call puts
mov ax,sum
push ax
call print ;输出总分
mov dx,offset crlf ;回车换行
call puts
mov ah,4ch ;程序结束
int 21h
print proc near
mov bp,sp
push ax
push bx
push cx
push dx
mov ax,[bp+2]
call printax
pop dx
pop cx
pop bx
pop ax
ret 2
print endp
;以10进制输出ax中的无符号整数
printax proc
mov bx,10 ;bx是除数
or ax,ax ;是0则直接输出
jnz @f
mov dl,'0'
call putc
ret
@@: xor dx,dx
div bx
mov cx,ax
or cx,dx ;若商与余数都为0则结束递归
jz @f
push dx ;留存DX中的余数以在递归后输出
call @b ;递归
pop dx ;从最高位开始恢复余数
add dl,'0'
call putc
@@: ret
printax endp
putc proc
push ax
mov ah,2
int 21h
pop ax
ret
putc endp
puts proc
push ax
mov ah,9
int 21h
pop ax
ret
puts endp
end main
执行结果:
(1) 100
(2) 99
(3) 88
(4) *82
(5) *71
(6) 90
(7) 80
(8) *75
(9) *65
(10) *45
(11) *25
(12) 91
(13) 95
(14) 96
(15) *84
(16) *81
(17) *60
(18) 99
(19) 100
(20) 88
SUMMARY OF CLASS: 1614