📄 课设裁判评分.asm
字号:
data segment
buf db 3 ;buf为缓冲区
db ?
db 3 dup(0)
score db 5 dup(0) ;分数区
;string db 'please enter 5 scores(10-20):',0ah,0dh,'$'
data ends
stack1 segment para stack
dw 20h dup(0)
stack1 ends
coseg segment
assume cs:coseg,ds:data
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax ;装段基值
;**************************************
start:
;lea dx,string ;打出提示信息
;mov ah,09h
;int 21h
mov cx,0005h ;循环次数
mov si,0
lop1:
mov dx,offset buf ;输入分数到缓冲区(如18)
mov ah,0ah
int 21h
;以下:校正(ASCII->十进制->十六进制)
mov bx,word ptr buf+2 ;从缓冲区到BX:如38 31
push cx
mov cx,4 ;BX:38 10
shl bl,cl
and bh,0fh ;BX:08 10
or bl,bh ;BX:18
;D变H(先判断是否为20,20专门转换)
;D变H(<16的数先加10,再去十位数1)
;D变H(>=16的数加10后要保证十位数为1)
cmp bl,20h ;(=20的)转为14H
jne j0
mov bl,14h
jmp exit
j0:cmp bl,16h ;!=20的先与16h比
jge j1
add bl,0ah ;(<16的)BL:+10校正
and bl,0fh ;提炼个位数
jmp exit
j1:
add bl,0ah ;(>=16的)BL:+10校正
and bl,0fh
add bl,10h ;十位置1
exit:
pop cx
mov score[si],bl ;校正后的数存入数据区
inc si
loop lop1
;*************************************
;找最大数存入AL,最小数存入BL
mov cx,0005h
mov si,0
mov al,0h ;置AL初值0,比它大的代替
mov bl,15h ;置BL初值最大,比它小的代替
lop2:
mov dl,score[si] ;把要比较的数从分数区提到DL
inc si
cmp al,dl
jg l1
mov al,dl
l1:
cmp bl,dl
jb l2
mov bl,dl
l2:loop lop2
;***************************************
;求平均分,并校正
neg al ; -max
sub al,bl ;再-min
mov cx,0005h
mov si,0
lop3: ;再+5个分数
add al,score[si]
inc si
loop lop3
cbw ;除以3(33H/3=11H)
mov bl,3
div bl
add al,6h ;11h--->17
;*****************************************
;输出校正(转换成ASCII才能显示)
mov bl,al
and bl,0fh ;如上例提炼出7
add bl,30h ;ASCII码37
mov cx,0004h ;提出1
shr al,cl
add al,30h ;ASCII码31
mov dl,al ;显示器输出
mov ah,2
int 21h
mov dl,bl
mov ah,2
int 21h
;******************************************
mov ah,4ch
int 21h
coseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -