📄 huibian1.asm
字号:
;*************************************************************************
data segment
name_tip db 'Please input the student name:$'
gradetip db 0dh,0ah,'Please input the grades:$'
show_result db 0dh,0ah,'Name : ChengJi',0dh,0ah,0dh,0ah,'$'
stars db 0dh,0ah,'************************************','$'
maohao db ' : $'
student db 100,0,100 dup(?) ;学生姓名
buffer1 db 40 dup(0) ;为学生成绩分配空间(ASCII表示)
buffer2 db 20 dup(0) ;学生成绩(十进制表示)
resultes db 100 dup(0) ;存储每个学生平均分
data ends
;**************************************************************************
code segment
;-----------------------------------------------------------
main proc far
assume cs:code,ds:data
start:
mov ax,data ;数据段初始化
mov ds,ax
lea dx,name_tip ;请求输入学生姓名
mov ah,09
int 21h
call store_name ;存储学生姓名
lea dx,gradetip ;请求输入学生成绩
mov ah,09
int 21h
call store_grade ;存储学生成绩
call compute ;计算平均分
call display ;显示结果
mov ah,1 ;任意键结束
int 21h
mov ax,4c00h ;返回DOS
int 21h
;**************************************************************************
; 以下为子程序部分
;**************************************************************************
; 以下为子程序部分
;****************************************************************************
store_name proc
push dx
push ax
push bx
lea dx,student ;读取学生姓名
mov ah,0ah
int 21h
mov bl,student+1 ;存放实际的个数
and bx,0fh ;bx高四位清零
mov student[bx+2],'$' ;在最后加上'$'
pop bx
pop ax
pop dx
ret
store_name endp
;*****************************************************************************
store_grade proc
push ax
push si
mov si,0
input:
mov ah,01
int 21h ;输入字符
cmp al,0dh ;判断是否输入回车
je return ;输入结束
cmp al,' ' ;判断是否输入空格
je input ;跳过空格
and al,0fh ;转换成非压缩的BCD码
mov buffer1[si],al
inc si ;输入未结束,则继续输入
jmp input
return:
mov buffer1[si],'$' ;将原来的回车换成结束符
pop si
pop ax
ret
store_grade endp
;****************************************************************************
compute proc ;计算平均成绩主程序
push ax
push si
push cx
push dx
push bx ;bx用做临时存储数据用
mov si,0
mov ax,0
mov dx,0
mov bx,0
;-----------------------------------------------------------------
mov cx,4 ;循环实现BCD码转换为二进制数
next1:
mov ah,buffer1[si]
mov al,buffer1[si+1]
aad
mov buffer2[si],al
inc si
loop next1
;------------------------------------------
;期末成绩×0.6+期中成绩×0.2+实验成绩*0.1+平时成绩*0.1
mov si,0 ;计算平均成绩,结果用十进制表示
mov al,6
mul buffer2[si]
add bx,ax
mov al,2
mul buffer2[si+1]
add bx,ax
mov al,1
mul buffer2[si+2]
add bx,ax
mov al,1
mul buffer2[si+3]
add bx,ax
mov ax,bx
mov cl,10
div cl
;-----------------------------------------------------------------
;将结果转化为ASCII码存储
or ah,30h ;小数部分
mov resultes+2,ah
aam
or al,30h ;转换为ASCII码
or ah,30h
mov resultes,ah ;十位
mov resultes+1,al ;个位
;==============================================================================
pop bx
pop dx
pop cx
pop si
pop ax
ret
compute endp
;**************************************************************************
sort proc
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
lea dx,student ;显示学生姓名
add dx,2 ;姓名的首地址
mov ah,9
int 21h
lea dx,maohao ;显示一个冒号
mov ah,9
int 21h
;-------------------------
mov dl,resultes ;显示学生平均成绩(十位)
mov ah,2
int 21h
mov dl,resultes+1 ;显示学生平均成绩(个位)
mov ah,2
int 21h
mov dl,'.' ;打印小数点
mov ah,2
int 21h
mov dl,resultes+2 ;显示学生平均成绩(小数位)
mov ah,2
int 21h
;-------------------------------------------------------------------
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 + -