匯編語言顯示學生名次表實驗報告_第1頁
匯編語言顯示學生名次表實驗報告_第2頁
匯編語言顯示學生名次表實驗報告_第3頁
匯編語言顯示學生名次表實驗報告_第4頁
匯編語言顯示學生名次表實驗報告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、湖北科技學院計算機學院 匯編語言課程設計 課題題目: 顯示學生名次表 學生姓名: 學 號: 班 級: 2013年 12 月26日一、 實驗目的進行匯編語言程序設計應用的綜合性訓練。綜合運用匯編語言循環(huán)程序和子程序編程方法,鞏固提高匯編語言程序設計能力應用水平。二、 設備與環(huán)境PC兼容機、Windows操作系統(tǒng)、匯編程序masm for windows 2010三、實驗內容實驗內容: 編制一程序,要求接收從鍵盤輸入的一個班的學生成績和學號,對學生的成績進行排序,再按學號順序和學生名次順序分別把學生成績顯示出來。四、實驗結果及分析實驗功能:從鍵盤輸入學生姓名和成績,按照成績的高低排名顯示輸出。程序

2、中設定的名字是英文的,需要小于9位字母,學生人數為3個。程序思路:1、本程序包括一個主程序和五個子程序。子程序包括INPUT鍵盤輸入、COPY數據轉存、CHANGE十進制數ASCII碼轉二進制、SORT按成績排序和PRINT打印班級名單。2、用變量p控制輸入的學生的個數。本程序中,p=3。3、姓名和成績輸入分別用DOS中被調用的10號功能實現(xiàn)字符串輸入。在輸入最后字符后,要將回車符改為0,以便輸出時直接用9號功能顯示姓名和成績。4、用buffer1和buffer2作為鍵入的姓名和成績的緩存區(qū),然后將所有人名和成績用串傳送指令轉到smane和score1中保存,打印輸出是可以使用。5、將scor

3、e1中成績的十進制數ASCII碼轉換為二進制數score2. 6、將score2中的成績排序,同時將保存在mingci中的輸入次序號也一換,以次序號作為排序指針,在smane和score1中查找相應的人名和成績。7、打印排序名單時,從mingci中取出次序號作為位移量,到smane和score1中取出姓名和對應的成績用9號功能顯示。排序后mingci中先取出的次序號一定是成績最高的人的,其他類推。程序代碼、代碼解析及流程圖主程序: 流程圖:START:main proc farMOV AX,DATAS MOV DS,AX mov es,ax mov bx,0 mov cx,0 call inp

4、ut call sort call print mov ah,4ch int 21hmain endp數據段定義:DATAS SEGMENT infor0 db 0ah,0dh,'sort= $' infor1 db 0ah,0dh,'input name: $' infor2 db 0ah,0dh,'input score:$' n equ 15 ;姓名長度 m equ 4 ;成績長度(3位+回車) p equ 4 ;輸入的人數(4個 q equ 3 ;成績位數 buff1 db n,?,n dup(0),'$' ;姓名緩沖區(qū),

5、加$以便輸出 buff2 db n,?,n dup(0),'$' ;成績緩沖區(qū) sname db p dup(n+1 dup(0) ;保存姓名 score1 dw p dup(m+1 dup(0) ;保存成績 score2 dw p dup(m+1 dup(0) mingci db p dup(0) ;名次 x dw ? sign1 dw 0 sign2 dw 0 cont db '1' ;計數DATAS ENDS子程序(INPUT) 1:輸入姓名、成績input proc inc bx ;輸入次數統(tǒng)計 cmp bx,p ;輸入次數 ja exit lea dx

6、,infor1 ;顯示提示1 mov ah,9 int 21h lea dx,buff1 ;輸入姓名 mov ah,10 int 21h mov al,buff1+1 ;實際輸入個數,al add al,2 ;+2,包含buffer1的0,1號單元 mov ah,0 mov si,ax ;回車od所在位置,跟在最后一個字符后 mov buff1si,0 ;將od換為0,便于輸出顯示 lea dx,infor2 ;顯示提示2 mov ah,9 int 21h lea dx,buff2 ;輸入成績 mov ah,10 int 21h mov al,buff2+1 ;實際輸入個數 add al,2

7、;個數+2,包含0,1單元找到od mov ah,0 mov si,ax mov buff2si,0 ;將od換為0,便于輸出顯示 mov mingcibx-1,bl ;bx為輸入次數,保存輸入次序 cmp bx,1 ;第一次輸入轉let1 jz let1 add sign1,n+1 ;姓名間隔為n+1 add sign2,q ;成績間隔為qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp流程圖: 子程序2(COPY):數據轉存copy proc mov cx,n+1 ;姓名長度+1(包含$) lea si,buff1+2 lea di,s

8、name ;姓名傳送到sname add di,sign1 ;加上間隔值 cld rep movsb mov cx,n mov ax,'$' ;用$覆蓋姓名區(qū),清除已輸入的姓名 lea di,buff1+2 rep stosb mov cx,m+1 ;成績位數+1(包含s) lea si,buff2+2 lea di,score1 ;成績傳送到scorel add di,sign2 ;加上間隔值 cld rep movsb lea si,buff2+2 mov di,sign2 call change ;二進制成績,scorel2 retcopy endp流程圖:子程序3(CH

9、ANGE):十進制數ASCII碼二進制change proc mov x,0 mov cx,si-1 ;成績的位數,cx and cx,000fh ;保留低4位rept2: mov al,si ;按位取出成績 cmp al,30h ;是否在09之間 jl exit1 cmp al,39h jg exit1 and ax,000fh ;去掉ASCII碼 xchg ax,x mov dx,10 ;將ax中前一次形成的數擴大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十進制形成的成績以二進制保存 mov score2di,ax ;二進

10、制成績送入score2 mov x,0 add sign2,2 ;下一個成績單exit1: retchange endp 流程圖 子程序4(SPORT):按成績排序 sort proc mov cx,p ;數組長度 dec cxloop1:push cx ;保存外循環(huán)次數 mov bx,0 mov si,0loop2:mov ax,score2bx cmp ax,score2bx+m+1 ;m+1=5 jge next ;降序 xchg ax,score2bx+m+1;交換成績 mov score2bx,ax mov al,mingcisi xchg al,mingcisi+1 ;交換成績 m

11、ov mingcisi,alnext:add bx,m+1 ;下一個成績 inc si loop loop2 pop cx ;恢復外循環(huán)次數 loop loop1 ret sort endp 子程序子程序5(PRINT):打印排序名單 print proc lea dx,infor0 ;顯示結果提示 mov ah,9 int 21h mov cx,p mov bx,0 mov ax,0 mov di,0rept3:mov dl,0ah ;回車換行mov ah,2int 21hmov dl,0dhint 21hmov dl,cont ;顯示名次序號mov ah,2int 21hinc contm

12、ov dl,0ah ;回車換行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov al,mingcidi ;取名次dec al ;位置-1,因為地址從0開始mov bl,9 ;姓名位置=al×9(包含$)mul bllea dx,snameadd dx,ax ;偏移地址+姓名位移量mov ah,9 ;顯示名字int 21hmov dl,0ah ;回車換行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov bx,0mov al,mingcidi ;取名次dec al ;地址從0開始mov bl,5 ;成績位移量=a

13、l×5(包含$)mul bllea dx,score1add dx,ax ;顯示成績mov ah,9int 21hinc diloop rept3retprint endpcodes endsEND START 流程圖運行結果:實驗體會:在復雜的程序設計中,采用模塊化結構可以劃分功能、分界程序,使得程序有復雜變簡單,變清晰。主程序和子程序之間嵌套使用,使得寫代碼時思路更清楚明白,讀代碼時方便快捷清晰明了。這點跟高級編程語言類似。而此程序中變量p可以跟蹤并控制輸入的人數、輸名字要預留緩存區(qū)、十進制碼要和二進制碼間相互轉換,這些又體現(xiàn)了編程低級語言的特點。學習匯編語言,重要的事掌握如何通

14、過匯編指令和程序來控制計算機各個組成部件工作,完成一系列任務。因此,學習匯編用語言與學習高級語言的不同之處是要學習如何深入到計算機的內部進行控制。通過這次實驗,加深了我對匯編語言的理解。每一步的輸入、存儲、轉換、輸出,都需要一條條的匯編指令執(zhí)行。而且每一步都有自己的源和目標的地址,每個數據都有自己的存儲空間和地址,我們可以很清晰的“跟蹤”每一個數據的變化和地址的轉移。程序:DATA SEGMENT infor0 db 0ah,0dh,'sort= $' infor1 db 0ah,0dh,'input name: $' infor2 db 0ah,0dh,

15、9;input score:$' n equ 15 ;姓名長度 m equ 4 ;成績長度(3位+回車) p equ 4 ;輸入的人數(4個 q equ 3 ;成績位數 buff1 db n,?,n dup(0),'$' ;姓名緩沖區(qū),加$以便輸出 buff2 db m,?,m dup(0),'$' ;成績緩沖區(qū) sname db p dup(n+1 dup(0) ;保存姓名 score1 dw p dup(m+1 dup(0) ;保存成績 score2 dw p dup(m+1 dup(0) mingci db p dup(0) ;名次 x dw ?

16、sign1 dw 0 sign2 dw 0 cont db '1' ;計數DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:main proc far MOV AX,DATA MOV DS,AX mov es,ax mov bx,0 mov cx,0 call input call sort call print mov ah,4ch int 21hmain endp ;子程序1,輸入姓名、成績input proc inc bx ;輸入次數統(tǒng)計 cmp bx,p ;輸入次數 ja exit lea dx,infor1 ;顯示提示

17、1 mov ah,9 int 21h lea dx,buff1 ;輸入姓名 mov ah,10 int 21h mov al,buff1+1 ;實際輸入個數,al add al,2 ;+2,包含buffer1的0,1號單元 mov ah,0 mov si,ax ;回車od所在位置,跟在最后一個字符后 mov buff1si,0 ;將od換為0,便于輸出顯示 lea dx,infor2 ;顯示提示2 mov ah,9 int 21h lea dx,buff2 ;輸入成績 mov ah,10 int 21h mov al,buff2+1 ;實際輸入個數 add al,2 ;個數+2,包含0,1單元

18、找到od mov ah,0 mov si,ax mov buff2si,0 ;將od換為0,便于輸出顯示 mov mingcibx-1,bl ;bx為輸入次數,保存輸入次序 cmp bx,1 ;第一次輸入轉let1 jz let1 add sign1,n+1 ;姓名間隔為n+1 add sign2,q ;成績間隔為qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp ;子程序2,數據轉存copy proc mov cx,n+1 ;姓名長度+1(包含$ lea si,buff1+2 lea di,sname ;姓名傳送到sname add di

19、,sign1 ;加上間隔值 cld rep movsb mov cx,n mov ax,'$' ;用$覆蓋姓名區(qū),清除已輸入的姓名 lea di,buff1+2 rep stosb mov cx,m+1 ;成績位數+1(包含s lea si,buff2+2 lea di,score1 ;成績傳送到scorel add di,sign2 ;加上間隔值 cld rep movsb lea si,buff2+2 mov di,sign2 call change ;二進制成績,scorel2 retcopy endp ;子程序3,十進制數ASCII碼二進制change proc mov

20、 x,0 mov cx,si-1 ;成績的位數,cx and cx,000fh ;保留低4位rept2: mov al,si ;按位取出成績 cmp al,30h ;是否在09之間 jl exit1 cmp al,39h jg exit1 and ax,000fh ;去掉ASCII碼 xchg ax,x mov dx,10 ;將ax中前一次形成的數擴大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十進制形成的成績以二進制保存 mov score2di,ax ;二進制成績送入score2 mov x,0 add sign2,2 ;下一個成績單元 exit1: ret change endp ;子程序4,按成績排序 sort proc mov cx,p ;數組長度 dec cxloop1:push cx ;保存外循環(huán)次數 mov bx,0 mov si,0loop2:mov ax,score2bx cmp ax,score2bx+m+1 ;m+1=5 jge next ;降序 xchg ax,score2bx+m+1 ;交換成績 mov score2bx,ax mov al,mingcisi xchg al,mingcisi+1 ;交換成績 mov m

溫馨提示

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

評論

0/150

提交評論