2023年微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第1頁(yè)
2023年微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第2頁(yè)
2023年微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第3頁(yè)
2023年微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第4頁(yè)
2023年微機(jī)原理軟件實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第 信息與通信工程學(xué)院微機(jī)原理軟件實(shí)驗(yàn)報(bào)告班級(jí): 姓名: 學(xué)號(hào): 日期:2023年11月實(shí)驗(yàn)B 分支、循環(huán)程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康拈_始獨(dú)立進(jìn)行匯編語(yǔ)言程序設(shè)計(jì);掌握根本分支,循環(huán)程序設(shè)計(jì);掌握最簡(jiǎn)單的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容安排一個(gè)數(shù)據(jù)區(qū),內(nèi)存有假設(shè)干個(gè)正數(shù),負(fù)數(shù)和零。每類數(shù)的個(gè)數(shù)都不超過 9。編寫一個(gè)程序統(tǒng)計(jì)數(shù)據(jù)區(qū)中正數(shù),負(fù)數(shù)和零的個(gè)數(shù)。將統(tǒng)計(jì)結(jié)果在屏幕上顯示。選作題統(tǒng)計(jì)出正奇數(shù)、正偶數(shù),負(fù)奇數(shù)、負(fù)偶數(shù)以及零的個(gè)數(shù)。三、預(yù)習(xí)思考十進(jìn)制數(shù) 0 9 所對(duì)應(yīng)的 ASCII 碼是什么? 如何將十進(jìn)制數(shù) 0 9 在屏幕上顯示出來?09分別對(duì)應(yīng)ASCII碼的30H39H;由于數(shù)字09的ASCII碼

2、值與其代表的數(shù)值之間相差30H,因此將其減去30H即可得到以非壓縮型BCD數(shù)形式表示的十進(jìn)制數(shù)。如何檢驗(yàn)一個(gè)數(shù)為正,為負(fù)或?yàn)榱悖?你能舉出多少種不同的方法?一是直接用CMP命令和0比較(CMP X,0 ),然后檢驗(yàn)標(biāo)志位CF,CF=1那么X為負(fù)數(shù),CF=0接著檢驗(yàn)ZF,ZF=1那么X為零,ZF=0那么X為正數(shù);二是使用邏輯或移位運(yùn)算,和0相比是否相等,用數(shù)和10000000相與,取出符號(hào)位判斷,可區(qū)分正負(fù)。四、實(shí)驗(yàn)過程流程圖源代碼data segmentarray db 1,4,3,2,5,7,-1,-2,-6,0,0,0;自定義數(shù)組length EQU $-array ;數(shù)組長(zhǎng)度pnum d

3、b ? ;正數(shù)個(gè)數(shù)nnum db ? ;負(fù)數(shù)個(gè)數(shù)zero db ? ;零的個(gè)數(shù)peven db ? ;正偶數(shù)個(gè)數(shù)podd db ? ;正奇數(shù)個(gè)數(shù)neven db ? ;負(fù)偶數(shù)個(gè)數(shù)nodd db ? ;負(fù)奇數(shù)個(gè)數(shù)POSICHAR DB Positive: $;用于打印字符串定義NEGTCHAR DB Negtive: $ZEROCHAR DB Zero: $EVENCHAR DB Even: $ODDCHAR DB Odd: $CR DB 0DH,0AH,$; 回車換行的ASCII碼data ends;code segmentassume cs:code,ds:datastart:mov ax,

4、datamov ds,axmov si,offset array ;offset指令取array的偏移地址dec si ;偏移地址先減1mov cl,length ;數(shù)組長(zhǎng)度賦予CLxor al,allop:cmp cl,0 ;余下數(shù)組長(zhǎng)度不為0,那么繼續(xù)循環(huán)je print;cl為0跳出循環(huán)inc si;偏移地址加1,比較下一位數(shù)字dec cl;余下數(shù)組長(zhǎng)度減1mov bl,si;采用存放器間接尋址方式cmp bl,0;和0比較jg posi;正數(shù)跳轉(zhuǎn)jz zo;零跳轉(zhuǎn)jl neg;負(fù)數(shù)跳轉(zhuǎn)posi:inc pnum;正數(shù)個(gè)數(shù)加1test bx,01h;檢測(cè)最后一位是否是0jz pep;是0

5、,即為偶數(shù)那么跳轉(zhuǎn)至pepinc podd;不是0,那么正奇數(shù)個(gè)數(shù)加1jmp loppep:inc peven;正偶數(shù)個(gè)數(shù)加1jmp lopzo:inc zero;零的個(gè)數(shù)加1jmp lopneg:inc nnum;負(fù)數(shù)個(gè)數(shù)加1test bx,01h;檢測(cè)最后一位是否是0jz nep;是0,即為偶數(shù)那么跳轉(zhuǎn)至nepinc nodd;不是0,那么負(fù)奇數(shù)個(gè)數(shù)加1jmp lopnep:inc neven;正偶數(shù)個(gè)數(shù)加1jmp lopprint:mov ah,09h ;打印正數(shù)個(gè)數(shù)mov dx,offset POSICHARint 21h;系統(tǒng)功能調(diào)用mov ah,02hmov dl,pnumadd

6、dl,30hint 21hmov ah,09hmov dx,offset eventcharint 21hmov ah,02hmov dl,pevenadd dl,30hint 21hmov ah,09hmov dx,offset oddcharint 21hmov ah,02hmov dl,poddmov dl,30hint 21hmov dx,offset crmov ah,09hint 21h;mov ah,09h ;打印負(fù)數(shù)個(gè)數(shù)mov dx,offset negtcharint 21h;系統(tǒng)功能調(diào)用mov ah,02hmov dl,nnumadd dl,30hint 21hmov ah

7、,09hmov dx,offset eventcharint 21hmov ah,02hmov dl,nevenadd dl,30hint 21hmov ah,09hmov dx,offset oddcharint 21hmov ah,02hmov dl,noddmov dl,30hint 21hmov dx,offset crmov ah,09hint 21hmov ah,09hmov dx,offset zerocharint 21h;系統(tǒng)功能調(diào)用mov ah,02hmov dl,zeroadd dl,30hint 21hext:mov ax 4c00hint 21hcode endsen

8、d start實(shí)驗(yàn)分析數(shù)據(jù)區(qū)待統(tǒng)計(jì)的數(shù)據(jù)為:1,4,3,2,5,7,-1,-2,-6,0,0,0實(shí)驗(yàn)結(jié)果如以下圖所示:理論知識(shí)積累EQU:等價(jià)語(yǔ)句,一般使用格式為 符號(hào)名 EQU 表達(dá)式 ,作用是左邊的符號(hào)名代表右邊的表達(dá)式,當(dāng)把一個(gè)常量或表達(dá)式定義成一個(gè)具有一定含義的符號(hào)名后,在程序中就可以用該符號(hào)名來代表該常量或表達(dá)式。等價(jià)語(yǔ)言不會(huì)給符號(hào)名分配存儲(chǔ)空間,符號(hào)名不能與其他符號(hào)同名,也不能被重新定義。test指令屬于邏輯運(yùn)算指令,功能是執(zhí)行BIT與BIT之間的邏輯運(yùn)算測(cè)試,tsst對(duì)兩個(gè)參數(shù)目標(biāo),源執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標(biāo)致存放器,結(jié)果本身不會(huì)保存兩操作數(shù)與運(yùn)算,僅修改標(biāo)志位,不送

9、會(huì)結(jié)果。int 21H系統(tǒng)調(diào)用由DOS提供的一組實(shí)現(xiàn)特殊功能的子程序供程序員在編寫自己的程序時(shí)調(diào)用,以減輕編程的工作量;調(diào)用的實(shí)現(xiàn)步驟大概是系統(tǒng)功能送到存放器AH中,入口參數(shù)送到指定存放器中,用int 21H指令執(zhí)行功能調(diào)用,根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況。字符顯示的實(shí)現(xiàn)問題,首先把數(shù)據(jù)轉(zhuǎn)換成ASCII碼,然后調(diào)用DOS功能將其顯示。要特別注意每段待輸出的字符串都要以$結(jié)尾,不然無法識(shí)別串尾,輸出亂碼。實(shí)驗(yàn)C 代碼轉(zhuǎn)換程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康恼莆諑追N最根本的代碼轉(zhuǎn)換方法;運(yùn)用子程序進(jìn)行程序設(shè)計(jì)。二、實(shí)驗(yàn)內(nèi)容從鍵盤上輸入假設(shè)干兩位十進(jìn)制數(shù),尋找其中的最小值,然后在屏幕上顯示出來。兩個(gè)十進(jìn)制數(shù)之間的

10、分隔符,輸入結(jié)束標(biāo)志自定,但要在報(bào)告中說明。對(duì)輸入要有檢錯(cuò)措施,以防止非法字符輸入,并有適當(dāng)?shù)奶崾?。將整個(gè)程序分解為假設(shè)干模塊,分別用子程序?qū)崿F(xiàn)。在報(bào)告中要給出模塊層次圖。三、預(yù)習(xí)思考如何將輸入的兩個(gè)字符(09)變?yōu)槭M(jìn)制或二進(jìn)制數(shù)?答:輸入的字符09是ASCII碼表示的,對(duì)應(yīng)于30H39H,通過減去30H,高位數(shù)乘以十加上低位數(shù),即變?yōu)槭M(jìn)制數(shù)。如何將選出的最小值(二進(jìn)制或十進(jìn)制)變?yōu)?ASCII 碼再進(jìn)行顯示?答:可以直接讀入并存儲(chǔ)數(shù)字的ASCII碼,容易比較其大小,然后輸出時(shí)商和余數(shù)分別加上30H后顯示在屏幕上。你覺得采用二進(jìn)制運(yùn)算還是十進(jìn)制運(yùn)算更適合于這個(gè)實(shí)驗(yàn)?答:采用二進(jìn)制或者十進(jìn)制

11、都需要進(jìn)行ASCII碼到數(shù)字的轉(zhuǎn)換和其反向轉(zhuǎn)換。直接使用數(shù)字對(duì)應(yīng)的ASCII比較,分別比較十位和個(gè)位,最后直接輸出十進(jìn)制字符即可。四、實(shí)驗(yàn)過程流程圖模塊層次圖源代碼DATA SEGMENTINPUT DB 100 DUP(?)MINTMP DB 9-30H,9-30H ; 最小值初始99COUNT DB 0DIFERROR DB 0D; 判斷調(diào)用輸入子程序是否有錯(cuò)WELCOME DB Please input numbers:,$OUTTIP DB Minimum is :,$CR DB 0DH,0AH,$; 回車換行 ERROR1 DB ERROR:Character is not vali

12、d!,$ ;錯(cuò)誤輸入提示 ERROR2 DB ERROR:Number must contains two digits!,$ ERROR3 DB ERROR:Number is empty!,$ ERROR4 DB ERROR:Need separate char!,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV DX,OFFSET WELCOME CALL PRINT MOV DX,OFFSET CR; 回車換行 CALL PRINT CALL GETNUM; 獲取輸入

13、 CMP IFERROR,0; 判斷輸入過程是否有錯(cuò) JNZ BACK; 錯(cuò)誤那么直接返回DOS MOV DX,OFFSET CR; 回車換行 CALL PRINT CALL FINDMIN; 查找最小數(shù) MOV DX,OFFSET OUTTIP; 輸出提示 CALL PRINT MOV AH,02H MOV DL,MINTMP; 輸出最小值的十位 ADD DL,30H INT 21H MOV AH,02H MOV DL,MINTMP1; 輸出最小值的個(gè)位 ADD DL,30H INT 21H BACK: MOV AX,4C00H ; 返回DOS INT 21HMAIN ENDPGETNUM

14、PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV DI,0 ; 數(shù)組偏移地址 MOV CX,0 ; 標(biāo)識(shí)數(shù)字的位數(shù)GETLOOP: MOV AH,01H ; 從鍵盤讀取一個(gè)字符 INT 21H CMP AL,0DH ; 和回車比較 JE EXIT1 ; 是回車那么結(jié)束輸入 CMP CX,0 ; 數(shù)字位數(shù)為空 JE CMPSPACE0 CMP CX,1 ; 數(shù)字位數(shù)為1 JE CMPSPACE1 CMP CX,2 ; 數(shù)字位數(shù)為2 JE CMPSPACE2CMPSPACE0: CMP AL,20H JE GETLOOP ; 位數(shù)為0,輸入空格,忽略

15、 JMP ASCBIN ; 否那么讀取字符CMPSPACE1: CMP AL,20H JE ERR2 ; 位數(shù)為1,輸入空格,出錯(cuò) JMP ASCBIN ; 否那么讀取字符CMPSPACE2: CMP AL,20H JNE ERR4 ; 位數(shù)為2后,不輸入空格,錯(cuò)誤 XOR CX,CX ; 輸入空格,清零重計(jì) JMP GETLOOP ASCBIN: SUB AL,30H ; 化為二進(jìn)制 JL ERR1 ; 小于,無效字符 CMP AL,9 JG ERR1 ; 大于9是無效字符 MOV INPUTDI,AL ; 保存 INC COUNT ; 統(tǒng)計(jì)輸入的數(shù)字個(gè)數(shù) INC DI ; 向后移動(dòng)數(shù)組 I

