




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
北京郵電大學微機原理軟件實驗報告資料僅供參考微機原理軟件實驗報告學院:信息與通信工程學院班 級:XXXXXX姓 名:XXXXX學 號:XXXXXXXX班內序號:XXXXX日期:11月30日目錄微機原理軟件實驗報告 11. 實驗一 32. 實驗二 73. 實驗三 134. 實驗四 205. 實驗五 306. 總結及結論 397. 參考文獻 39實驗一DEBUG的使用一、實驗目的:1.掌握匯編程序的編輯,編譯,連接和執行的全過程;2.學習和掌握用DEBUG調試程序的方法.二、實驗內容:用編輯軟件,輸入以下匯編語言源程序:DATSEGMENT;默認ds段ADB20;(自定)BDB15;(自定)YDB3DUP(0)ZDB0,0DATENDSSTASEGMENTSTACKDW50DUP(?)STAENDSCODSEGMENTASSUMECS:COD,DS:DATSTARPROCFAR PUSHDS XORAX,AX;AX清零 PUSHAX MOVAX,DAT MOVDS,AX MOVAX,STA MOVSS,AX MOVAL,A MOVZ,AL MOVZ+1,AL CALLSUB1;A*A MOVAL,B MOVZ,AL MOVZ+1,AL CALLSUB1;A*A+B*B MOVAL,A MOVZ,AL MOVAL,B MOVZ+1,AL CALLSUB1;A*A+B*B+A*B ADDWORDPTRY,AX;A*A+B*B+A*B+A*B-->(A+B)^2 ADCBYTEPTR[Y+2],0 RETSTARENDPSUB1PROC MOVAL,Z MOVAH,Z+1 MULAH ADDWORDPTRY,AX ADCBYTEPTR[Y+2],0 RETSUB1ENDPCODENDSENDSTAR2.經過編譯,連接形成可執行文件。3.用DEBUG將可執行文件調入,并進行調試。(1)用D命令觀察數據區在內存中的具體內容,記錄單元A和B的具體地址。(2)用U命令對目標代碼反匯編,觀察反匯編后的結果.注意發現源程序的起始位置,并記錄這個起始地址。(3)用T命令作單步跟蹤調試.比較每條指令執行后的結果和原來的理解是否一致。得出程序運行的結果:它們是寫在什么單元,具體內容是什么;并判斷結果是否正確。(4)用E命令修改單元A,B的內容,重新執行程序,并記錄結果。(5)退出DEBUG。三、預習題:1.熟悉常見的DEBUG命令。2.閱讀并分析程序的功能。答:程序實現了(A+B)^2的功能。3.若SS=H,SP=FFFFH,向堆棧中壓入4字節數據后,如何用D命令顯示壓入堆棧的內容?答:使用指令“d:0000”即可顯示壓入堆棧的內容,因為SP+1會溢出,因此變成0000。四、實驗過程a.經過masm和link命令使得程序編譯鏈接成功。b.進入debug中,用u命令查看反編譯結果。得出A的地址為:076A:0000,值為14H,即十進制的20D;B的地址為:076A:0001,值為0FH,即十進制的15D。Y的偏移地址為0002H,Z的偏移地址為0005H。DATA段基地址為076AH。SUB1子程序段入口地址為003F。c.用e命令將A地址和B地址內的值由2AH,32H改為23H,24H,經過d命令重新查看A地址,B地址下的數值,發現改變成功。d.利用t命令單步調試,可發現,每一步程序的執行,會與寄存器及存儲器的內容的變化是一致的。e.退出debug。五、實驗總結 由于之前上《操作系統》時,零散地學過一些匯編相關的內容,因此關于masm、debug的基本指令的使用還是比較熟悉的,在做實驗一的整個過程中也是比較輕松。也希望自己能保持著這種輕松的狀態去應對接下來的實驗!實驗二分支、循環程序設計一、實驗目的1.開始獨立進行匯編語言程序設計;2.掌握基本分支,循環程序設計;3.掌握最簡單的DOS功能調用。二、實驗內容1.安排一個數據區,內存有若干個正數,負數和零。每類數的個數都不超過9。2.編寫一個程序統計數據區中正數,負數和零的個數。3.將統計結果在屏幕上顯示。4.(選做題)統計出正奇數、正偶數,負奇數、負偶數以及零的個數。三、預習題1.十進制數0~9所對應的ASCII碼是什么?如何將十進制數0~9在屏幕上顯示出來?答:0~9分別對應ASCII碼的30H~39H。因為屏幕上顯示的數字是ASCII碼,因此為了將十進制數0~9顯示在屏幕上,需在原有的十進制數值基礎上加上30H即可。2.如何檢驗一個數為正,為負或為零?答:本實驗中,判斷正、負或零是直接用CMP命令和0比較,然后用je、jg、jl等命令進行判斷為正、負或零。四、實驗流程圖五、實驗源代碼;*********************************************************************************************;*作者:LQ*;*日期:/11/20*;*功能:*;*編寫一個程序統計數據區中正偶數,正奇數,負奇數,負偶數和零的個數*;*********************************************************************************************assumecs:code,ds:datadatasegment;在db數據區,假定數字大小均在-128~127之間,故每個數字用一個字節去存儲db-8,-10,-6,-5,-2,-55;給定6個負數,其中4個偶數,2個奇數db4,2,3,78,89,56;給定6個正數,其中4個偶數,2個奇數db0,0;給定2個零db'$';設定一個結束符dataendscodesegments1:db5dup(0);在代碼段設置一塊空間用于存儲統計的最終數值db'PositiveOdd:','$';在代碼段開出一塊空間用于存儲顯示數據的字符串db'PositiveEven:','$'db'NegativeOdd:','$'db'NegativeEven:','$'db'Zero:','$'start: movax,data movds,ax xordi,dicallmainmain:moval,[di]cmpal,'$'jeshowcmpal,00Hjgabove0;帶符號數的大于比較cmpal,0jlbelow0;帶符號數的小于比較jmpequal0below0:movbl,2movah,0idivblcmpah,0jenagative_evenmovax,csmovcx,dsmovds,axmovsi,offsets1incbyteptr[si+2];負奇數incdimovds,cxcallmainnagative_even:;負偶數movax,csmovcx,dsmovds,axmovsi,offsets1incbyteptr[si+3]incdimovds,cxcallmainabove0:movbl,2movah,0idivblcmpah,0jepositive_evenmovax,csmovcx,dsmovds,axmovsi,offsets1incbyteptr[si];正奇數incdimovds,cxcallmainpositive_even:;正偶數movax,csmovcx,dsmovds,axmovsi,offsets1incbyteptr[si+1]incdimovds,cxcallmainequal0:movax,csmovcx,dsmovds,axmovsi,offsets1incbyteptr[si+4]incdimovds,cxcallmainshow:;顯示數據xordi,dimovax,0B800Hmoves,axmovax,csmovds,axmovsi,offsets1addsi,5movdx,0movbx,0jmpprintprint:movcl,[si]cmpcl,'$'jeprint_datamovbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiincsijmpshortprintprint_data:;打印記錄存儲的數據值pushsimovsi,offsets1movcl,[bx]addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字cmpdx,640jeendingadddx,160movdi,dxpopsiincsiincbxjmpprintending:movax,04c00Hint21Hcodeendsendstart六、實驗過程及解釋 本次實驗要求統計數據區內正奇數、正偶數、負奇數、負偶數、零的個數,首先將數據區的數值與0比較,按數字的正、負或零的特性分別跳轉至處理正數的子程序段、處理負數的子程序段、處理零的子程序段。其中,在處理正、負數的子程序段,對于正負數進行帶符號的除二運算,經過判別余數是否為零判別該數是偶數還是奇數,而且判別后將各個對應的正奇數、正偶數、負奇數、負偶數、零的個數進行統計。程序在統計完所有類型的數的個數后,會向顯存中寫入數字,將統計好的數值以可視化形式呈現出來。編譯運行程序結果如下:a.經過masm和link命令使得程序編譯鏈接成功。b.由運行結果可看到與數據區設置的正奇數、正偶數、負奇數、負偶數、零的個數一致。七、實驗總結 這次實驗相較于第一次實驗而言,程序需要自己獨立設計而且首次涉及到了向屏幕打印數據的程序編寫。為了充分理解向屏幕打印數據的細節方面,我沒有選擇中斷的調用去打印數據,而是自己往顯存中直接寫入數據而且在屏幕上呈現。為了編程實現字符向屏幕端的打印,我需要理解顯存的數據存儲,如一個ASCII碼在屏幕端的顯示需要兩個字節,屏幕一般一行是顯示80個字符,也即一行對應160個字節,同時要使得數據呈現時比較美觀,還需要自己設計換行等數值的運算,這些都花了我很多時間去調試,不過這也使得我更完整地理解了顯存的工作原理,為之后實驗打下了基礎。實驗三代碼轉換程序設計一、實驗目的1.掌握幾種最基本的代碼轉換方法;2.運用子程序進行程序設計。二、實驗內容1.從鍵盤上輸入若干兩位十進制數,尋找其中的最小值,然后在屏幕上顯示出來。2.兩個十進制數之間的分隔符,輸入結束標志自定,但要在報告中說明。3.對輸入要有檢錯措施,以防止非法字符輸入,并有適當的提示。4.將整個程序分解為若干模塊,分別用子程序實現.在報告中要給出模塊層次圖。預習題1.如何將輸入的兩個字符(0~9)變為十進制或二進制數?答:輸入的字符0~9是ASCII碼表示的,對應于30H~39H,經過減去30H,能夠轉換為相應的二進制數。2.如何將選出的最小值(二進制或十進制)變為ASCII碼再進行顯示?答:由于在數據區存儲的最小數的數值為二進制數,同時要以十進制易于讀的形式轉化為ASCII碼并顯示,需要進行除十取商及取余運算,并將取出的二進制形式的商、余數加上30H,轉化為對應的ASCII碼值。3.你覺得采用二進制運算還是十進制運算更適合于這個實驗?答:由于存儲器、寄存器中存儲的數據形式都是二進制形式的,因此我覺得采用二進制運算更適于本實驗,我在程序的設計、編寫中也是采用了二進制運算。程序流程圖a.模塊層次圖b.完整程序流程圖五、程序源代碼;******************************************************************************;*作者:LQ*;*日期:/11/22*;*功能:*;*輸入若干兩位十進制數,尋找最小值,并打印至屏幕(默認十進制數均為正數)*;******************************************************************************assumecs:codedatasegmentdb'WrongInput!','$'db'','$';前兩行字符串,用于向屏幕打印發生錯誤時的字符串db127,0,0;用于存儲輸入的數字,而且于首位存儲著最小的數值dataendscodesegmentmessage:db'Theminimumnumis:','$';用于最后向屏幕打印最小值的字符串start:movax,datamovds,axxorsi,simovdi,1AH;1AH對應著存儲數字的區域main:movah,0;int16h0編號功能是從鍵盤緩沖區讀取一個鍵盤值輸入int16h;結果ah存儲掃描碼,al存儲ascii碼值cmpah,1cH;1ch為回車鍵的掃描碼,一旦按下回車表示程序輸入結束jeprint_prog1cmpah,39H;空格鍵的掃描鍵,作為兩個十進制數之間的分隔符jecomparecmpah,02Hjberrorcmpah,0BHjaerrorcallshowaddsi,2jmpshortmainshow:incdimovdx,0b800H;將輸入的字符串打印至屏幕moves,dxmovbyteptres:[si],almovbyteptres:[si+1],07Hsubal,30hmov[di],alretcompare:movdx,0b800H;將輸入的字符串打印至屏幕moves,dxmovbyteptres:[si],almovbyteptres:[si+1],07Haddsi,2moval,[di-1]movbl,10mulbladdal,[di]cmpal,[di-2]jbminimummovdi,1AHjmpfarptrmainminimum:mov[di-2],almovdi,1AHjmpfarptrmainprint_prog1:;作為中轉,因為print_prog程序段超出了je跳轉的范圍jmpprint_progerror:;調用第10號中斷的2號子程序movah,2;置光標movbh,0movdh,10;dh中放行號movdl,35;dl中放列號int10hmovdx,0;ds:dx指向字符串的首地址movah,9;使用int21h號中斷例程的9號子程序;功能為在光標位置顯示字符串提供要顯示的字符串的地址作為參數;要顯示的字符串需用'$'作為結束符int21hmovcx,10H;設置一個空循環,用于保持錯誤的提示一段時間empty:loopemptymovah,2;置光標movbh,0movdh,10;dh中放行號movdl,35;dl中放列號int10hmovdx,0DH;ds:dx指向字符串的空字符串地址movah,9;使用int21h號中斷例程的9號子程序;功能為在光標位置顯示字符串提供要顯示的字符串的地址作為參數;要顯示的字符串需用'$'作為結束符int21hjmpfarptrmainprint_prog:xordi,diadddi,160;在屏幕的第二行打印輸出最小值movax,0B800Hmoves,axmovax,csmovds,axmovsi,offsetmessagemovdx,0movbx,0jmpprintprint:movcl,[si]cmpcl,'$'jeprint_datamovbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiincsijmpshortprintprint_data:;打印記錄存儲的數據值movax,datamovds,axpushsimovsi,1AHmovcl,[si];取出最小數的數值movch,0movax,cx;因為該數值在內存中是以十六進制存在的,要轉化為易于理解的ascii碼十進制的形式,需要進行除十取商和取余操作movbl,10divblmovcl,al;獲取除十取商后的值即十位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字incdimovcl,ah;獲取除十取余后的值即個位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字ending:movax,4c00H;最終程序運行結束int21Hcodeendsendstart六、實驗過程及解釋1.本實驗已完成的功能是:a.每次輸入一個兩位十進制數,按下空格后,會在存儲最小值的數據區將剛輸入的數值與當前的最小數值進行比對,并時刻在數據區存儲當前的最小數。如果想要向屏幕打印當前所有輸入的數字中的最小數的數值時,只需按下回車鍵,會將當前的最小值打印至屏幕。b.如果按下錯誤的按鍵,屏幕中央會打印出輸入錯誤的提醒,而且這個提醒只會顯示幾秒鐘,類似于彈窗效果,真正起到了提示作用。2.程序調試結果:a. 經過masm和link命令使得程序編譯鏈接成功。b.正確輸入的時候,在此例中,輸出了最小數為02,其中02數字的顯示為白底藍字。c.輸入錯誤時,會在屏幕中間彈出“wrongInput!”的警告,警告保持幾秒后自動消失。七、實驗總結 本次實驗,相較于上一個實驗又是一個難度的提升,其中如何得到按鍵的值,并向屏幕打印出來對應的按鍵值,還需要了解按鍵中斷觸發的工作原理,而這一塊在課堂上老師講解得很淺,還需要自己去查閱相關的資料。本實驗中,我在研讀了王爽的《匯編語言》后選中了int16中斷的0號功能,關于此功能的調用與使用我也是花了一些時間去琢磨,但此功能在之后的幾個實驗中都有著極其重要的意義。另外,還有如何找到最小值,如何在按下不相關按鍵后提示錯誤輸入而且只顯示幾秒,這些都用到了一些編程的小技巧,而這些小技巧都是我自己一點一點思索出來的,雖然功能很簡單,可是在我看來,這些都是很有趣、很讓我滿足的。實驗四子程序設計一、實驗目的:1.進一步掌握子程序設計方法;2.進一步掌握基本的DOS功能調用。二、實驗內容:1.從鍵盤上輸入某班學生的某科目成績.輸入按學生的學號由小到大的順序輸入。2.統計檢查每個學生的名次。3.將統計結果在屏幕上顯示。4.為便于觀察,輸入學生數目不宜太多,以不超過一屏為宜.輸出應便于閱讀.盡可能考慮美觀。5.輸入要有檢錯手段。三、預習題:1.如何確定一個學生在這門科目中的名次?答:此程序顯然屬于排序問題,從簡單的排序算法思考,我首先選定使用冒泡排序算法或是插入排序算法,由于插入排序的特性就如同它所介紹的一樣--我們在玩紙牌時,每一次抓牌前的紙牌都是排好序的,每一次插牌后也都是排好序的,按照這個特性去設計程序,能夠很好地去貼合程序的設計。于是最后我選定插入排序去確定學生在科目中的名次。2.你覺得輸入結束后,采用什么方法進行比較以得到學生的名次最為簡單?答:因為本實驗我所采取的是插入排序,因此最終輸入結束后就已經得到了最終學生的名次,因此輸入結束后無需再采用別的算法去確定學生名次。3.準備好模塊層次圖。4.給出輸出顯示的形式。 答:逐行顯示,每行依次顯示出名次、學號、成績。程序設計流程圖五、程序源代碼;**************************************************************************************************;*作者:LQ*;*日期:/11/23*;*功能:*;*輸入若干兩位十進制數,對應著學生的科目成績,按照科目成績進行排序*;**************************************************************************************************assumecs:codedatasegmentdb'WrongInput!','$'db'','$';前兩行字符串,用于向屏幕打印發生錯誤時的字符串db90dup(0);假定學生總數不大于45dataendscodesegmentmessage:db'rank','$'start:movax,datamovds,axxorsi,simovdi,19H;19H對應著存儲數字的區域前面一個區域s:movah,0;int16h0編號功能是從鍵盤緩沖區讀取一個鍵盤值輸入int16h;結果ah存儲掃描碼,al存儲ascii碼值cmpah,1cH;1ch為回車鍵的掃描碼,一旦按下回車表示程序結束jeprint_prog1cmpah,39H;空格鍵的掃描鍵,作為兩個十進制數之間的分隔符jestoragecmpah,02Hjberrorcmpah,0BHjaerrorcallshowaddsi,2jmpshortserror:;調用第10號中斷的2號子程序movah,2;置光標movbh,0movdh,10;dh中放行號movdl,35;dl中放列號int10hmovdx,0;ds:dx指向字符串的首地址movah,9;使用int21h號中斷例程的9號子程序;功能為在光標位置顯示字符串提供要顯示的字符串的地址作為參數;要顯示的字符串需用'$'作為結束符int21hmovcx,10H;設置一個空循環,用于保持錯誤的提示一段時間empty:loopemptymovah,2;置光標movbh,0movdh,10;dh中放行號movdl,35;dl中放列號int10hmovdx,0DH;ds:dx指向字符串的空字符串地址movah,9;使用int21h號中斷例程的9號子程序;功能為在光標位置顯示字符串提供要顯示的字符串的地址作為參數;要顯示的字符串需用'$'作為結束符int21hjmpfarptrsshow:;輸入結束后,打印出排名、學號、成績incdimovdx,0b800H;將輸入的字符串打印至屏幕moves,dxmovbyteptres:[si],almovbyteptres:[si+1],07Hsubal,30hmov[di],alretprint_prog1:;作為中轉,因為跳轉至print_prog的范圍跨度超過了跳轉的范圍jmpfarptrprint_progstorage:;每一次按下空格后,都會把數據存儲,同時進行插入排序movdx,0b800H;將輸入的字符串打印至屏幕moves,dxmovbyteptres:[si],almovbyteptres:[si+1],07H;對已經輸入的數據進行處理,有ascii碼值轉化為實際的數值,以及添加其對應的學號addsi,2moval,[di-1]movbl,10mulbladdal,[di]mov[di],almovax,disubal,1bHmovbl,2movah,0divblincalmov[di-1],alcmpal,1jeoncedecaxmovcx,axmovbx,dimovdh,[bx]compare:;對插入的數據進行比對,找到該插入的位置subbx,2cmpdh,[bx]jnaexchangeloopcomparejmpexchangeonce:;有些特殊情況:;比如比對位置發現此時的位置最合適,以及第一次插入數據時肯定是有序的;這種情況便不再進行后續比對移動這些操作,直接等待下一次的輸入jmpfarptrsexchange:;找到插入的位置后,將數據全部后移,騰出空位讓應插入的數據插入subax,cxmovcx,ax;元素向后移動的次數為比較的次數movax,didecaxmovbx,axmovdh,[di]movdl,[di-1]jcxzoncemove:decbxmovah,[bx]mov[bx+2],ahdecbxmoval,[bx]mov[bx+2],alloopmovemov[bx+1],dhmov[bx],dljmpfarptrsprint_prog:xordi,diadddi,160;在屏幕的第二行打印輸出最小值movax,0B800Hmoves,axmovax,csmovds,axmovsi,offsetmessagemovdl,1;顯示排名movbx,0;用于從數據區取出學號,成績的標識jmpprintprint:movcl,[si]cmpcl,'$'jeprint_datamovbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiincsijmpshortprintprint_data:;打印數據存儲區存儲的學號、成績;打印排名movcl,dladdcl,48movbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdi;打印冒號movcl,58movbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdi;打印學號值movax,datamovds,axmovcl,[bx+1AH];取出學號值movch,0movax,cx;因為該數值在內存中是以十六進制存在的,要轉化為易于理解的ascii碼十進制的形式,需要進行除十取商和取余操作movcl,10divclmovcl,al;獲取除十取商后的值即十位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字incdimovcl,ah;獲取除十取余后的值即個位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字incdi;打印分隔符:~movcl,126movbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdi;打印成績incbxmovcl,[bx+1AH];取出成績movch,0movax,cx;因為該數值在內存中是以十六進制存在的,要轉化為易于理解的ascii碼十進制的形式,需要進行除十取商和取余操作movcl,10divclmovcl,al;獲取除十取商后的值即十位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字incdimovcl,ah;獲取除十取余后的值即個位上的數值并打印addcl,48movbyteptres:[di],clincdimovbyteptres:[di],71H;71H~代表顏色為白底藍字incdlmoval,160muldlmovdi,axincbxmovcl,[bx+1AH]movax,csmovds,axmovsi,offsetmessagecmpcl,0jneprint1jmpending;跳轉至程序運行結束處print1:;中轉程序,jmp跳轉超出范圍jmpfarptrprintending:movax,4c00H;最終程序運行結束int21Hcodeendsendstart實驗過程及解釋1.本實驗已完成的功能是:a.每次輸入一個兩位十進制數,按下空格后,會對于存儲學號、成績的數據區進行插入排序,保證每次在數據區存儲的數值都是有序的。如果想要向屏幕打印所有學生的成績及排名,只需按下回車鍵,會將當前所有學生的成績及排名打印至屏幕。b.如果按下錯誤的按鍵,屏幕中央會打印出輸入錯誤的提醒,而且這個提醒只會顯示幾秒鐘,類似于彈窗效果,真正起到了提示作用。2.程序調試結果:a.經過masm和link命令使得程序編譯鏈接成功。b.正確輸入時的運行結果:如上圖所示,輸入的學號為01的學生分數為12,學號為02的學生成績為98,學號為03的學生成績為97,學號為04的學生成績為66,學號為05的學生成績為65,學號為06的學生成績為78。經過排序之后可得第一名為學號為02的同學,成績對應為98,依次逐行顯示。c.錯誤輸入時的運行結果:當錯誤輸入時,在屏幕中間會打印出字幕提示輸入錯誤,保持幾秒后消失。七、實驗總結本次實驗初次讀題時會覺得難度較大,不好入手,不過認真分析后,會發現此次實驗主要考核的就是排序的應用。我們因為在大二已經先修了數據結構這門課,因此對于基本的排序算法有了較好的理解,因此此次實驗插入排序的實踐上我稍微花了一點時間,在編程中首先需要知道每一次應插入的位置,而且將存儲區的數據依次后移騰出應被插入的空間。這些在某種意義上就是數組的插入排序方式,也使得我從匯編層面上理解了數組的工作原理,能夠說是收獲很大!實驗五中斷程序設計一、實驗目的:1.初步掌握中斷程序的設計方法。2.初步掌握修改DOS系統中斷,以適應實際使用的方法。二、實驗內容:1.編寫一個32位二進制數除以16位二進制數的除法程序.觀察當除數為0,或超過相應寄存器范圍時,程序執行的結果。2.修改零號中斷服務程序,使它具有以下功能:(1)判斷除數是否為0,當除數為0時,顯示相應的結果;(2)當除數不為0時,采用適當的方法完成商超過16位的二進制數的除法運算。3.注意必須保護原有中斷服務程序的入口地址,并在程序完畢前加以恢復。三、預習題:1.如何保護原有中斷向量表中的中斷服務程序的入口地址?答:將0號中斷對應的中斷向量表中的中斷服務程序的CS,IP地址先讀入數據區內存儲,最后程序運行結束后,再恢復回去。2.如何將你的中斷服務程序入口地址置入中斷向量表?答:知道0號中斷程序對應的中斷向量表的位置,然后直接向中斷向量表寫入中斷服務程序的基址和偏移地址。四、選作題:1.用二進制將結果在屏幕上顯示.2.從鍵盤輸入二進制數.五、程序設計流程圖六、程序源代碼:;**************************************************************************************************;*作者:LQ*;*日期:/11/25*;*功能:*;*修改0號中斷處理程序,當除數為0時,顯示除數不得為0的結果*;*當除數不為0時,采用適當的方法完成商超過16位的運算并以二進制形式打印出來;**************************************************************************************************assumecs:codesegdatasegmentdw2dup(0);用于存儲原有中斷向量表中斷服務程序的入口地址dataendscodesegsegmentmessage:db'Quotient:','$';用于打印商db'remainder:','$';用于打印余數start:movax,csmovds,axmovsi,offsetdo0movax,0moves,axmovdi,200h;0000:0200后的256個字節一般是空的,能夠用來存儲中斷存儲數據load:movcx,offsetdo0end-offsetdo0;"-"是編譯器識別的常數相減運算符號,;設置cx為傳輸長度;將跳轉到do0的代碼全部復制放置于es:[di]后的內存單元中cld;設置傳輸方向為正;將處理0號中斷程序的內容加載至0000:0200H后的內存空間repmovsb;moves:[di],byteptrds:[si];incsiincdichange0:;修改0號中斷的中斷向量表指向的地址為0000:0200H空間movax,0moves,axmovax,datamovds,axmovax,es:[0*4]movds:[0],axmovax,es:[0*4+2]movds:[2],axmovwordptres:[0*4],200Hmovwordptres:[0*4+2],0xorcl,cl;用于標識除法運算是否進入了中斷中;做除法movdx,3movax,2movbx,1divbx;除法溢出,相當于觸發了0號中斷cmpcl,1jnerestore1;如果除法運算沒有產生溢出,則不將除法運算結果打印jmpprint_progrestore1:;中轉,用于處理jmp跳轉超出范圍jmpfarptrrestore;除法溢出運算結束后,打印出除法運算的值print_prog:xordi,dimovcx,0B800Hmoves,cxmovcx,csmovds,cxxorch,ch;增設一個標識,用于決定打印的是余數還是商movsi,offsetmessagejmpprintprint:movcl,[si]cmpcl,'$'jeprint_datamovbyteptres:[di],clincdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiincsijmpshortprintprint_data:;打印商及余數的數值cmpch,1jes1movcx,16high_16:rolBX,1;輸出商的高十六位jconejmpzeroone:movbyteptres:[di],49incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiloophigh_16jmpszero:movbyteptres:[di],48incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiloophigh_16jmpss:movcx,16low_16:rolax,1;輸出商的低十六位jcone1jmpzero1one1:movbyteptres:[di],49incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdilooplow_16movbyteptres:[di],66;添上B代表二進制的后綴incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incsimovdi,160incchjmpprintzero1:movbyteptres:[di],48incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdilooplow_16movbyteptres:[di],66;添上B代表二進制的后綴incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incsimovdi,160incchjmpprints1:movcx,16remainder:roldx,1;輸出余數jcone2jmpzero2one2:movbyteptres:[di],49incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiloopremaindermovbyteptres:[di],66;添上B代表二進制的后綴incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字jmprestorezero2:movbyteptres:[di],48incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字incdiloopremaindermovbyteptres:[di],66;添上B代表二進制的后綴incdimovbyteptres:[di],07H;07H~代表顏色為黑底白字jmprestore
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購合同執行與監督協議
- 沿海地區海島采砂資源合作開發合同
- 水文地質測繪成果保密及授權使用合同
- 茶園旅游民宿開發與承包經營合同
- 年終考核總結2025年(16篇)
- 公司承攬合同管理制度
- 公安單身民警管理制度
- 2025年文藝部工作計劃(16篇)
- 2025年安全員述職報告(16篇)
- 軟件測試中如何考慮可維護性問題試題及答案
- 概率論(廣西師范大學)知到智慧樹章節測試課后答案2024年秋廣西師范大學
- 臺球室裝修簡易合同
- 新疆烏魯木齊市(2024年-2025年小學五年級語文)統編版期中考試(下學期)試卷及答案
- 人美版美術一年級上冊《第一單元3 畫一畫我們的學校》課件
- 關于情緒 課件
- 網絡音樂制作發行合同
- 銀行大額存單業務培訓
- DB37-T 4733-2024預制艙式儲能電站設計規范
- wps計算機二級試題及答案
- 鋼板樁安全技術交底
- TQGCML 3946-2024 柴油發電機組維護保養規范
評論
0/150
提交評論