📄 work5.asm
字号:
data segment
buf db 3
db ?
db 3 dup(?)
num dw 7 dup(0)
var dw ? ;暂存数据
n dw ? ;计数迭代器
max dw ? ;存储最高分在num中的下标
min dw ? ;存储最低分在num中的下标
aveInteger dw ? ;存储平均分整数部分
aveDecimal dw ? ;存储平均分小数部分
ten db 10
tenW dw 10
count dw 5 ;有效分个数
tip1 db "Input 7 judgement mark between 10~20:",0ah,0dh,'$'
tip2 db "Judge mark: $"
tip3 db "Out of range,input again: $"
tip4 db "The final score: $"
data ends
stack1 segment para stack
dw 20h dup(0)
stack1 ends
code segment
assume cs:code, ds:data, ss:stack1
start:
mov ax,data
mov ds,ax
mov dx,offset tip1 ;提示语
mov ah,09h
int 21h
;..............7个裁判分数的输入................
mov cx,7
mov n,0
input:push cx
mov dx,offset tip2 ;提示语
mov ah,09h
int 21h
jmp seq
re: mov dx,offset tip3 ;输入不足2位数字时重输
mov ah,09h
int 21h
seq: lea dx,buf ;数字的输入
mov ah,0ah
int 21h
mov dl,0ah ;换行
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
mov cl,buf+1 ;获取输入字符长度
mov ch,0
lea bx,buf+2
add bx,cx
mov byte ptr [bx],'$' ;将输入最后的0DH变为$
mov var,0 ;将输入字符串的ASC转为数值
lea bx,buf+2
mov al,[bx]
sub al,30h
mul ten
mov var,ax
lea bx,buf+3 ;获取数值的个位
mov cl,[bx] ;个位存于cx
sub cl,30h
mov ch,0
mov bx,var ;十位存入bx
add bx,cx ;十位与个位相加
mov cx,bx ;结果存入cx
cmp cx,20 ;输入超过20
ja re
cmp cx,10 ;输入不足10
jb re
mov bx,n
mov num[bx],cx ;将输入数值顺序存入num的连续空间
add n,2
pop cx
loop input
;.............................................................
;........................找最高分和最低分.....................
mov cx,6
mov bx,0
mov ax,num[bx] ;以ax存储最低分
mov dx,num[bx] ;以dx存储最高分
mov max,bx
mov min,bx
add bx,2
lop1: cmp ax,num[bx]
jbe next1
mov ax,num[bx]
mov min,bx
next1: cmp dx,num[bx]
jae next2
mov dx,num[bx]
mov max,bx
next2: add bx,2
loop lop1
;............................................................
;.....................求平均分...............................
mov dx,min
cmp dx,max ;如果最高分与最低分相同,则循环次数少一次
je L1
mov cx,7
jmp L2
L1: mov cx,6
L2: mov bx,0
mov dx,0 ;dx寄存有效总分
lop2: cmp bx,min ;最低分不计入总分
je next3
cmp bx,max ;最高分不计入总分
je next3
add dx,num[bx]
next3: add bx,2
loop lop2
mov ax,dx
mov dx,0
div count
mov aveInteger,ax
mov cx,2
mov aveDecimal,0
lop3: mov var,dx ;计算小数部分
mov ax,var
mov dx,0
mul tenW
div count
add aveDecimal,ax
loop lop3
;...........................................................
;.........................输出平均分........................
mov dx,offset tip4 ;输出提示语
mov ah,09h
int 21h
mov cx,2
mov ax,aveInteger
lop4: div ten ;输出整数部分
mov bl,al
add ah,30h
push ax
xor ah,ah
mov al,bl
loop lop4
mov cx,2
lop5: pop ax
mov dl,ah
mov ah,02h
int 21h
loop lop5
mov dl,'.' ;输出小数点
mov ah,02h
int 21h
mov cx,2
mov ax,aveDecimal
mov ah,0
lop6: div ten ;输出小数部分
mov bl,al
add ah,30h
mov dl,ah
mov ah,02h
int 21h
xor ah,ah
mov al,bl
loop lop6
mov dl,0ah ;换行
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
;............................................................
mov ah,4ch
int 21h
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -