0.写在前面

该程序实现了“简易学生成绩管理系统”。程序本身有点繁琐,由于程序过长,甚至超出了jmp的范围,所以中间还需要中转jmp,但我本人还是有点满意的。
这是我的汇编实验课程作业,如果大家有类似作业的话希望不要过度借鉴,本程序仅供参考和学习!不要抄袭!

1.设计目的

1)熟悉数据分类的方法;
2)掌握屏幕上显示数据格式的方法。

2.程序功能

① 循环菜单式学生成绩管理系统;
② 输入任意个0~100的数字;
③ 按<60,60~69,70~79,80~89,90~99和100共六档分类;
④ 统计出每档的个数及总数;
⑤ 输入数据将存于内存中;
⑥ 选择错误提示和正确退出提示。

3.源代码

data segment
  men    db 0dh,0ah
         db '*****Student Score System*****',0dh,0ah
         db '**-----1>Input score--------**',0dh,0ah
         db '**-----2>Count class--------**',0dh,0ah
         db '**-----3>Quit system--------**',0dh,0ah
         db '**Please input your select:',0dh,0ah,'$'
  err    db ' ->Select error! Please select again!',0dh,0ah,'$'
  inp    db ' ->Please input scores (<CR> to quit):',0dh,0ah,'$'
  inpok  db 'Finish!',0dh,0ah,'$'
  cou    db ' ->Here are the classification statistics :','$'
  qui    db ' ->Welcome to use this system next time!','$'
  mes1   db '-score[<60     :','$'
  mes2   db '-score[<60-69] :','$'
  mes3   db '-score[<70-79] :','$'
  mes4   db '-score[<80-89] :','$'
  mes5   db '-score[<90-99] :','$'
  mes6   db '-score[=100]   :','$'
  mes7   db '-Total Number  :','$'
  result db 100 dup(0)
  total  db 00
  s5     db 00
  s6     db 00
  s7     db 00
  s8     db 00
  s9     db 00
  s10    db 00
data ends

code segment
assume cs:code, ds:data
start: mov ax,data
       mov ds,ax            ;ds指向data数据段

menu:
       push cx
       mov cx,0ffffh
delay: loop delay           ;设置输出延迟
       pop cx
       
       mov ah,9
       mov dx,offset men
       int 21h              ;输出提示字符串

       mov ah,1
       int 21h              ;输入选择
       cmp al,'1'
       je input
       cmp al,'2'
       je coun
       cmp al,'3'
       je qu
       
       mov dx,offset err
       mov ah,9
       int 21h              ;输入错误提示
       jmp menu


;---------- INPUT ----------
input:
       mov ah,9
       mov dx,offset inp
       int 21h              ;输出提示字符串
       
       mov si,offset result ;si指向result
       mov cx,0             ;cx为输入数字个数
        
s:     mov ah,1
       int 21h              ;输入数字字符
       sub al,30h           ;将字符转化为数字值
       mov bh,al            ;数字值存于bh
       
a:     mov ah,1
       int 21h              ;输入数字字符
       cmp al,20h           ;判断输入是否为空格
       je b                 ;如是,跳转至b标号
       cmp al,0dh           ;判断输入是否为回车
       je c                 ;如是,跳转至c标号
       sub al,30h           ;否则,将字符转化为数字值
       mov bl,al            ;数字值存于bl
       
       mov al,10            ;将al置10
       mul bh               ;将高位乘10,存于ax
       mov bh,0             ;将bh置0
       add ax,bx            ;将ax与bx相加(实际结果只在al中)
       mov bh,al            ;将结果存于bh
       jmp a                ;循环至a处

b:     mov al,bh            ;将结果存于al
       mov [si],al          ;将结果存于ds:si处
       inc si               ;si指向下一单元
       inc cx               ;数字个数加一
       jmp s                ;循环至s处

c:     mov al,bh            ;将结果存于al
       mov [si],al          ;将结果存于ds:si处
       inc si               ;si指向下一单元
       inc cx               ;数字个数加一
       mov si,offset result ;si指向result
       jmp comp