16、NC CX JMP GETLOOPERR1: MOV IFERROR,1 MOV DX,OFFSET ERROR1 CALL PRINT JMP RETURNERR2: MOV IFERROR, MOV DX,OFFSET ERROR2 CALL PRINT JMP RETURN ERR3: MOV IFERROR,1 MOV DX,OFFSET ERROR3 CALL PRINT JMP RETURN ERR4: MOV IFERROR,1 MOV DX,OFFSET ERROR4 CALL PRINT JMP RETURN EXIT1: MOV BL,COUNT ; 判斷輸入數(shù)的個(gè)數(shù)是否為

17、零 CMP BL,0 JE ERR3 ;輸入數(shù)目為0,輸出錯(cuò)誤,退出 AND BL,01H ; 判斷數(shù)字是否為兩位數(shù) CMP BL,0 JNE ERR2 ;輸入數(shù)字個(gè)數(shù)為奇數(shù)那么出錯(cuò)RETURN: POP D POP DX POP CX POP BX POP AX RETGETNUM ENDPPRINT PROC PUSH AX MOV AH,09H INT 21H POP AX RETPRINT ENDPFINDMIN PROC PUSH DI PUSH AX PUSH CX MOV DI,-2 ; 數(shù)組下標(biāo) MOV CL,COUNT ; 把數(shù)組長(zhǎng)度移入CX MOV AL,CL CBW MO

18、V CX,AXLOP: ADD DI,2 CMP CX,DI ; 是否已經(jīng)比較完畢 JE EXIT2 ; 比較完畢,退出 MOV AH,INPUTDI ;否那么接著比較,移入十位數(shù) MOV AL,INPUTDI+1 ; 移入個(gè)位數(shù) CMP AH,MINTMP ; 比較十位數(shù),MINTMP低地址為十位 JA LOP ;如果MINTMP小,那么直接比較下一個(gè)數(shù) JE HIGHEQU ;如果十位數(shù)相等,比較個(gè)位數(shù),再否那么十位大就直接存儲(chǔ)STOMIN: MOV MINTMP,AH MOV MINTMP1,AL JMP LOPHIGHEQU: CMP AL,MINTMP1; 比較個(gè)位數(shù) JNB LOP

19、 ; 個(gè)位數(shù)比MINTMP大那么跳到下一個(gè)數(shù) JMP STOMIN ; 否那么將當(dāng)前數(shù)寫入為MINTMPEXIT2: POP CX POP AXPOP DI RETFINDMIN ENDPCODE ENDS END MAIN實(shí)驗(yàn)分析實(shí)驗(yàn)中以空格為分隔符,空格的個(gè)數(shù)不限制,以回車為輸入結(jié)束標(biāo)志符。對(duì)輸入的數(shù)字進(jìn)行了位數(shù)和范圍的嚴(yán)格限制,即必須是兩位數(shù)字,如果數(shù)字小于10,需要補(bǔ)齊零??崭穹指舨煌瑪?shù)字輸入,回車結(jié)束。一位數(shù)后面空格為錯(cuò)誤,回車后判斷。理論知識(shí)積累1.iferror :如果公式的計(jì)算結(jié)果為錯(cuò)誤,那么返回指定的值;否那么返回公式的結(jié)果。2.call指令(調(diào)用指令)功能主要有:將下一條指

20、令的所在地址即程序計(jì)數(shù)器PC的內(nèi)容入棧,并將子程序的起始地址送入PC,于是CPU的下一條指令就會(huì)轉(zhuǎn)去執(zhí)行子程序。實(shí)驗(yàn)D 子程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康倪M(jìn)一步掌握子程序設(shè)計(jì)方法;進(jìn)一步掌握根本的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容從鍵盤上輸入某班學(xué)生的某科目成績(jī)。輸入按學(xué)生的學(xué)號(hào)由小到大的順序輸入。統(tǒng)計(jì)檢查每個(gè)學(xué)生的名次。將統(tǒng)計(jì)結(jié)果在屏幕上顯示。為便于觀察,輸入學(xué)生數(shù)目不宜太多,以不超過一屏為宜。輸出應(yīng)便于閱讀.盡可能考慮美觀。輸入要有檢錯(cuò)手段。預(yù)習(xí)思考如何確定一個(gè)學(xué)生在這門科目中的名次?答:1.可以抽取每個(gè)學(xué)生的成績(jī)和其他所有學(xué)生的成績(jī)進(jìn)行比較,然后統(tǒng)計(jì)比其分?jǐn)?shù)高的學(xué)生,得出該學(xué)生的名次。2.可以把學(xué)生成

