彙編語言設計:簡易學生成績管理系統

0.寫在前面

該程序實現了「簡易學生成績管理系統」。程序自己有點繁瑣,因爲程序過長,甚至超出了jmp的範圍,因此中間還須要中轉jmp,但我本人仍是有點滿意的。
這是個人彙編實驗課程做業,若是你們有相似做業的話但願不要過分借鑑,本程序僅供參考和學習!不要抄襲!es6

1.設計目的

1)熟悉數據分類的方法;
2)掌握屏幕上顯示數據格式的方法。oop

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

相關文章
相關標籤/搜索