北京郵電大學(xué)-微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第1頁(yè)
北京郵電大學(xué)-微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第2頁(yè)
北京郵電大學(xué)-微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第3頁(yè)
北京郵電大學(xué)-微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第4頁(yè)
北京郵電大學(xué)-微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、微機(jī)原理軟件實(shí)驗(yàn)報(bào)告學(xué) 院: 信息與通信工程學(xué)院班 級(jí): XXXXXX姓 名: XXXXX學(xué) 號(hào): XXXXXXXX班內(nèi)序號(hào): XXXXX日 期: 2021年11月30日目錄微 機(jī) 原 理 軟 件 實(shí) 驗(yàn) 報(bào)告11.實(shí)驗(yàn)一32.實(shí)驗(yàn)二73.實(shí)驗(yàn)三134.實(shí)驗(yàn)四205.實(shí)驗(yàn)五306.總結(jié)及結(jié)論397.參考文獻(xiàn)39實(shí)驗(yàn)一 DEBUG的使用一、 實(shí)驗(yàn)?zāi)康? 1.掌握匯編程序的編輯,編譯,連接和執(zhí)行的全過(guò)程; 2.學(xué)習(xí)和掌握用DEBUG調(diào)試程序的方法.二 、實(shí)驗(yàn)內(nèi)容:1. 用編輯軟件,輸入以下匯編語(yǔ)言源程序:DAT SEGMENT ;默認(rèn)ds段 A DB 20 ;(自定) B DB 15 ;(自定)

2、Y DB 3 DUP(0) Z DB 0,0DAT ENDS STA SEGMENT STACK DW 50 DUP(?)STA ENDSCOD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX ;AX清零 PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 ;A*A MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 ;A*A+B*B MOV AL,A MOV Z,AL

3、MOV AL,B MOV Z+1,AL CALL SUB1 ;A*A+B*B+A*B ADD WORD PTR Y,AX ;A*A+B*B+A*B +A*B -> (A+B)2 ADC BYTE PTRY+2,0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDSEND STAR2.通過(guò)編譯,連接形成可執(zhí)行文件。3.用DEBUG 將可執(zhí)行文件調(diào)入,并進(jìn)行調(diào)試。 (1)用 D 命令觀察數(shù)據(jù)區(qū)在內(nèi)存中的具體內(nèi)容,記錄單元 A

4、和 B 的具體地址。 (2)用 U 命令對(duì)目標(biāo)代碼反匯編,觀察反匯編后的結(jié)果.注意發(fā)現(xiàn)源程序的起始 位置, 并記錄這個(gè)起始地址。 (3)用 T 命令作單步跟蹤調(diào)試.比擬每條指令執(zhí)行后的結(jié)果和原來(lái)的理解是否 一致。得出程序運(yùn)行的結(jié)果:它們是寫在什么單元,具體內(nèi)容是什么; 并判斷結(jié)果是否正確。 (4)用 E 命令修改單元 A,B 的內(nèi)容,重新執(zhí)行程序,并記錄結(jié)果。 (5)退出 DEBUG。三、預(yù)習(xí)題:1.熟悉常用的 DEBUG 命令。 2.閱讀并分析程序的功能。答:程序?qū)崿F(xiàn)了(A+B)2的功能。 3.假設(shè) SS=2000H,SP=FFFFH, 向堆棧中壓入 4 字節(jié)數(shù)據(jù)后,如何用 D 命令顯示壓入

5、堆棧的內(nèi)容?答:使用指令“d 2000:0000即可顯示壓入堆棧的內(nèi)容,因?yàn)镾P+1 會(huì)溢出,所以變成0000。四、實(shí)驗(yàn)過(guò)程a.通過(guò)masm和link命令使得程序編譯鏈接成功。b.進(jìn)入debug中,用u命令查看反編譯結(jié)果。得出A的地址為:076A:0000,值為14H,即十進(jìn)制的20D;B的地址為:076A:0001,值為0FH,即十進(jìn)制的15D。Y的偏移地址為0002H,Z的偏移地址為0005H。DATA段基地址為076AH。SUB1子程序段入口地址為003F。c.用e命令將A地址和B地址內(nèi)的值由2AH,32H改為23H,24H,通過(guò)d命令重新查看A地址,B地址下的數(shù)值,發(fā)現(xiàn)改變成功。d.利

6、用t命令單步調(diào)試,可發(fā)現(xiàn),每一步程序的執(zhí)行,會(huì)與存放器及存儲(chǔ)器的內(nèi)容的變化是一致的。e.退出debug。五、實(shí)驗(yàn)總結(jié)由于之前上?操作系統(tǒng)?時(shí),零散地學(xué)過(guò)一些匯編相關(guān)的內(nèi)容,所以關(guān)于masm、debug的根本指令的使用還是比擬熟悉的,在做實(shí)驗(yàn)一的整個(gè)過(guò)程中也是比擬輕松。也希望自己能保持著這種輕松的狀態(tài)去應(yīng)對(duì)接下來(lái)的實(shí)驗(yàn)!實(shí)驗(yàn)二 分支、循環(huán)程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?.開(kāi)始獨(dú)立進(jìn)行匯編語(yǔ)言程序設(shè)計(jì);2.掌握根本分支,循環(huán)程序設(shè)計(jì);3.掌握最簡(jiǎn)單的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容1.安排一個(gè)數(shù)據(jù)區(qū),內(nèi)存有假設(shè)干個(gè)正數(shù),負(fù)數(shù)和零。每類數(shù)的個(gè)數(shù)都不超過(guò) 9。2.編寫一個(gè)程序統(tǒng)計(jì)數(shù)據(jù)區(qū)中正數(shù),負(fù)數(shù)和零的個(gè)數(shù)。3

7、.將統(tǒng)計(jì)結(jié)果在屏幕上顯示。4.選做題統(tǒng)計(jì)出正奇數(shù)、正偶數(shù),負(fù)奇數(shù)、負(fù)偶數(shù)以及零的個(gè)數(shù)。三、預(yù)習(xí)題1.十進(jìn)制數(shù) 0 9 所對(duì)應(yīng)的 ASCII 碼是什么? 如何將十進(jìn)制數(shù) 0 9 在屏幕上顯示出來(lái)?答:09分別對(duì)應(yīng)ASCII碼的30H39H。因?yàn)槠聊簧巷@示的數(shù)字是ASCII碼,所以為了將十進(jìn)制數(shù)09顯示在屏幕上,需在原有的十進(jìn)制數(shù)值根底上加上30H即可。2.如何檢驗(yàn)一個(gè)數(shù)為正,為負(fù)或?yàn)榱悖?答:本實(shí)驗(yàn)中,判斷正、負(fù)或零是直接用CMP命令和0比擬,然后用je、jg、jl等命令進(jìn)行判斷為正、負(fù)或零。四、實(shí)驗(yàn)流程圖五、實(shí)驗(yàn)源代碼;*;* 作者:LQ *;* 日期:2021/11/20 *;* 功能: *

8、;* 編寫一個(gè)程序統(tǒng)計(jì)數(shù)據(jù)區(qū)中正偶數(shù),正奇數(shù),負(fù)奇數(shù),負(fù)偶數(shù)和零的個(gè)數(shù) *;*assume cs:code,ds:data data segment ;在db數(shù)據(jù)區(qū),假定數(shù)字大小均在 -128127 之間,故每個(gè)數(shù)字用一個(gè)字節(jié)去存儲(chǔ) db -8,-10,-6,-5,-2,-55 ;給定6個(gè)負(fù)數(shù),其中4個(gè)偶數(shù),2個(gè)奇數(shù) db 4 , 2, 3,78,89, 56 ;給定6個(gè)正數(shù),其中4個(gè)偶數(shù),2個(gè)奇數(shù) db 0 , 0 ;給定2個(gè)零 db '$' ;設(shè)定一個(gè)結(jié)束符data endscode segment s1:db 5 dup(0) ;在代碼段設(shè)置一塊空間用于存儲(chǔ)統(tǒng)計(jì)的最終數(shù)值

9、 db 'Positive Odd:','$' ;在代碼段開(kāi)出一塊空間用于存儲(chǔ)顯示數(shù)據(jù)的字符串 db 'Positive Even:','$' db 'Negative Odd:','$' db 'Negative Even:','$' db 'Zero:','$' start: mov ax,data mov ds,ax xor di,di call main main: mov al,di cmp al,'$' je