21、績(jī)存入連續(xù)內(nèi)存區(qū)域,即數(shù)組方式,取得每個(gè)學(xué)生的成績(jī)偏移量,即成績(jī)指針。然后比較指針?biāo)傅某煽?jī)的大小,根據(jù)比較結(jié)果移動(dòng)指針完成排序。輸入結(jié)束后,采用什么方法進(jìn)行比較以得到學(xué)生的名次最為簡(jiǎn)單?答:采用移動(dòng)指針完成排序的方法在匯編語(yǔ)言下實(shí)現(xiàn),復(fù)雜度較高。由于人數(shù)比較少,冒泡法還是比較簡(jiǎn)潔的。冒泡法的時(shí)間和空間性能都還不錯(cuò),可以接受。主程序準(zhǔn)備好模塊層次圖。主程序顯示名次計(jì)數(shù)器循環(huán)比較成績(jī)顯示名次計(jì)數(shù)器循環(huán)比較成績(jī) 4.給出輸出顯示的形式。 答:根據(jù)輸入的每個(gè)學(xué)生的ID,成績(jī),列出一個(gè)表,后面跟著排名次數(shù)。 具體形式參見實(shí)驗(yàn)分析局部的輸出截圖。四、實(shí)驗(yàn)過程流程圖源代碼DATA SEGMENTID DB

22、 400 DUP(?);存儲(chǔ)學(xué)號(hào)MARK DB 20 DUP(?); 存儲(chǔ)分?jǐn)?shù)RANK DB 20 DUP(?); 存儲(chǔ)排名RANKTMP DB 20 DUP(?); 臨時(shí)排序指針MTMP DB ?; 臨時(shí)記錄成績(jī)COUNTB DB ?; 總的學(xué)生的個(gè)數(shù)COUNTW DW ?; 總的學(xué)生個(gè)數(shù)CHEOK DB ?; 輸入檢查標(biāo)志位ERROR DB ?; 記錄錯(cuò)誤號(hào)TMP DB 2 DUP(?);判斷、計(jì)數(shù)CR DB 0DH,0AH,$; 回車TAB DB 09H,09H,$;輸出TAB鍵ERR0 DB Input cannot be empty!,$ERR2 DB Character is in

23、valid!,$ERR4 DB Mark is invalid!,$ERR6 DB Input is invalid!,$ERRLIST DW ERR0,ERR2,ERR4,ERR6TIP0 DB Please re-input:,$TIP1 DB Please input number of students:,$TIP2 DB Please input ID and MARK:,$PRTIP DB RESULT,$PRINFO DB ID,09H,09H,MARK,09H,09H,RANK,$PRPRE1 DB ID : ,$PRPRE2 DB MARK: ,$BUFF DB 16;最長(zhǎng)的

24、字符長(zhǎng)度PRES DB ?; 存儲(chǔ)實(shí)際輸入字符數(shù)CHAR DB 16 DUP(?); 實(shí)際可存儲(chǔ)有效字符16個(gè)DATA ENDSCODE SEGMENTPRINTTIP MACRO PARAPUSH AXPUSH DXMOV AH,09HMOV DX,OFFSET PARAINT 21HPOP DXPOP AXENDMPRINTCHAR MACRO ACHARPUSH AXPUSH DXMOV AH,02HMOV DL,ACHARINT 21HPOP DXPOP AXENDMMAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA MOV AX,DATA MOV

25、 DS,AX MOV ES,AX CALL GETNUMBER; 人數(shù) CALL GETINFO;分?jǐn)?shù) CALL SORT; 排序 CALL PRINT; 顯示BACK:MOV AX,4C00H; 返回DOS INT 21HMAIN ENDPGETNUMBER PROC NEARPUSH AXPUSH BXHE:PRINTTIP TIP1GREP: CALL GETINMOV CHEOK,0CALL CHECKCMP CHEOK,0JE GRETURNMOV ERROR,6CALL PRINTERRPRINTTIP TIP0 PRINTTIP CRJMP GREPERRHERE: PRINTT

