北郵匯編語言實驗報告_第1頁
北郵匯編語言實驗報告_第2頁
北郵匯編語言實驗報告_第3頁
北郵匯編語言實驗報告_第4頁
北郵匯編語言實驗報告_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、微機原理匯編實驗一專 業 計算機科學與技術 班 級 學 生 學 號 目 錄1、 實驗要求.32、 實驗設計.31.分析及算法思想.32.數據結構.33.子程序.44.流程圖.4三、運行實例.6四、實驗總結.6五、附頁(源代碼).7一、實驗要求:一個學生的信息包括姓名、班級、學號(班內序號)、成績。試編寫程序實現以下功能:(1)能錄入學生成績(十進制形式);提示:輸入形如:tom 301 16 95回車,每名學生用一行,選擇一個特殊符表示輸入結束;(2)能按要求:如學號或成績進行排序顯示;(3)能統計平均成績;(4)能統計不及格、60-70、70-80、80-90、90-100各分數段的人數。2

2、、 實驗設計:1.分析及算法思想:(1)采用數組進行數據存儲:學生數目信息數組(存儲學生數目),學生信息數組(按班級-學號-姓名格式存儲),平均成績數組。五個DB變量記錄各分數段人數。 (2)輸入學生數目保存在數組中,提示輸入學生信息并存儲,對于字符串輸入進行轉換,以二進制的形式存儲在數據段中。采用冒泡排序對數據段中的人員信息進行排序,以成績為參數進行遍歷,統計各分數段人數并將同時求出平均成績,輸出運算結果。2.數據結構: (1)輸入:a. 學生數目數組number db 3 dup(0) 說明:第一個存個/十位(ASCII碼),第二個存個位(ASCII碼),第三個存學生數(二進制) b. 學

3、生信息數組information db 99 dup(20 dup(0)說明:用20字節單元表示學生信息,0-19中:0對應最大字符,1對應實際輸入,2-18對應輸入信息,19對應$ c.成績數組grade db 99 dup(7 dup(0) 說明:第一個存整數部分(二進制形式),第二個存小數部分(二進制形式)d.平均成績數組average_grade_buffer db 2 dup(0)說明:和成績數組原理一樣(2) 排序:(按成績分布排序)(3)提示信息:Student_num:提示輸入學生數目 student_information :提示輸入學生信息 student_grade:提示

4、輸入成績信息 average_grade:提示輸出平均成績 grade_rank :提示輸出成績排名 Result1 :(90-100)分數段人數 Result2 :(80-90)分數段人數 Result3 :(70-80)分數段人數 Result4 :(60-70)分數段人數 Result5:(0-60)分數段人數 blank :輸出空格,便于查看結果 huanhang :輸出換行,便于查看結果 3.子程序:(1)store_student_num 存儲用戶輸入的學生數目;(2)store_student_information存儲學生姓名和班級和學號;(3)store_student_gr

5、ade存儲學生成績;(4)sort排序學生成績的函數;(5)find_result顯示最后結果的函數;(6)display輸出分數排序的函數。(7)show將二進制數(不大于127的十進制整數)輸出的函數4.流程圖:3、 運行實例:輸入四個學生的信息:結果如下4、 實驗總結 通過這次的匯編程序,我從中學習到了很多知識。雖然剛開始的時候遇到了很多難題,但是通過與老師、同學的交流之后,逐步克服了一個個的難題。提高了自己編程的思維能力,在將來的學習,生活之中能夠快速的解決問題。匯編相對于別的編程語言而言,難度是比較大。匯編是直接對CUP進行操作,能夠直接控制計算機編程。由于匯編不像JAVA那樣的高級

6、編程語言面向對象,在編程的時候思維有點亂,容易出錯,而且小的錯誤也不容易找到,特別是程序代碼長的時候。5、 附頁(源代碼);輸入學生數目格式:1到99的整數;輸入學生信息格式:班級(class)-學號(NUM)姓名(NAME),班級最多5位,學號最多5位,姓名最多6位,加上1位中間分隔符 ;輸入學生成績格式:0.0-100.0 最多一位小數;!警告:任何錯誤的輸入都將導致程序運行失敗或錯誤!;#數據段開始DATAS SEGMENT ;此處輸入數據段代碼 ; 輸入輸出提示字符 student_num db Please input the number of students(1-99):,0d

7、h,0ah,$ student_information db 0dh,0ah,Please input the student information(CLASS-NUM-NAME):,0dh,0ah,$ student_grade db 0dh,0ah,Please input the student grade(0.0-100.0):,0dh,0ah,$ average_grade db 0dh,0ah,The average grade is:,0dh,0ah,$ result1 db 0dh,0ah,The number of student in Up 90 is:,0dh,0ah,

8、$ ;各分數段人數 result2 db 0dh,0ah,The number of student in 80-90 is:,0dh,0ah,$ result3 db 0dh,0ah,The number of student in 70-80 is:,0dh,0ah,$ result4 db 0dh,0ah,The number of student in 60-70 is:,0dh,0ah,$ result5 db 0dh,0ah,The number of student in Below 60 is:,0dh,0ah,$ grade_rank db 0dh,0ah,The grade

9、 rank(from high to low)is:,0dh,0ah,$ ;打印排名 blank db ,$ huanhang db 0dh,0ah,$ kaishishuchu db 0dh,0ah,*,0dh,0ah,$ ;數據 number db 3 dup(0) ;第一個存個/十位(ASCII碼),第二個存個位(ASCII碼),第三個存學生數(二進制) ;用20字節單元表示學生信息,0-19中:0對應最大字符,1對應實際輸入,2-18對應輸入信息,19對應$ information db 99 dup(20 dup(0) ;用7字節單元來存分數,0-6中,0-4對應輸入字符,5對應輸入

10、整數部分的二進制數,6對應于小數部分的二進制數 grade db 99 dup(7 dup(0) average_grade_buffer db 2 dup(0) ;第一個存整數部分(二進制形式),第二個存小數部分(二進制形式) n0 db 0 ;各分數段人數存儲區(二進制形式) n1 db 0 n2 db 0 n3 db 0 n4 db 0DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: ;此處輸入代碼段代碼 MOV AX,DATAS MOV DS,AX mov si,0 ;指向每個學生信息 mov di,0 ;指向每個學生成績 m

11、ov cx,100 ;初始化學生數 mov dx, offset student_num ;請求輸入學生總數 mov ah,09 int 21h call store_student_num ;存儲學生總數,結果送cx中 cmp cx,0 ;輸入為0退出 jle OutToDOS cmp cx,100 ;學生數超出本程序范圍,退出 jge OutToDOS input: mov dx, offset student_information ;請求輸入學生信息 mov ah,09 int 21h call store_student_information ;存儲學生信息 add si,20 ;

12、指向下一個學生信息 mov dx, offset student_grade ;請求輸入學生成績 mov ah,09 int 21h call store_student_grade ;存儲每個學生成績 add di,7 ;指向下一個學生 loop input ;循環,直到輸入所有學生成績call sort ;排序call find_result ;顯示平均成績和分段人數 call display ;顯示排序結果 OutToDOS: mov ah,1 ;任意鍵結束 int 21h mov ax,4c00h ;返回DOS int 21h ;#存儲學生數目的函數store_student_num

13、proc ;調用之后,cx中存儲了學生數(二進制) push ax push bx mov bx,0 s1: mov ah,1 int 21h cmp al,0dh ;是否為回車 je s2 and al,0fh ;轉換為非壓縮的BCD碼 mov numberbx,al inc bx jmp s1 s2: cmp bx,2 jg s5 ;大于2 jz s3 ;等于2 ;小于2 mov al,number jmp s4 s3: mov ah,number mov al,number+1 aad ;BCD碼轉換為二進制數 s4: mov number+2,al mov cx,0 mov cl,nu

14、mber+2 s5: pop bx pop ax retstore_student_num endp ;#存儲學生信息的函數 store_student_information proc push ax push bx push dx mov al,18 mov informationsi,al lea dx,informationsi mov ah,0ah int 21h mov bl,informationsi + 1 ;實際輸入的字符個數 mov al, mov informationsi + bx + 2,al ;將回車換成 mov informationsi+19,$ ;將每個存儲單

15、元的最后一個字節置為$以便輸出 pop dx pop bx pop ax retstore_student_information endp;#存儲學生成績的函數store_student_grade proc push ax push bx push cx push dx mov bx,0 mov cx,0 mov dx,di deal0: mov ah,1 int 21h cmp al,0dh ;判斷是否為回車 jz deal2 ;是回車 cmp al,. ;是否為小數點 jnz deal1 ;不是小數點 mov bx,cx ;bx指向小數點處 inc bx ;標記小數點字符出現在第幾個位

16、置 deal1: push bx mov bx,dx mov gradebx,al pop bx inc cx ;記錄輸入字符的個數 inc dx jmp deal0 deal2: cmp bx,0 jnz deal3 ;有小數點 ;無小數點 cmp cx,3 jg gout ;大于100 jz deal4 ;等于100 ;小于100 cmp cx,2 jz deal5 ;輸入數目為2位數 ;個位數 deal6: ;處理個位數 mov al,gradedi sub al,0 mov gradedi + 5,al jmp gout deal5: ;處理2位數 mov ah,gradedi and

17、 ah,0fh mov al,gradedi + 1 and al,0fh aad mov gradedi + 5,al jmp gout deal4: ;處理3位數 mov al,100 mov gradedi + 5,al jmp gout deal3: ;處理帶有小數部分的成績 mov al,gradedi + bx ;將小數部分處理 sub al,0 mov gradedi + 6,al cmp bx,4 jz deal4 ;.出現在輸入字符的第四位,則輸入的整數部分為3位數 jg gout ;整數部分大于3位數 cmp bx,3 jz deal5 ;.出現在輸入字符的第三位,則輸入的

18、整數部分為2位數 jmp deal6 ;否則為個位數 gout: pop dx pop cx pop bx pop ax retstore_student_grade endp;#排序學生成績的函數 sort proc push ax push bx push cx push dx push si push di mov dx,0 mov dl,number+2Loop1: ;使用冒泡排序法 mov cx,dx mov di,0 mov si,0 Loop2: ;先比整數部分,再比小數部分 mov al,gradedi + 5 cmp al,gradedi + 12 jg next ;大于,向

19、下個移動 jl swap1 ;小于,交換成績,名字 ;等于,比較小數部分 mov al,gradedi + 6 cmp al,gradedi + 13 jge next ;大于或等于,向下個移動 jl swap1 ;小于,交換成績,名字swap1: mov bx,siswap11: ;交換學生信息 mov al,informationbx + 2 xchg al,informationbx + 22 mov informationbx + 2,al inc bx cmp al,$ jnz swap11 push bx mov bx,0swap2: ;交換學生成績 mov al,gradedi

20、+ bx xchg al,gradedi + bx + 7 mov gradedi + bx,al inc bx cmp bx,7 jnz swap2 pop bx next: add si,20 add di,7 dec cx jnz Loop2 dec dx jnz Loop1 pop di pop si pop dx pop cx pop bx pop ax retsort endp ;#顯示最后結果的函數find_result proc push ax push bx push cx push dx push si push di mov bx,0 mov cx,0 mov cl,nu

21、mber+2 ;cl中保存學生人數 mov di,0 mov si,0 F1: mov al,gradedi + 5 cmp al,100 jg Fout ;大于100 jz F90 ;等于100 ;小于100 cmp al,90 jge F90 ;大于等于90 ;小于90 cmp al,80 jge F80 ;大于等于80 ;小于80 cmp al,70 jge F70 ;大于等于70 ;小于70 cmp al,60 jge F60 ;大于等于60 ;小于60 ;處理=90 mov dl,n0 inc dl mov n0,dl jmp Fnext F80: ;處理大于等于80小于90 mov

22、 dl,n1 inc dl mov n1,dl jmp Fnext F70: ;處理大于等于70小于80 mov dl,n2 inc dl mov n2,dl jmp Fnext F60: ;處理大于等于60小于70 mov dl,n3 inc dl mov n3,dl jmp Fnext F2: add di,7 dec cx jnz F1 ;處理所有學生 mov dx,offset kaishishuchu ;打印一段* mov ah,09 int 21h mov dx,offset average_grade ;打印平均成績 mov ah,09 int 21h mov ax,bx mov

23、 dx,0 mov cx,0 mov cl,number+2 div cx mov cl,10 div cl call show ;先打印平均成績的整數部分 push ax mov dl,. ;打印. mov ah,2 int 21h pop ax mov al,ah call show ;再打印平均成績的小數部分 mov dx,offset result1 ;輸出大于等于90的人數 mov ah,09 int 21h mov al,n0 call show mov dx,offset result2 ;輸出大于等于80并小于90的人數 mov ah,09 int 21h mov al,n1

24、call show mov dx,offset result3 ;輸出大于等于70并小于80的人數 mov ah,09 int 21h mov al,n2 call show mov dx,offset result4 ;輸出大于等于60并小于70的人數 mov ah,09 int 21h mov al,n3 call show mov dx,offset result5 ;輸出小于60的人數 mov ah,09 int 21h mov al,n4 call show Fout: pop di pop si pop dx pop cx pop bx pop ax retfind_result endp;#輸出分數排序的函數display proc push ax push bx push cx push dx push si push di mov dx, offset grade_rank mov ah,09 int 21h mov cx,0 mov cl,number+2 ;cl中保存學生人數 mov di,0 mov si,0 D1: lea dx, offset infor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論