10、 show cmp al,00H jg above0 ;帶符號(hào)數(shù)的大于比擬 cmp al,0 jl below0 ;帶符號(hào)數(shù)的小于比擬 jmp equal0 below0: mov bl,2 mov ah,0 idiv bl cmp ah,0 je nagative_even mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+2 ;負(fù)奇數(shù) inc di mov ds,cx call main nagative_even: ;負(fù)偶數(shù) mov ax,cs mov cx,ds mov ds,ax mov si,offset

11、s1 inc byte ptr si+3 inc di mov ds,cx call main above0: mov bl,2 mov ah,0 idiv bl cmp ah,0 je positive_even mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si ;正奇數(shù) inc di mov ds,cx call main positive_even: ;正偶數(shù) mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+1 inc di mov d

12、s,cx call main equal0: mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+4 inc di mov ds,cx call main show: ;顯示數(shù)據(jù) xor di,di mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset s1 add si,5 mov dx,0 mov bx,0 jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es

13、:di,cl inc di mov byte ptr es:di,07H ;07H代表顏色為黑底白字 inc di inc si jmp short print print_data: ;打印記錄存儲(chǔ)的數(shù)據(jù)值 push si mov si,offset s1 mov cl,bx add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表顏色為白底藍(lán)字 cmp dx,640 je ending add dx,160 mov di,dx pop si inc si inc bx jmp print ending: mov

14、 ax,04c00H int 21Hcode endsend start六、實(shí)驗(yàn)過(guò)程及解釋本次實(shí)驗(yàn)要求統(tǒng)計(jì)數(shù)據(jù)區(qū)內(nèi)正奇數(shù)、正偶數(shù)、負(fù)奇數(shù)、負(fù)偶數(shù)、零的個(gè)數(shù),首先將數(shù)據(jù)區(qū)的數(shù)值與0比擬,按數(shù)字的正、負(fù)或零的特性分別跳轉(zhuǎn)至處理正數(shù)的子程序段、處理負(fù)數(shù)的子程序段、處理零的子程序段。其中,在處理正、負(fù)數(shù)的子程序段,對(duì)于正負(fù)數(shù)進(jìn)行帶符號(hào)的除二運(yùn)算,通過(guò)判別余數(shù)是否為零判別該數(shù)是偶數(shù)還是奇數(shù),并且判別后將各個(gè)對(duì)應(yīng)的正奇數(shù)、正偶數(shù)、負(fù)奇數(shù)、負(fù)偶數(shù)、零的個(gè)數(shù)進(jìn)行統(tǒng)計(jì)。程序在統(tǒng)計(jì)完所有類型的數(shù)的個(gè)數(shù)后,會(huì)向顯存中寫入數(shù)字,將統(tǒng)計(jì)好的數(shù)值以可視化形式呈現(xiàn)出來(lái)。編譯運(yùn)行程序結(jié)果如下:a. 通過(guò)masm和link命令

15、使得程序編譯鏈接成功。b.由運(yùn)行結(jié)果可看到與數(shù)據(jù)區(qū)設(shè)置的正奇數(shù)、正偶數(shù)、負(fù)奇數(shù)、負(fù)偶數(shù)、零的個(gè)數(shù)一致。七、實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)相較于第一次實(shí)驗(yàn)而言,程序需要自己獨(dú)立設(shè)計(jì)并且首次涉及到了向屏幕打印數(shù)據(jù)的程序編寫。為了充分理解向屏幕打印數(shù)據(jù)的細(xì)節(jié)方面,我沒(méi)有選擇中斷的調(diào)用去打印數(shù)據(jù),而是自己往顯存中直接寫入數(shù)據(jù)并且在屏幕上呈現(xiàn)。為了編程實(shí)現(xiàn)字符向屏幕端的打印,我需要理解顯存的數(shù)據(jù)存儲(chǔ),如一個(gè)ASCII碼在屏幕端的顯示需要兩個(gè)字節(jié),屏幕通常一行是顯示80個(gè)字符,也即一行對(duì)應(yīng)160個(gè)字節(jié),同時(shí)要使得數(shù)據(jù)呈現(xiàn)時(shí)比擬美觀,還需要自己設(shè)計(jì)換行等數(shù)值的運(yùn)算,這些都花了我很多時(shí)間去調(diào)試,不過(guò)這也使得我更完整地理解了