26、IP CRMOV ERROR,6CALL PRINTERRPRINTTIP TIP0JMP GREP GRETURN: CALL CHANGEMOV AL,MTMPCMP AL,0JE ERRHEREMOV COUNTB,AL CBWMOV COUNTW,AXPRINTTIP CRPOP BXPOP AXRETGETNUMBER ENDPGETINFO PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIPRINTTIP TIP2MOV TMP,0; 學(xué)號(hào)還是分?jǐn)?shù)XOR BX,BX; ID的偏移量XOR AX,AX; 記錄學(xué)生數(shù)目MORE:PR

27、INTTIP CRCMP COUNTB,AL JNZ HERE1 JMPRETURN; 計(jì)數(shù)器為0,返回父程序HERE1: CMP TMP,0JE PR1CMP TMP,1JE PR2PR1:PRINTTIP PRPRE1JMP HERE2PR2:PRINTTIP PRPRE2HERE2:CALL GETIN; 否那么接受輸入CALL CHECK; 檢查是否是數(shù)字且不為空CMP CHEOK,0JNE CHEFAILCMP TMP,0JE ISID ; 輸入學(xué)號(hào)CMP TMP,1 ; JE ISMARK ;輸入分?jǐn)?shù)CHEFAIL:PRINTTIP TIP0 PRINTTIP CRMOV CHEO

28、K,0; 返回判斷位置零JMP MOREISID:MOV DL,PRES XOR DH,DHMOV CX,DXMOV SI,CXINC CXMOV CHARSI,$;開始寫入IDMOV TMP,1; 下一個(gè)是分?jǐn)?shù)CLDMOV SI,OFFSET CHARMOV DI,OFFSET IDADD DI,BXREP MOVSB ;寫入IDADD BX,16; ID的偏移地址向后挪動(dòng)固定的16BYTEJMP MORE; 跳回繼續(xù)輸入下一個(gè)BUFFISMARK:CALL CHANGECMP CHEOK,0JE WRITEMARKMOV ERROR,4JMP CHEFAILWRITEMARK:PUSH B

29、XMOV BL,MTMPMOV DI,AXMOV MARKDI,BL; 實(shí)際寫入成績(jī)POP BXMOV TMP,0; 計(jì)數(shù)清理INC AX; 已接受的學(xué)生數(shù)+1JMP MORERETURN:POP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETGETINFO ENDPGETIN PROC NEARPUSH AXPUSH DXPUSH DIMOV DX,OFFSET BUFFMOV AH,0AHINT 21HPOP DIPOP DXPOP AXRETGETIN ENDPCHECK PROC NEARPUSH DIPUSH CXPUSH AXXOR DI,DI; 記錄CHA

30、R讀取的偏移量MOV AL,PRES; 讀取輸入的BUFF中的字符數(shù)CBWMOV CX,AXCMP CX,0; 判斷是否輸入BUFF為空J(rèn)E ISEMPTY; 為空,重新輸入AGAIN:CMP CX,DIJE RETURNCHECKMOV AH,CHARDICMP AH,30H; JL INVALID; 小于,無效字符CMP AH,39H; JG INVALID; 大于,無效字符INC DIJMP AGAINISEMPTY: MOV ERROR,0 ;輸入為空的處理代碼PRINTTIP CRCALL PRINTERRPRINTTIP CRMOV CHEOK,1JMP RETURNCHECKIN

31、VALID: MOV ERROR,2; 輸入不合法的處理代碼PRINTTIP CRCALL PRINTERRPRINTTIP CRMOV CHEOK,1RETURNCHECK:POP AXPOP CXPOP DIRETCHECK ENDPCHANGE PROC NEAR PUSH AXPUSH BXPUSH CX MOV CL,PRES CMP CL,3JA MINVALID; 四位數(shù)或以上,溢出 JE THRDIG; 三位數(shù) CMP CL,2 JE TWODIG; 兩位數(shù) CMP CL,1 JE ONEDIG; 一位數(shù)THRDIG:MOV BL,CHAR0; 百位SUB BL,30HCMP

