2023年微機原理軟件實驗報告_第1頁
2023年微機原理軟件實驗報告_第2頁
2023年微機原理軟件實驗報告_第3頁
2023年微機原理軟件實驗報告_第4頁
2023年微機原理軟件實驗報告_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

3、b ? ;正數(shù)個數(shù)nnum db ? ;負數(shù)個數(shù)zero db ? ;零的個數(shù)peven db ? ;正偶數(shù)個數(shù)podd db ? ;正奇數(shù)個數(shù)neven db ? ;負偶數(shù)個數(shù)nodd db ? ;負奇數(shù)個數(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ù)組長度賦予CLxor al,allop:cmp cl,0 ;余下數(shù)組長度不為0,那么繼續(xù)循環(huán)je print;cl為0跳出循環(huán)inc si;偏移地址加1,比較下一位數(shù)字dec cl;余下數(shù)組長度減1mov bl,si;采用存放器間接尋址方式cmp bl,0;和0比較jg posi;正數(shù)跳轉jz zo;零跳轉jl neg;負數(shù)跳轉posi:inc pnum;正數(shù)個數(shù)加1test bx,01h;檢測最后一位是否是0jz pep;是0

5、,即為偶數(shù)那么跳轉至pepinc podd;不是0,那么正奇數(shù)個數(shù)加1jmp loppep:inc peven;正偶數(shù)個數(shù)加1jmp lopzo:inc zero;零的個數(shù)加1jmp lopneg:inc nnum;負數(shù)個數(shù)加1test bx,01h;檢測最后一位是否是0jz nep;是0,即為偶數(shù)那么跳轉至nepinc nodd;不是0,那么負奇數(shù)個數(shù)加1jmp lopnep:inc neven;正偶數(shù)個數(shù)加1jmp lopprint:mov ah,09h ;打印正數(shù)個數(shù)mov dx,offset POSICHARint 21h;系統(tǒng)功能調用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 ;打印負數(shù)個數(shù)mov dx,offset negtcharint 21h;系統(tǒng)功能調用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)功能調用mov ah,02hmov dl,zeroadd dl,30hint 21hext:mov ax 4c00hint 21hcode endsen

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

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

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

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

12、d!,$ ;錯誤輸入提示 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; 判斷輸入過程是否有錯 JNZ BACK; 錯誤那么直接返回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; 輸出最小值的個位 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 ; 標識數(shù)字的位數(shù)GETLOOP: MOV AH,01H ; 從鍵盤讀取一個字符 INT 21H CMP AL,0DH ; 和回車比較 JE EXIT1 ; 是回車那么結束輸入 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,輸入空格,出錯 JMP ASCBIN ; 否那么讀取字符CMPSPACE2: CMP AL,20H JNE ERR4 ; 位數(shù)為2后,不輸入空格,錯誤 XOR CX,CX ; 輸入空格,清零重計 JMP GETLOOP ASCBIN: SUB AL,30H ; 化為二進制 JL ERR1 ; 小于,無效字符 CMP AL,9 JG ERR1 ; 大于9是無效字符 MOV INPUTDI,AL ; 保存 INC COUNT ; 統(tǒng)計輸入的數(shù)字個數(shù) INC DI ; 向后移動數(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ù)的個數(shù)是否為

17、零 CMP BL,0 JE ERR3 ;輸入數(shù)目為0,輸出錯誤,退出 AND BL,01H ; 判斷數(shù)字是否為兩位數(shù) CMP BL,0 JNE ERR2 ;輸入數(shù)字個數(shù)為奇數(shù)那么出錯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ù)組下標 MOV CL,COUNT ; 把數(shù)組長度移入CX MOV AL,CL CBW MO

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

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

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

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

22、 400 DUP(?);存儲學號MARK DB 20 DUP(?); 存儲分數(shù)RANK DB 20 DUP(?); 存儲排名RANKTMP DB 20 DUP(?); 臨時排序指針MTMP DB ?; 臨時記錄成績COUNTB DB ?; 總的學生的個數(shù)COUNTW DW ?; 總的學生個數(shù)CHEOK DB ?; 輸入檢查標志位ERROR DB ?; 記錄錯誤號TMP DB 2 DUP(?);判斷、計數(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;最長的

24、字符長度PRES DB ?; 存儲實際輸入字符數(shù)CHAR DB 16 DUP(?); 實際可存儲有效字符16個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;分數(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; 學號還是分數(shù)XOR BX,BX; ID的偏移量XOR AX,AX; 記錄學生數(shù)目MORE:PR

27、INTTIP CRCMP COUNTB,AL JNZ HERE1 JMPRETURN; 計數(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 ; 輸入學號CMP TMP,1 ; JE ISMARK ;輸入分數(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; 下一個是分數(shù)CLDMOV SI,OFFSET CHARMOV DI,OFFSET IDADD DI,BXREP MOVSB ;寫入IDADD BX,16; ID的偏移地址向后挪動固定的16BYTEJMP MORE; 跳回繼續(xù)輸入下一個BUFFISMARK:CALL CHANGECMP CHEOK,0JE WRITEMARKMOV ERROR,4JMP CHEFAILWRITEMARK:PUSH B

29、XMOV BL,MTMPMOV DI,AXMOV MARKDI,BL; 實際寫入成績POP BXMOV TMP,0; 計數(shù)清理INC AX; 已接受的學生數(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為空JE 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; 個位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; 個位SUB BL,30HADD AL,BLMOV MTMP,AL; 寫入轉換后的數(shù)字JMP CRETURNONEDIG: ;一位數(shù)時直接寫入臨時成績區(qū)M

33、OV BL,CHAR0; 個位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; 讀取學生數(shù)目 XOR BX,BX; BX作尋址計數(shù)器SLOP: DEC AL MOV RANKTMPBX,AL INC BX CMP AL,0 JNE SLOP MOV CX,COUNTW; CX記錄總學生人數(shù) DEC CX JZ WRRAKLOP1: XOR DI,DILOP2: MOV AL,RANKTMPDI; 取出地址指針,即成績偏移量 XOR AH,AH MOV SI,AX MOV DL,MARKSI; 取出成績1 MOV AL,RANKTMPDI+1 XOR AH,AH MOV SI,AX MOV

35、 DH,MARKSI;同理取出成績2 CMP DL,DH JGE NEXTCMP MOV AH,RANKTMPDI; 交換分數(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; 提取該名次學生的地址指針 XOR AH,AH MOV DI,AX MOV RANKDI,BL ; 寫入學生名次 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保存學生數(shù)XOR SI,SI; SI指明當前處理的學生序號XOR BX,BX; BX保存當前輸入學號偏移量NEXPRINT:MOV TMP1,0; 對打印名次置標志位CMP S

37、I,CXJNE PRINTIDJMP PRETPRINTID:;打印學號,直接字符串打印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實驗分析實驗E 中斷程序設計一、實驗目的初步掌握中斷程序的設計方法;初步掌握修改 DOS 系統(tǒng)中斷,以適應實際使用的方法。二

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

40、址的IP寫入n4的RAM位置,中斷效勞程序入口的CS寫入n4+2的位置;二是DOS功能調用,25H用來寫中斷向量表,35H讀中斷向量表。四、實驗過程流程圖源代碼 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;恢復原中斷向量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;輸入檢錯,標志為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;第一個字符不能為回車符jz next1cmp al,0dhjz done1 next1:call checkcmp bl,0jz err1and al,0fh;輸入字符的轉化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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論