16、顯存的工作原理,為之后實(shí)驗(yàn)打下了根底。實(shí)驗(yàn)三 代碼轉(zhuǎn)換程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?1.掌握幾種最根本的代碼轉(zhuǎn)換方法; 2.運(yùn)用子程序進(jìn)行程序設(shè)計(jì)。二、實(shí)驗(yàn)內(nèi)容1.從鍵盤上輸入假設(shè)干兩位十進(jìn)制數(shù),尋找其中的最小值,然后在屏幕上顯示出來(lái)。 2.兩個(gè)十進(jìn)制數(shù)之間的分隔符,輸入結(jié)束標(biāo)志自定,但要在報(bào)告中說(shuō)明。 3.對(duì)輸入要有檢錯(cuò)措施,以防止非法字符輸入,并有適當(dāng)?shù)奶崾尽?4.將整個(gè)程序分解為假設(shè)干模塊,分別用子程序?qū)崿F(xiàn).在報(bào)告中要給出模塊層次圖。三、 預(yù)習(xí)題1.如何將輸入的兩個(gè)字符(09)變?yōu)槭M(jìn)制或二進(jìn)制數(shù)?答:輸入的字符09是ASCII碼表示的,對(duì)應(yīng)于30H39H,通過(guò)減去30H,可以轉(zhuǎn)換為相應(yīng)的二進(jìn)制

17、數(shù)。2.如何將選出的最小值(二進(jìn)制或十進(jìn)制)變?yōu)?ASCII 碼再進(jìn)行顯示?答:由于在數(shù)據(jù)區(qū)存儲(chǔ)的最小數(shù)的數(shù)值為二進(jìn)制數(shù),同時(shí)要以十進(jìn)制易于讀的形式轉(zhuǎn)化為ASCII碼并顯示,需要進(jìn)行除十取商及取余運(yùn)算,并將取出的二進(jìn)制形式的商、余數(shù)加上30H,轉(zhuǎn)化為對(duì)應(yīng)的ASCII碼值。3.你覺(jué)得采用二進(jìn)制運(yùn)算還是十進(jìn)制運(yùn)算更適合于這個(gè)實(shí)驗(yàn)?答:由于存儲(chǔ)器、存放器中存儲(chǔ)的數(shù)據(jù)形式都是二進(jìn)制形式的,所以我覺(jué)得采用二進(jìn)制運(yùn)算更適于本實(shí)驗(yàn),我在程序的設(shè)計(jì)、編寫中也是采用了二進(jìn)制運(yùn)算。四、 程序流程圖a. 模塊層次圖b.完整程序流程圖五、程序源代碼;*;* 作者:LQ *;* 日期:2021/11/22 *;* 功能

18、: *;* 輸入假設(shè)干兩位十進(jìn)制數(shù),尋找最小值,并打印至屏幕(默認(rèn)十進(jìn)制數(shù)均為正數(shù)) *;*assume cs:codedata segment db 'Wrong Input!','$' db ' ','$' ;前兩行字符串,用于向屏幕打印發(fā)生錯(cuò)誤時(shí)的字符串 db 127,0,0 ;用于存儲(chǔ)輸入的數(shù)字,并且于首位存儲(chǔ)著最小的數(shù)值data endscode segmentmessage:db 'The minimum num is:','$' ;用于最后向屏幕打印最小值的字符串 start: mov

19、 ax,data mov ds,ax xor si,si mov di,1AH ;1AH對(duì)應(yīng)著存儲(chǔ)數(shù)字的區(qū)域 main: mov ah,0 ;int 16h 0編號(hào)功能是從鍵盤緩沖區(qū)讀取一個(gè)鍵盤值輸入 int 16h ;結(jié)果 ah存儲(chǔ)掃描碼,al 存儲(chǔ)ascii碼值 cmp ah,1cH ;1ch 為回車鍵的掃描碼,一旦按下回車表示程序輸入結(jié)束 je print_prog1 cmp ah,39H ;空格鍵的掃描鍵,作為兩個(gè)十進(jìn)制數(shù)之間的分隔符 je compare cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp sh