32、BL,1JNE MINVALIDMOV BL,CHAR1; 十位SUB BL,30HCMP BL,0JNE MINVALIDMOV BL,CHAR2; 個(gè)位SUB BL,30HCMP BL,0JNE MINVALIDMOV MTMP,100 JMP CRETURNTWODIG:MOV BL,CHAR0; 十位SUB BL,30HCMP BL,0JE MINVALIDMOV AL,10MUL BL; 乘以10取得十位數(shù)MOV BL,CHAR1; 個(gè)位SUB BL,30HADD AL,BLMOV MTMP,AL; 寫入轉(zhuǎn)換后的數(shù)字JMP CRETURNONEDIG: ;一位數(shù)時(shí)直接寫入臨時(shí)成績(jī)區(qū)M

33、OV BL,CHAR0; 個(gè)位SUB BL,30HMOV MTMP,BLJMP CRETURNMINVALID:MOV ERROR,4CALL PRINTERRMOV CHEOK,1 CRETURN:POP CXPOP BXPOP AX RETCHANGE ENDPPRINTERR PROC NEARPUSH AXPUSH DXPUSH BX MOV AL,ERRORCBWMOV BX,AXMOV AH,09H MOV DX,ERRLISTBXINT 21HPOP BXPOP DXPOP AXRETPRINTERR ENDPSORT PROC NEAR PUSH AX PUSH BX PUSH

34、 CX PUSH DX PUSH SI PUSH DI MOV AL,COUNTB; 讀取學(xué)生數(shù)目 XOR BX,BX; BX作尋址計(jì)數(shù)器SLOP: DEC AL MOV RANKTMPBX,AL INC BX CMP AL,0 JNE SLOP MOV CX,COUNTW; CX記錄總學(xué)生人數(shù) DEC CX JZ WRRAKLOP1: XOR DI,DILOP2: MOV AL,RANKTMPDI; 取出地址指針,即成績(jī)偏移量 XOR AH,AH MOV SI,AX MOV DL,MARKSI; 取出成績(jī)1 MOV AL,RANKTMPDI+1 XOR AH,AH MOV SI,AX MOV

35、 DH,MARKSI;同理取出成績(jī)2 CMP DL,DH JGE NEXTCMP MOV AH,RANKTMPDI; 交換分?jǐn)?shù)指針 XCHG AH,RANKTMPDI+1 MOV RANKTMPDI,AH NEXTCMP: INC DI CMP DI,CX JNE LOP2 LOOP LOP1WRRAK: XOR SI,SI MOV CX,COUNTW MOV BL,1; 保存名次LOPSAVE: CMP SI,CX JE FINISH MOV AL,RANKTMPSI; 提取該名次學(xué)生的地址指針 XOR AH,AH MOV DI,AX MOV RANKDI,BL ; 寫入學(xué)生名次 INC B

36、L INC SI JMP LOPSAVEFINISH: POP DI POP SI POP DX POP CX POP BX POP AX RETSORT ENDPPRINT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPRINTTIP CRPRINTTIP PRTIP PRINTTIP CRPRINTTIP PRINFOPRINTTIP CRMOV CX,COUNTW; CX保存學(xué)生數(shù)XOR SI,SI; SI指明當(dāng)前處理的學(xué)生序號(hào)XOR BX,BX; BX保存當(dāng)前輸入學(xué)號(hào)偏移量NEXPRINT:MOV TMP1,0; 對(duì)打印名次置標(biāo)志位CMP S

37、I,CXJNE PRINTIDJMP PRETPRINTID:;打印學(xué)號(hào),直接字符串打印MOV AH,09HMOV DX,OFFSET IDADD DX,BXINT 21HPRINTTIP TABPRINTMARK:MOV AL,MARKSIPRINTRANK:CMP AL,100JE PTTHRCMP AL,10JL PTONEJMP PTTWOPTTHR:PRINTCHAR 1PRINTCHAR 0PRINTCHAR 0JMP NEXTPTTWO: CBWPUSH BXMOV BL,10DIV BLMOV BX,AXADD BL,30HADD BH,30HPRINTCHAR BLPRINT

38、CHAR BHPOP BXJMP NEXTPTONE:ADD AL,30HPRINTCHAR ALNEXT:PRINTTIP TABMOV AL,RANKSICMP TMP1,0JNE FINISHPMOV TMP1,1 JMP PRINTRANKFINISHP:PRINTTIP CR INC SIADD BX,16 JMP NEXPRINTPRET:POP SIPOP DXPOP CXPOP BXPOP AXRETPRINT ENDPCODE ENDS END MAIN實(shí)驗(yàn)分析實(shí)驗(yàn)E 中斷程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康某醪秸莆罩袛喑绦虻脑O(shè)計(jì)方法;初步掌握修改 DOS 系統(tǒng)中斷,以適應(yīng)實(shí)際使用的方法。二

39、、實(shí)驗(yàn)內(nèi)容編寫一個(gè)32位二進(jìn)制數(shù)除以16位二進(jìn)制數(shù)的除法程序。觀察當(dāng)除數(shù)為 0,或超過相應(yīng)存放器范圍時(shí),程序執(zhí)行的結(jié)果。修改零號(hào)中斷效勞程序,使它具有以下功能:判斷除數(shù)是否為0,當(dāng)除數(shù)為0時(shí),顯示相應(yīng)的結(jié)果;當(dāng)除數(shù)不為0時(shí),采用適當(dāng)?shù)姆椒ㄍ瓿缮坛^16位的二進(jìn)制數(shù)的除法運(yùn)算。注意必須保護(hù)原有中斷效勞程序的入口地址,并在程序完畢前加以恢復(fù)。三、預(yù)習(xí)思考如何保護(hù)原有中斷向量表中的中斷效勞程序的入口地址?答:先讀取中斷向量表中0號(hào)中斷的地址,壓入堆棧,程序結(jié)束時(shí)彈出堆棧,寫回中斷向量表即可。如何將你的中斷效勞程序入口地址置入中斷向量表?答:有兩種根本方法:一是直接寫入法,使用指令將中斷效勞程序入口地

40、址的IP寫入n4的RAM位置,中斷效勞程序入口的CS寫入n4+2的位置;二是DOS功能調(diào)用,25H用來寫中斷向量表,35H讀中斷向量表。四、實(shí)驗(yàn)過程流程圖源代碼 Data segment str01 db Please input a binary divident,at most 32 digited!,0dh,0ah,$ str02 db 0dh,0ah,Please input a binary divisor,at most 16 digited!,0dh,0ah,$ str0 db 0dh,0ah,Illegal input,please input again!,0dh,0ah,$

41、 str1 db 0dh,0ah,Divisor should not be 0!$ str3 db 0dh,0ah,Quotient:$ str4 db 0dh,0ah,Residual:$ dividend _ h dw 0 dividend _ l dw 0 divisor dw 0 quotient dw 2 dup(0) residual dw 0 keepip dw 0 keepcs dw 0data endsstack segment stack stack db 100 dup(?)stack endscode segment para code assume cs:code,

42、ss:stack,ds:data,es:datasta proc far push dsxor ax, axpush axmov ax, datamov ds,axmov es,axmov ax,3500hint 21hmov keepip,bxmov keepcs,esclipush ds ;中斷程序裝載mov ax,seg myovflmov ds,axmov dx,offset myovflmov ax,2500hint 21hpop dssticall input mov ax,divident_lmov dx,divident_hmov bx,divisor cmp bx,0jnz

43、nextlea dx,str1mov ah,9int 21hjmp done next:div bxmov quotient,axmov residual,dx rtaddr:call output;返回后輸出商和余數(shù) done:cli;恢復(fù)原中斷向量push dsmov dx,keepipmov ax,keepcsmov ds,axmov ax,2500h int 21hpop dsstiret myovfl:pop cx;中斷效勞程序lea cx,rtaddrpush cxpush axmov ax,dxmov dx,0div bxmov quotient+2,axpop axdiv bx

44、mov quotient,axmov residual,dxstiiretsta endpcheck proc;輸入檢錯(cuò),標(biāo)志為blcmp al,0jl falsecmp al,1jg falsemov bl,1jmp exit false:mov bl,0 exit:retcheck endpinput proc;依次輸入被除數(shù)和除數(shù)lea dx,str01mov ah,9int 21hmov cx,32;被除數(shù)最多32位 input1:mov ah,1int 21hcmp cx,32;第一個(gè)字符不能為回車符jz next1cmp al,0dhjz done1 next1:call checkcmp bl,0jz err1and al,0fh;輸入字符的轉(zhuǎn)化sal divident_l,1rcl divident_h,1mov ah,0add divident_l,axadc divident_h,0jmp l1 err1:lea dx,str0mov ah,9int 21hinc cx l1:loop input1 done1:lea dx,str02mov ah,9int 21h mov cx,16

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論