coun:  jmp count
qu:    jmp quit

comp:  mov al,[si]          ;si处内容存于al
       
       cmp al,60
       jb five              ;若al小于60,跳转至five

       cmp al,70
       jb six               ;若al小于70,跳转至six

       cmp al,80
       jb seven             ;若al小于80,跳转至seven

       cmp al,90
       jb eight             ;若al小于90,跳转至eight

       cmp al,100
       jb nine              ;若al小于100,跳转至nine

       cmp al,100
       je ten               ;若al小于100,跳转至ten

       jmp next             ;若其他,跳转至next

five:  mov al,[s5]          ;s5处内容存于al
       add al,01            ;al加一
       daa                  ;转化为十进制BCD码
       mov [s5],al          ;将al的值存于s5处
       jmp next             ;跳转至next处

six:   mov al,[s6]          ;同上
       add al,01
       daa
       mov [s6],al
       jmp next

seven: mov al,[s7]          ;同上
       add al,01
       daa
       mov [s7],al
       jmp next

eight: mov al,[s8]          ;同上
       add al,01
       daa
       mov [s8],al
       jmp next

nine:  mov al,[s9]          ;同上
       add al,01
       daa
       mov [s9],al
       jmp next

ten:   mov al,[s10]          ;同上
       add al,01
       daa
       mov [s10],al
       jmp next

next:  mov al,[total]       ;total处内容存于al
       add al,01            ;al加一
       daa                  ;转化为十进制BCD码
       mov [total],al       ;将al的值存于total处
       inc si               ;si指向下一单元
       loop comp            ;循环至comp
       
       mov ah,9
       mov dx,offset inpok
       int 21h              ;输出提示字符串
       jmp menu


;---------- COUNT ----------
count:
       mov ah,9
       mov dx,offset cou
       int 21h              ;输出提示字符串
       
       mov ah,2
       mov dl,0dh
       int 21h              ;输出回车
       mov dl,0ah
       int 21h              ;输出换行

       mov dx,offset mes1
       mov ah,09h
       int 21h              ;输出字符串
       mov al,[s5]          ;将s5处内容存至al
       call disp            ;调用disp,以十进制输出al中内容

       mov dx,offset mes2
       mov ah,09h
       int 21h
       mov al,[s6]
       call disp            ;同上

       mov dx,offset mes3
       mov ah,09h
       int 21h
       mov al,[s7]
       call disp            ;同上

       mov dx,offset mes4
       mov ah,09h
       int 21h
       mov al,[s8]
       call disp            ;同上

       mov dx,offset mes5
       mov ah,09h
       int 21h
       mov al,[s9]
       call disp            ;同上

       mov dx,offset mes6
       mov ah,09h
       int 21h
       mov al,[s10]
       call disp            ;同上

       mov dx,offset mes7
       mov ah,09h
       int 21h
       mov al,[total]
       call disp            ;同上

       jmp menu


;---------- QUIT ----------
quit:
       mov ah,9
       mov dx,offset qui
       int 21h              ;输出提示字符串
       mov ax,4c00h
       int 21h              ;结束程序


disp proc near
       push cx              ;cx入栈
       mov bl,al            ;将al的值存于bl
       and al,0f0h          ;将低四位置零
       mov cl,04            ;设置循环移动位数为4
       ror al,cl            ;循环右移四位
       add al,30h           ;将数字转化为ASCII码值

       mov dl,al
       mov ah,02h
       int 21h              ;输出al中的数字(即十位)

       mov al,bl            ;将bl的值存于al
       and al,0fh           ;将高四位置零
       add al,30h           ;将数字转化为ASCII码值

       mov dl,al
       mov ah,02h
       int 21h              ;输出al中的数字(即个位)

       mov ah,2
       mov dl,0dh           ;输出回车
       int 21h
       mov dl,0ah
       int 21h              ;输出换行

       pop cx
       ret
disp endp

code ends
end start

4.运行示例

image.png

5.流程图

image.png


ShadowCK
51 声望9 粉丝

这个人是个萌新,什么都没有留下。


引用和评论

0 条评论