20、ort main show: inc di mov dx,0b800H ;將輸入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H sub al,30h mov di,al ret compare: mov dx,0b800H ;將輸入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H add si,2 mov al,di-1 mov bl,10 mul bl add al,di cmp al,di-2 jb minimum mov

21、 di,1AH jmp far ptr main minimum: mov di-2,al mov di,1AH jmp far ptr main print_prog1: ;作為中轉(zhuǎn),因?yàn)閜rint_prog程序段超出了je跳轉(zhuǎn)的范圍 jmp print_prog error: ;調(diào)用第10號(hào)中斷的2號(hào)子程序 mov ah,2 ;置光標(biāo) mov bh,0 mov dh,10 ;dh中放行號(hào) mov dl,35 ;dl中放列號(hào) int 10h mov dx,0 ;ds:dx 指向字符串的首地址 mov ah,9 ;使用int 21h號(hào)中斷例程的9號(hào)子程序 ;功能為在光標(biāo)位置顯示字符串 提供要顯

22、示的字符串的地址作為參數(shù) ;要顯示的字符串需用'$'作為結(jié)束符 int 21h mov cx,10H ;設(shè)置一個(gè)空循環(huán),用于保持錯(cuò)誤的提示一段時(shí)間 empty: loop empty mov ah,2 ;置光標(biāo) mov bh,0 mov dh,10 ;dh中放行號(hào) mov dl,35 ;dl中放列號(hào) int 10h mov dx,0DH ;ds:dx 指向字符串的空字符串地址 mov ah,9 ;使用int 21h號(hào)中斷例程的9號(hào)子程序 ;功能為在光標(biāo)位置顯示字符串 提供要顯示的字符串的地址作為參數(shù) ;要顯示的字符串需用'$'作為結(jié)束符 int 21h jmp

23、far ptr main print_prog:xor di,di add di,160 ;在屏幕的第二行打印輸出最小值 mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset message mov dx,0 mov bx,0 jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表顏色為黑底白字 inc di inc si jmp short print

24、 print_data: ;打印記錄存儲(chǔ)的數(shù)據(jù)值 mov ax,data mov ds,ax push si mov si,1AH mov cl,si ;取出最小數(shù)的數(shù)值 mov ch,0 mov ax,cx ;因?yàn)樵摂?shù)值在內(nèi)存中是以十六進(jìn)制存在的,要轉(zhuǎn)化為易于理解的ascii碼十進(jìn)制的形式,需要進(jìn)行除十取商和取余操作 mov bl,10 div bl mov cl,al ;獲取除十取商后的值即十位上的數(shù)值并打印 add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表顏色為白底藍(lán)字 inc di mov cl,a

25、h ;獲取除十取余后的值即個(gè)位上的數(shù)值并打印 add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表顏色為白底藍(lán)字 ending:mov ax,4c00H ;最終程序運(yùn)行結(jié)束 int 21H code endsend start六、實(shí)驗(yàn)過(guò)程及解釋1.本實(shí)驗(yàn)已完成的功能是:a.每次輸入一個(gè)兩位十進(jìn)制數(shù),按下空格后,會(huì)在存儲(chǔ)最小值的數(shù)據(jù)區(qū)將剛輸入的數(shù)值與當(dāng)前的最小數(shù)值進(jìn)行比對(duì),并時(shí)刻在數(shù)據(jù)區(qū)存儲(chǔ)當(dāng)前的最小數(shù)。如果想要向屏幕打印當(dāng)前所有輸入的數(shù)字中的最小數(shù)的數(shù)值時(shí),只需按下回車鍵,會(huì)將當(dāng)前的最小值打印至屏幕。b.如果按

26、下錯(cuò)誤的按鍵,屏幕中央會(huì)打印出輸入錯(cuò)誤的提醒,并且這個(gè)提醒只會(huì)顯示幾秒鐘,類似于彈窗效果,真正起到了提示作用。2.程序調(diào)試結(jié)果:a.通過(guò)masm和link命令使得程序編譯鏈接成功。b.正確輸入的時(shí)候,在此例中,輸出了最小數(shù)為02,其中02數(shù)字的顯示為白底藍(lán)字。c. 輸入錯(cuò)誤時(shí),會(huì)在屏幕中間彈出“wrong Input!的警告,警告保持幾秒后自動(dòng)消失。七、實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn),相較于上一個(gè)實(shí)驗(yàn)又是一個(gè)難度的提升,其中如何得到按鍵的值,并向屏幕打印出來(lái)對(duì)應(yīng)的按鍵值,還需要了解按鍵中斷觸發(fā)的工作原理,而這一塊在課堂上老師講解得很淺,還需要自己去查閱相關(guān)的資料。本實(shí)驗(yàn)中,我在研讀了王爽的?匯編語(yǔ)言?后選中

