📄 test.asm
字号:
mov ax,bx
mov cl,10
div cl
;----------------------------------------------------------------------------
;将结果转化为ASCII码存储
or ah,30h ;小数部分
mov resultes[di+2],ah
aam
;-----------------------------------------------------------------
;统计60以下、60-70、70-80、80-90、90-100分段内的人数
cmp ah,6
jl x1
cmp ah,7
jl x2
cmp ah,8
jl x3
cmp ah,9
jl x4
inc n[4]
jmp rt
x1: inc n
jmp rt
x2: inc n[1]
jmp rt
x3: inc n[2]
jmp rt
x4:inc n[3]
;-------------------------------------------------
rt:
or al,30h ;转换为ASCII码
or ah,30h
mov resultes[di],ah ;十位
mov resultes[di+1],al ;个位
;==============================================================================
pop bx
pop dx
pop cx
pop si
pop ax
ret
compute endp
;**************************************************************************
sort proc
push bx
push dx
push cx
push ax
push si
push di
mov cx,0
mov cl,snumber2 ;学生数赋值给cx计数用
dec cx
loop1: ;将每个学生单元看成一个元素进行冒泡排序loop1,loop2
mov dx,cx
mov di,0
mov si,0
loop2:
mov bx,si
loop3: ;loop3,loop4实现两个学生的比较并交换大小
mov al,student[bx+2]
cmp al,student[bx+22]
jg swap ;交换其后的所有字符,直至所比较的两个学生完成交换
jl xxxx ;小于的时候,比较下一个学生
inc bx ;al与student[bx+2]相等,继续比较下一个字符
jmp loop3
swap:
mov al,resultes[di] ;交换成绩
xchg al,resultes[di+3]
mov resultes[di],al
mov al,resultes[di+1]
xchg al,resultes[di+4]
mov resultes[di+1],al
mov al,resultes[di+2]
xchg al,resultes[di+5]
mov resultes[di+2],al
loop4: ;交换姓名
mov al,student[bx+2]
xchg al,student[bx+22]
mov student[bx+2],al
inc bx
cmp al,'$'
jnz loop4
xxxx: add si,20
add di,3
loop loop2
mov cx,dx
loop loop1
pop di
pop si
pop ax
pop cx
pop dx
pop bx
ret
sort endp
;*****************************************************************************
display proc
push ax
push dx
lea dx,stars ;显示一行星号
mov ah,9
int 21h
;---------------------------------------------------------------------------
lea dx,show_result ;显示输出结果提示字符
mov ah,9
int 21h
;--------------------------------------------------------------------
mov si,0
mov di,0
mov cx,0
mov cl,snumber2 ;snumber2中存的是学生总数
output: ;循环输出,直至输出所有学生姓名及成绩
;--------------------------------------------------------------------------
lea dx,student[si] ;显示学生姓名
add dx,2 ;姓名的首地址
mov ah,9
int 21h
lea dx,maohao ;显示一个冒号
mov ah,9
int 21h
;-------------------------
mov dl,resultes[di] ;显示学生平均成绩(十位)
mov ah,2
int 21h
mov dl,resultes[di+1] ;显示学生平均成绩(个位)
mov ah,2
int 21h
mov dl,'.' ;打印小数点
mov ah,2
int 21h
mov dl,resultes[di+2] ;显示学生平均成绩(小数位)
mov ah,2
int 21h
;-------------------------------------------------------------------
mov ah,02h ;每打印出一个学生姓名及成绩就回车换行一次
mov dl,0dh
int 21h
mov dl,0ah
int 21h
;-------------------------------------------
add si,20 ;改变指针,指向下一个学生
add di,3
loop output
;---------------------------------------------------------------------
;输出60以下、60-70、70-80、80-90、90-100分段内的人数
lea dx,fenshuduan
mov ah,9
int 21h
mov si,0
mov cx,5
dddd:
mov al,n[si]
aam
or ah,30h
or al,30h
mov bh,ah
mov bl,al
lea dx,space
mov ah,9
int 21h
cmp bh,30h ;假如分数段的人数为一位数,不打印十位的0
je dybl ;否则打印出两位数
mov ah,2
mov dl,bh
int 21h
dybl:
mov ah,2
mov dl,bl
int 21h
inc si
loop dddd
;-----------------------------------------------------------------------
lea dx,stars ;显示一行星号
mov ah,9
int 21h
pop dx
pop ax
ret
display endp
;****************************************************************************
main endp
;-------------------------------------------------------------------------
code ends
;*************************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -