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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

3、e1中成績的十進(jìn)制數(shù)ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)score2. 6、將score2中的成績排序,同時將保存在mingci中的輸入次序號也一換,以次序號作為排序指針,在smane和score1中查找相應(yīng)的人名和成績。7、打印排序名單時,從mingci中取出次序號作為位移量,到smane和score1中取出姓名和對應(yīng)的成績用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數(shù)據(jù)段定義: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 ;輸入的人數(shù)(4個 q equ 3 ;成績位數(shù) 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' ;計數(shù)DATAS ENDS子程序(INPUT) 1:輸入姓名、成績input proc inc bx ;輸入次數(shù)統(tǒng)計 cmp bx,p ;輸入次數(shù) ja exit lea dx

6、,infor1 ;顯示提示1 mov ah,9 int 21h lea dx,buff1 ;輸入姓名 mov ah,10 int 21h mov al,buff1+1 ;實際輸入個數(shù),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 ;實際輸入個數(shù) add al,2

7、;個數(shù)+2,包含0,1單元找到od mov ah,0 mov si,ax mov buff2si,0 ;將od換為0,便于輸出顯示 mov mingcibx-1,bl ;bx為輸入次數(shù),保存輸入次序 cmp bx,1 ;第一次輸入轉(zhuǎn)let1 jz let1 add sign1,n+1 ;姓名間隔為n+1 add sign2,q ;成績間隔為qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp流程圖: 子程序2(COPY):數(shù)據(jù)轉(zhuǎn)存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 ;成績位數(shù)+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 ;二進(jìn)制成績,scorel2 retcopy endp流程圖:子程序3(CH

9、ANGE):十進(jìn)制數(shù)ASCII碼二進(jìn)制change proc mov x,0 mov cx,si-1 ;成績的位數(shù),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中前一次形成的數(shù)擴大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十進(jìn)制形成的成績以二進(jìn)制保存 mov score2di,ax ;二進(jìn)

10、制成績送入score2 mov x,0 add sign2,2 ;下一個成績單exit1: retchange endp 流程圖 子程序4(SPORT):按成績排序 sort proc mov cx,p ;數(shù)組長度 dec cxloop1:push cx ;保存外循環(huán)次數(shù) 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 ;恢復(fù)外循環(huán)次數(shù) loop loop1 ret sort endp 子程序子程序5(PRINT):打印排序名單 print proc lea dx,infor0 ;顯示結(jié)果提示 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 流程圖運行結(jié)果:實驗體會:在復(fù)雜的程序設(shè)計中,采用模塊化結(jié)構(gòu)可以劃分功能、分界程序,使得程序有復(fù)雜變簡單,變清晰。主程序和子程序之間嵌套使用,使得寫代碼時思路更清楚明白,讀代碼時方便快捷清晰明了。這點跟高級編程語言類似。而此程序中變量p可以跟蹤并控制輸入的人數(shù)、輸名字要預(yù)留緩存區(qū)、十進(jìn)制碼要和二進(jìn)制碼間相互轉(zhuǎn)換,這些又體現(xiàn)了編程低級語言的特點。學(xué)習(xí)匯編語言,重要的事掌握如何通

14、過匯編指令和程序來控制計算機各個組成部件工作,完成一系列任務(wù)。因此,學(xué)習(xí)匯編用語言與學(xué)習(xí)高級語言的不同之處是要學(xué)習(xí)如何深入到計算機的內(nèi)部進(jìn)行控制。通過這次實驗,加深了我對匯編語言的理解。每一步的輸入、存儲、轉(zhuǎn)換、輸出,都需要一條條的匯編指令執(zhí)行。而且每一步都有自己的源和目標(biāo)的地址,每個數(shù)據(jù)都有自己的存儲空間和地址,我們可以很清晰的“跟蹤”每一個數(shù)據(jù)的變化和地址的轉(zhuǎn)移。程序: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 ;輸入的人數(shù)(4個 q equ 3 ;成績位數(shù) 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' ;計數(shù)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 ;輸入次數(shù)統(tǒng)計 cmp bx,p ;輸入次數(shù) ja exit lea dx,infor1 ;顯示提示

17、1 mov ah,9 int 21h lea dx,buff1 ;輸入姓名 mov ah,10 int 21h mov al,buff1+1 ;實際輸入個數(shù),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 ;實際輸入個數(shù) add al,2 ;個數(shù)+2,包含0,1單元

18、找到od mov ah,0 mov si,ax mov buff2si,0 ;將od換為0,便于輸出顯示 mov mingcibx-1,bl ;bx為輸入次數(shù),保存輸入次序 cmp bx,1 ;第一次輸入轉(zhuǎn)let1 jz let1 add sign1,n+1 ;姓名間隔為n+1 add sign2,q ;成績間隔為qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp ;子程序2,數(shù)據(jù)轉(zhuǎn)存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 ;成績位數(shù)+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 ;二進(jìn)制成績,scorel2 retcopy endp ;子程序3,十進(jìn)制數(shù)ASCII碼二進(jìn)制change proc mov

20、 x,0 mov cx,si-1 ;成績的位數(shù),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中前一次形成的數(shù)擴大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十進(jìn)制形成的成績以二進(jìn)制保存 mov score2di,ax ;二進(jìn)制成績送入score2 mov x,0 add sign2,2 ;下一個成績單元 exit1: ret change endp ;子程序4,按成績排序 sort proc mov cx,p ;數(shù)組長度 dec cxloop1:push cx ;保存外循環(huán)次數(shù) 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論