27、了int16中斷的0號(hào)功能,關(guān)于此功能的調(diào)用與使用我也是花了一些時(shí)間去琢磨,但此功能在之后的幾個(gè)實(shí)驗(yàn)中都有著極其重要的意義。此外,還有如何找到最小值,如何在按下不相關(guān)按鍵后提示錯(cuò)誤輸入并且只顯示幾秒,這些都用到了一些編程的小技巧,而這些小技巧都是我自己一點(diǎn)一點(diǎn)思索出來(lái)的,雖然功能很簡(jiǎn)單,但是在我看來(lái),這些都是很有趣、很讓我滿足的。實(shí)驗(yàn)四 子程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康? 1.進(jìn)一步掌握子程序設(shè)計(jì)方法; 2.進(jìn)一步掌握根本的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容: 1.從鍵盤上輸入某班學(xué)生的某科目成績(jī).輸入按學(xué)生的學(xué)號(hào)由小到大的順序輸入。 2.統(tǒng)計(jì)檢查每個(gè)學(xué)生的名次。 3.將統(tǒng)計(jì)結(jié)果在屏幕上顯示。4.為便于觀

28、察,輸入學(xué)生數(shù)目不宜太多,以不超過(guò)一屏為宜.輸出應(yīng)便于閱讀.盡可能考慮美觀。 5.輸入要有檢錯(cuò)手段。三、預(yù)習(xí)題: 1.如何確定一個(gè)學(xué)生在這門科目中的名次?答:此程序顯然屬于排序問(wèn)題,從簡(jiǎn)單的排序算法思考,我首先選定使用冒泡排序算法或是插入排序算法,由于插入排序的特性就如同它所介紹的一樣-我們?cè)谕婕埮茣r(shí),每一次抓牌前的紙牌都是排好序的,每一次插牌后也都是排好序的,按照這個(gè)特性去設(shè)計(jì)程序,可以很好地去貼合程序的設(shè)計(jì)。于是最后我選定插入排序去確定學(xué)生在科目中的名次。 2.你覺(jué)得輸入結(jié)束后,采用什么方法進(jìn)行比擬以得到學(xué)生的名次最為簡(jiǎn)單?答:因?yàn)楸緦?shí)驗(yàn)我所采取的是插入排序,所以最終輸入結(jié)束后就已經(jīng)得到了

29、最終學(xué)生的名次,所以輸入結(jié)束后無(wú)需再采用別的算法去確定學(xué)生名次。3.準(zhǔn)備好模塊層次圖。 4.給出輸出顯示的形式。 答:逐行顯示,每行依次顯示知名次、學(xué)號(hào)、成績(jī)。四、 程序設(shè)計(jì)流程圖五、程序源代碼;*;* 作者:LQ * ;* 日期:2021/11/23 * ;* 功能: * ;* 輸入假設(shè)干兩位十進(jìn)制數(shù),對(duì)應(yīng)著學(xué)生的科目成績(jī),按照科目成績(jī)進(jìn)行排序 * ;*assume cs:codedata segment db 'Wrong Input!','$' db ' ','$' ;前兩行字符串,用于向屏幕打印發(fā)生錯(cuò)誤時(shí)的字符串 db 9

30、0 dup(0) ;假定學(xué)生總數(shù)不大于45data endscode segmentmessage:db 'rank','$' start: mov ax,data mov ds,ax xor si,si mov di,19H ;19H對(duì)應(yīng)著存儲(chǔ)數(shù)字的區(qū)域前面一個(gè)區(qū)域 s: mov ah,0 ;int 16h 0編號(hào)功能是從鍵盤緩沖區(qū)讀取一個(gè)鍵盤值輸入 int 16h ;結(jié)果 ah存儲(chǔ)掃描碼,al 存儲(chǔ)ascii碼值 cmp ah,1cH ;1ch 為回車鍵的掃描碼,一旦按下回車表示程序結(jié)束 je print_prog1 cmp ah,39H ;空格鍵的掃描鍵,

31、作為兩個(gè)十進(jìn)制數(shù)之間的分隔符 je storage cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp short s error: ;調(diào)用第10號(hào)中斷的2號(hào)子程序 mov ah,2 ;置光標(biāo) mov bh,0 mov dh,10 ;dh中放行號(hào) mov dl,35 ;dl中放列號(hào) int 10h mov dx,0 ;ds:dx 指向字符串的首地址 mov ah,9 ;使用int 21h號(hào)中斷例程的9號(hào)子程序 ;功能為在光標(biāo)位置顯示字符串 提供要顯示的字符串的地址作為參數(shù) ;要顯示的字符串需用'$'作為結(jié)

32、束符 int 21h mov cx,10H ;設(shè)置一個(gè)空循環(huán),用于保持錯(cuò)誤的提示一段時(shí)間 empty: loop empty mov ah,2 ;置光標(biāo) mov bh,0 mov dh,10 ;dh中放行號(hào) mov dl,35 ;dl中放列號(hào) int 10h mov dx,0DH ;ds:dx 指向字符串的空字符串地址 mov ah,9 ;使用int 21h號(hào)中斷例程的9號(hào)子程序 ;功能為在光標(biāo)位置顯示字符串 提供要顯示的字符串的地址作為參數(shù) ;要顯示的字符串需用'$'作為結(jié)束符 int 21h jmp far ptr s show: ;輸入結(jié)束后,打印出排名、學(xué)號(hào)、成績(jī) in

33、c di mov dx,0b800H ;將輸入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H sub al,30h mov di,al ret print_prog1: ;作為中轉(zhuǎn),因?yàn)樘D(zhuǎn)至print_prog的范圍跨度超過(guò)了跳轉(zhuǎn)的范圍 jmp far ptr print_prog storage: ;每一次按下空格后,都會(huì)把數(shù)據(jù)存儲(chǔ),同時(shí)進(jìn)行插入排序 mov dx,0b800H ;將輸入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si

34、+1,07H ;對(duì)已經(jīng)輸入的數(shù)據(jù)進(jìn)行處理,有ascii碼值轉(zhuǎn)化為實(shí)際的數(shù)值,以及添加其對(duì)應(yīng)的學(xué)號(hào) add si,2 mov al,di-1 mov bl,10 mul bl add al,di mov di,al mov ax,di sub al,1bH mov bl,2 mov ah,0 div bl inc al mov di-1,al cmp al,1 je once dec ax mov cx,ax mov bx,di mov dh,bxcompare: ;對(duì)插入的數(shù)據(jù)進(jìn)行比對(duì),找到該插入的位置 sub bx,2 cmp dh,bx jna exchange loop compare

35、jmp exchange once: ;有些特殊情況: ;比方比對(duì)位置發(fā)現(xiàn)此時(shí)的位置最適宜,以及第一次插入數(shù)據(jù)時(shí)肯定是有序的 ;這種情況便不再進(jìn)行后續(xù)比對(duì)移動(dòng)這些操作,直接等待下一次的輸入 jmp far ptr s exchange: ;找到插入的位置后,將數(shù)據(jù)全部后移,騰出空位讓應(yīng)插入的數(shù)據(jù)插入 sub ax,cx mov cx,ax ;元素向后移動(dòng)的次數(shù)為比擬的次數(shù) mov ax,di dec ax mov bx,ax mov dh,di mov dl,di-1 jcxz once move: dec bx mov ah,bx mov bx+2,ah dec bx mov al,bx m

36、ov bx+2,al loop move mov bx+1,dh mov bx,dl jmp far ptr s print_prog:xor di,di add di,160 ;在屏幕的第二行打印輸出最小值 mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset message mov dl,1 ;顯示排名 mov bx,0 ;用于從數(shù)據(jù)區(qū)取出學(xué)號(hào),成績(jī)的標(biāo)識(shí) jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表顏色為黑底白字 inc di inc si jmp short print print_data: ;打印 數(shù)據(jù)存儲(chǔ)區(qū)存儲(chǔ)的學(xué)號(hào)、成績(jī) ;打印排名 mov cl,dl add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表顏色為

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論