微原軟件實驗報告.docx_第1頁
微原軟件實驗報告.docx_第2頁
微原軟件實驗報告.docx_第3頁
微原軟件實驗報告.docx_第4頁
微原軟件實驗報告.docx_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機原理與接口技術軟件實驗一、 實驗目的1.掌握匯編程序的編輯,編譯,連接和執(zhí)行的全過程;2.學習和掌握用DEBUG調試程序的方法.二、 源程序DAT SEGMENTA DB 4 ;(自定)B DB 5 ;(自定)Y DB 3 DUP(0)Z DB 0,0DAT ENDSSTA SEGMENT STACKDW 50 DUP(?)STA ENDSCOD SEGMENTASSUME CS:COD,DS:DATSTAR PROC FAR PUSH DSXOR AX,AXPUSH AXMOV AX,DATMOV DS,AXMOV AX,STAMOV SS,AXMOV AL,AMOV Z,ALMOV Z+1,ALCALL SUB1 ;A*AMOV AL,BMOV Z,ALMOV Z+1,ALCALL SUB1 ;B*BMOV AL,AMOV Z,ALMOV AL,BMOV Z+1,AL ;Z stores the two OPRD temporallyCALL SUB1 ;A*BADD WORD PTR Y,AXADC BYTE PTRY+2,0 ;A*B*2RETSTAR ENDPSUB1 PROCMOV AL,ZMOV AH,Z+1MUL AHADD WORD PTR Y,AX ;Y stores the resultADC BYTE PTRY+2,0 ;Y+2 stores the signal flagRETSUB1 ENDPCOD ENDSEND STAR三、實驗文檔中的要求(1)用 D 命令觀察數據區(qū)在內存中的具體內容,記錄單元 A 和 B 的具體地址.(圖一:反匯編結果以及數據區(qū)具體內容)由圖一,可知A的地址為:141CH:0000H;B的地址為:141CH:0001H。(2)用 U 命令對目標代碼反匯編,觀察反匯編后的結果.注意發(fā)現源程序的起始位置, 并記錄這個起始地址.由圖一,可知:DATA段段基址:141CHA的偏移地址:0000HB的偏移地址:0001HY的偏移地址:0002HZ的偏移地址:0005HSTACK段段基址:141DHCODE段段基址:1424H第一條指令的偏移地址:0000H子程序SUB1入口的偏移地址:003FH(3)用 T 命令作單步跟蹤調試.比較每條指令執(zhí)行后的結果和原來的理解是否一致.得出程序運行的結果:它們是寫在什么單元,具體內容是什么; 并判斷結果是否正確.現僅將關鍵步驟的單步調試結果列出,配合r命令查看結果。(圖二:單步調試結果一)這是第一次調用SUB1子程序退出后的結果,從圖中可以看出Y存儲的數據是+16(A已經改為4;B已經改為5),即是A*A的結果,符號位為0表示是正數。(圖三:單步調試結果二)這是第二次調用SUB1子程序退出后的結果,從圖中可以看出執(zhí)行完“MUL AH”指令后,AX存儲的數據是25,即是B*B的結果,子程序退出后Y存儲的數據是+41,即是16+25的結果。(圖四:單步調試結果三)這是第三次調用SUB1子程序的結果,從圖中可以看出執(zhí)行完“MUL AH”指令后,AX存儲的數據是20,即是A*B的結果,子程序退出后Y存儲的數據是+61,即是41+20的結果。(圖五:單步調試結果四)這是程序退出時的最終結果,從圖中可以看出,Y存儲的數據最終為 +81 ,即為(A+B)*(A+B)的結果。結果正確。(4)在子程序 SUB1 的入口處設一斷點,用 G 命令執(zhí)行程序. 在斷點處觀察堆棧的內容,比較堆棧的內容和程序返回地址是否一致.(圖六:調用子程序的堆棧內容改變結果)從圖中可以看出, IP指針的變化說明調用了子程序SUB1,而堆棧段段基址SS和棧頂指針SP的值都沒有改變。程序返回地址一致。(5)用 E 命令修改單元 A,B 的內容,重新執(zhí)行程序,并記錄結果.(圖七:修改A,B數值后的結果)從圖中可見,分別將A,B的值改為1,1后,程序執(zhí)行完畢,Y存儲的內容是+4,結果正確。(6)用 M 命令和 A 命令對程序進行修改: 將主程序中最后兩條指令 (ADD 和ADC) 修改為一條 CALL SUB1 指令,重新執(zhí)行程序.(圖八:a命令練習使用的結果)反匯編發(fā)現程序最后的ADD指令在CODE段的偏移地址為0035,將此處改為調用SUB1子程序的指令,然后將0038處改為RETF。重新執(zhí)行后,查看Y的內容,結果正確。(7) 重新使用編輯軟件,把源程序最后一句中的 STAR 去掉.再次生成可執(zhí)行文件,并用 DEBUG 調入內存.當使用 U 命令時,顯示的結果與前一次(未加 STAR) 的結果有何不同?(圖九:修改源程序后執(zhí)行的結果)觀察到兩點不同(雖然不明了其原因),其一:不能立即進入程序,需執(zhí)行許多冗余指令;其二:不能正確退出程序。預習題:若 SS=2000H,SP=FFFFH, 向堆棧中壓入 4 字節(jié)數據后,如何用 D 命令顯示壓入堆棧的內容?使用debug指令“d 2000:0000”即可顯示壓入堆棧的內容,這是因為SP+1會溢出,變成0000。四、心得體會 匯編語言編程時要求程序員有嚴謹、縝密的思維,在某些程度上,我感覺使用匯編語言的編程過程就是把高級語言的結構過程拉平成線性過程來考慮問題。經過此次試驗,我基本掌握了匯編程序的編輯、編譯、連接、執(zhí)行以及調試的主要步驟。應注意以下幾點:在debug過程中,任何存儲器單元都無法用標號來識別,要使用它們,只能使用物理地址調用。使用u指令修改asm代碼時要對照反匯編的結果,若要刪去某條指令,可以找到那條指令在代碼段的偏移地址,再用u指令將其修改為NOP(從該指令開始到下一條指令開始的地址-1處)??梢越Y合r指令、t指令、已經用g指令設置斷點來診斷問題。微機原理與接口技術軟件實驗實驗報告二姓名:楊帆學院:信息與通信工程學號:070547班級:07118實驗二 分支,循環(huán)程序設計 一、實驗目的: 1.開始獨立進行匯編語言程序設計;2.掌握基本分支,循環(huán)程序設計;3.掌握最簡單的 DOS 功能調用。實驗內容: 1.安排一個數據區(qū),內存有若干個正數,負數和零。每類數的個數都不超過 9。2.編寫一個程序統(tǒng)計數據區(qū)中正數,負數和零的個數。3.將統(tǒng)計結果在屏幕上顯示。二、預習題: 1.十進制數 0 - 9 所對應的 ASCII 碼是什么? 如何將十進制數 0 - 9 在屏幕上顯示出來?答:0的ASCII碼是30h,以后依次遞增。要屏顯0-9的數碼,只需將AH置成02H(DOS功能調用),然后將要顯示的數碼的ASCII碼存進DL里,然后執(zhí)行INT 21H就可以打印字符?;蛘?,若這些數碼是以字符串的格式存儲,則可以將AH置成09H,(最后以$字符結束,)然后將串首地址傳給DS,然后執(zhí)行INT 21H就可以打印字符串。2.如何檢驗一個數為正,為負或為零? 你能舉出多少種不同的方法?答:可以將待檢驗數與0比較(使用CMP指令后判斷CF、OF或者以表達式【實用EQ、GE等操作符】的返回值來判斷),也可以將待檢驗數與80H相與,判斷ZF的值。三、源程序 DATA SEGMENTBUF0 DB 2BH,3AH ;+,:POSI DB 0BUF1 DB 0AH,0DH,30H,3AH ;LF,CR,0,:ZERO DB 0BUF2 DB 0AH,0DH,2DH,3AH ;LF,CR,-,:NEGA DB 0NUM DB 72H,88H,91H,01H,00H,00H,23H,77H,21H;you can add other numbersCNT EQU $-NUM ;LENTHDATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP (?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV CX,0MOV BX,0LOOP1: MOV AL,NUMBXCALL FAR PTR CMPRINC BXINC CXCMP CX,CNT ;LOOP CNT TIMESJNZ LOOP1ADD POSI,30HADD ZERO,30HADD NEGA,30H ;TRANSFER TO ASC2 CODEMOV AH,02H ;TO PRINT CHARSMOV CX,0MOV BX,0LOOP2: MOV DL,BUF0BXINT 21HINC BXINC CXCMP CX,0DH ;LOOP 13 TIMESJNZ LOOP2MOV AX,4C00HINT 21HRETSTART ENDPCMPR PROC FARCMP AL,0JGE BIGGERINC NEGAJMP EXITBIGGER: JE EQUALINC POSIJMP EXITEQUAL: INC ZEROEXIT: RETCMPR ENDPCODE ENDSEND START四、程序流程圖 (圖表一:主程序流程圖)(圖表二:cmpr子程序流程圖)五、實驗結果與調試過程 (圖一:程序運行結果)分析:設置的數據區(qū)待分析數據為“72H,88H,91H,01H,00H,00H,23H,77H,21H”,其中正數為72H,01H,23H,77H,21H;負數為88H,91H;還有兩個零。可見程序得出的結果是正確的。(圖二:反匯編結果)分析:DATA段地址:1466;POSI偏移地址:0002;ZERO偏移地址:0007;NEGA偏移地址:000C;CODE段地址:1468;子程序CMPR偏移地址:0049;CNT的值+09D。六、選作題: 統(tǒng)計出正奇數,正偶數,負奇數,負偶數以及零的個數。 源代碼如下:DATA SEGMENTBUF DB 2BH,4FH,3AH ;+,O,:POSOD DB 0DB 0AH,0DH,2BH,45H,3AH ;LF,CR,+,E,:POSEV DB 0DB 0AH,0DH,30H,3AH ;LF,CR,0,:ZERO DB 0DB 0AH,0DH,2DH,4FH,3AH ;LF,CR,-,O,:NEGAOD DB 0DB 0AH,0DH,2DH,45H,3AH ;LF,CR,-,E,:NEGAEV DB 0NUM DB 72H,88H,91H,01H,00H,00H,23H,77H,21H ;you can add other numbersCNT EQU $-NUM ;LENTHDATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP (?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV CX,0MOV BX,0LOOP1: MOV AL,NUMBXCALL FAR PTR CMPRINC BXINC CXCMP CX,CNT ;LOOP CNT TIMESJNZ LOOP1ADD POSOD,30HADD POSEV,30HADD ZERO,30HADD NEGAOD,30HADD NEGAEV,30H ;TRANSFER TO ASC2 CODEMOV AH,02H ;TO PRINT CHARSMOV CX,0MOV BX,0LOOP2: MOV DL,BUFBXINT 21HINC BXINC CXCMP CX,1BH ;LOOP 26 TIMESJNZ LOOP2MOV AX,4C00HINT 21HRETSTART ENDPCMPR PROC FARCMP AL,0JGE BIGGERTEST AL,01HJNZ NODDINC NEGAEVJMP EXITNODD: INC NEGAODJMP EXITBIGGER: JE EQUALTEST AL,01HJNZ PODDINC POSEVJMP EXITPODD: INC POSODJMP EXITEQUAL: INC ZEROEXIT: RETCMPR ENDPCODE ENDSEND START運行結果:(圖三:選做題程序運行結果)根據NUM中的數據,這個結果是正確的。七、心得體會: 這個實驗有兩個要點,其實就是兩個預習題目里討論的問題。一是字符顯示。要顯示數字字符,首先要把數據轉換成ASCII碼,然后調用DOS功能將其顯示。其中使用09H號功能時,要特別注意每段待輸出的字符串要以$結尾,不然無法識別串尾,輸出亂碼。二是判斷正負數。本程序選用CMP指令來實現該功能。注意與0相比時,要使用有符號數的條件跳轉指令,JGE等等,在使用無符號數的條件跳轉指令時,不是與0相比較。判斷奇偶同樣也有很多途徑,這里選擇將待判別的數與01H相與后改變的標志位來判斷奇偶,用TEST指令是一個很好的選擇。另外,通過這次試驗,我對匯編程序的分支、循環(huán)結構有了進一步的理解。微機原理與接口技術軟件實驗實驗報告三姓名:楊帆學院:信息與通信工程學號:070547班級:07118實驗三 代碼轉換程序設計 一、實驗目的: 1.掌握幾種最基本的代碼轉換方法;2.運用子程序進行程序設計。實驗內容:1.從鍵盤上輸入若干兩位十進制數,尋找其中的最小值,然后在屏幕上顯示出來;2.兩個十進制數之間的分隔符,輸入結束標志自定,但要在報告中說明;3.對輸入要有檢錯措施,以防止非法字符輸入,并有適當的提示;4.將整個程序分解為若干模塊,分別用子程序實現.在報告中要給出模塊層次圖。二、預習題: 1.如何將輸入的兩個字符(0 - 9)變?yōu)槭M制或二進制數?答:可以通過將字符的減去30H再乘以10D,加上個位的值(同樣要將ASCII碼減去30H變?yōu)槭M制數)即可得兩個字符的十進制數。2.如何將選出的最小值(二進制或十進制)變?yōu)?ASCII 碼再進行顯示?答:選出最小十進制數后可以通過除十得到余數和商,商為高位,余數為低位,分別對這兩個加30H即可到得其ASCII碼。3.你覺得采用二進制運算還是十進制運算更適合于這個實驗?答:個人覺得采用二進制運算更簡便,這樣可以直接使用ASCII碼比較,使問題簡化。三、源程序 DATA SEGMENT BUFFER DB 101 ;為BUFFER分配空間 DB 0 ;BUFFER實際長度 DB 101 DUP (0)MESSAGE DB ERROR,TRY AGAIN,0DH,0AH,$ ;錯誤信息 MIN DW ?ERR DB 0 ;錯誤標志寄存器 DATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKCHECK PROC FAR ;CHECK子程序 PUSH AXPUSH BXPUSH CXPUSH DXLEA BX,BUFFER+2 ;BX指向第一個輸入的數 MOV CL,BUFFER+1 ;輸入字符串總長度 AGAIN: CMP BYTE PTR BX,30H JL ERROR ;小于30h,出錯 CMP BYTE PTR BX,3AH JG ERROR ;大于3Ah,出錯 JMP EXIT1ERROR: MOV AH,9MOV DX,SEG MESSAGEMOV DS,DXMOV DX,OFFSET MESSAGEINT 21H ;輸出錯誤提示 MOV ERR,1 ;更改錯誤標志寄存器 JMP EXIT2EXIT1: INC BXDEC CLJNZ AGAINEXIT2: POP DXPOP CXPOP BXPOP AXRETCHECK ENDPFINDMIN PROC FAR ;FINDMIN子程序 PUSH AXPUSH BXPUSH CXPUSH DXLEA BX,BUFFER+2MOV CL,BUFFER+1INC CLMOV AL,CLMOV AH,0MOV DL,3DIV DLDEC ALMOV CL,AL ;CL=(LENGTH+1)/3-1=N-1,表示比較次數 AND CL,CLJNZ LOOPL ;不止一個數據 MOV DX,BXMOV MIN,DX ;只輸入一個數據,直接付給MINJMP OVER LOOPL: MOV DL,BX+3CMP BYTE PTR BX,DLJGE THERE1MOV DX,BXMOV MIN,DX ;只比較十位 JMP CONDITHERE1: MOV DL,BX+3CMP BYTE PTR BX,DLJG THERE2MOV DL,BX+4CMP BYTE PTR BX+1,DLJGE THERE3MOV DX,BXMOV MIN,DX ;十位相等,比較個位JMP CONDITHERE2: MOV DX,BX+3MOV MIN,DX ;只比較十位JMP CONDITHERE3: MOV DX,BX+3MOV MIN,DX ;前兩個數比較,小的存入MINCONDI: DEC CL JNZ FIN ;判斷比較是否完成JMP OVER FIN: MOV DL,LOW MIN ;比較次數為2或以上時CMP BYTE PTR BX+6,DL JGE HERE1MOV DX,BX+6MOV MIN,DX ;只比較十位(當前數與MIN比較)JMP HERE2HERE1: MOV DL,LOW MINCMP BYTE PTR BX+6,DLJG HERE2MOV DL,LOW MIN+1CMP BYTE PTR BX+7,DLJGE HERE2MOV DX,BX+6MOV MIN,DX ;十位相等,比較個位HERE2: ADD BX,3 ;BX指向下一個數JMP CONDIOVER: MOV AH,2 MOV DL,0AHINT 21HMOV AH,2MOV DL,0DHINT 21HMOV AH,2MOV DL,LOW MININT 21HMOV AH,2MOV DL,LOW MIN+1INT 21H ;輸出MIN的值,即為最小值POP DXPOP CXPOP BXPOP AXRETFINDMIN ENDPSTART PROC FARMOV AX,DATAMOV DS,AX AGAIN2: MOV ERR,0MOV DX,SEG BUFFERMOV DS,DXMOV DX,OFFSET BUFFERMOV AH,0AHINT 21HCALL CHECKMOV AL,ERRAND AL,ALJZ JUDGE ;輸入有誤,不進行比較JMP AGAIN2 ;輸入無誤,進行比較JUDGE: CALL FINDMINEN: MOV AH,4CHINT 21HSTART ENDPCODE ENDSEND START 四、程序流程圖(圖表一:FINDMIN子程序流程圖)(圖表二:一次比較流程圖)五、實驗結果與調試過程運行結果:1只輸入一個數據2輸入兩個數據(冒號“:”為數據分隔符,回車為結束符)3輸入三個或以上數據4輸入數據有誤提示錯誤,再次輸入:六、心得體會:做這個實驗的過程中出了一些錯誤,最開始的代碼在運行時輸出亂碼,這個問題困擾了我很久。后來我通過單步調試,發(fā)現是因為調用子程序時沒有注意現場保護,幾個寄存器被多次賦值,導致結果顯示時不僅不能輸出正確結果,程序還跑飛了。所以比較和顯示時都出現了問題。經過這次實驗,我發(fā)現匯編編程過程中一定要注意,在子程序調用時要做好現場保護,畢竟匯編不像高級語言,子程序壓棧出棧的過程對編程者并不是透明的。微機原理與接口技術軟件實驗實驗報告三姓名:楊帆學院:信息與通信工程學號:070547班級:07118實驗三 代碼轉換程序設計一、實驗目的:1.掌握幾種最基本的代碼轉換方法;2.運用子程序進行程序設計。實驗內容:1.從鍵盤上輸入若干兩位十進制數,尋找其中的最小值,然后在屏幕上顯示出來;2.兩個十進制數之間的分隔符,輸入結束標志自定,但要在報告中說明;3.對輸入要有檢錯措施,以防止非法字符輸入,并有適當的提示;4.將整個程序分解為若干模塊,分別用子程序實現.在報告中要給出模塊層次圖。二、預習題:1.如何將輸入的兩個字符(0 - 9)變?yōu)槭M制或二進制數?答:可以通過將字符的減去30H再乘以10D,加上個位的值(同樣要將ASCII碼減去30H變?yōu)槭M制數)即可得兩個字符的十進制數。2.如何將選出的最小值(二進制或十進制)變?yōu)?ASCII 碼再進行顯示?答:選出最小十進制數后可以通過除十得到余數和商,商為高位,余數為低位,分別對這兩個加30H即可到得其ASCII碼。3.你覺得采用二進制運算還是十進制運算更適合于這個實驗?答:個人覺得采用二進制運算更簡便,這樣可以直接使用ASCII碼比較,使問題簡化。三、源程序DATA SEGMENT BUFFER DB 101 ;為BUFFER分配空間DB 0 ;BUFFER實際長度DB 101 DUP (0)MESSAGE DB ERROR,TRY AGAIN,0DH,0AH,$ ;錯誤信息MIN DW ?ERR DB 0 ;錯誤標志寄存器DATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKCHECK PROC FAR ;CHECK子程序PUSH AXPUSH BXPUSH CXPUSH DXLEA BX,BUFFER+2 ;BX指向第一個輸入的數MOV CL,BUFFER+1 ;輸入字符串總長度AGAIN: CMP BYTE PTR BX,30H JL ERROR ;小于30h,出錯CMP BYTE PTR BX,3AH JG ERROR ;大于3Ah,出錯JMP EXIT1ERROR: MOV AH,9MOV DX,SEG MESSAGEMOV DS,DXMOV DX,OFFSET MESSAGEINT 21H ;輸出錯誤提示MOV ERR,1 ;更改錯誤標志寄存器JMP EXIT2EXIT1: INC BXDEC CLJNZ AGAINEXIT2: POP DXPOP CXPOP BXPOP AXRETCHECK ENDPFINDMIN PROC FAR ;FINDMIN子程序PUSH AXPUSH BXPUSH CXPUSH DXLEA BX,BUFFER+2MOV CL,BUFFER+1INC CLMOV AL,CLMOV AH,0MOV DL,3DIV DLDEC ALMOV CL,AL ;CL=(LENGTH+1)/3-1=N-1,表示比較次數AND CL,CLJNZ LOOPL ;不止一個數據MOV DX,BXMOV MIN,DX ;只輸入一個數據,直接付給MINJMP OVER LOOPL: MOV DL,BX+3CMP BYTE PTR BX,DLJGE THERE1MOV DX,BXMOV MIN,DX ;只比較十位 JMP CONDITHERE1: MOV DL,BX+3CMP BYTE PTR BX,DLJG THERE2MOV DL,BX+4CMP BYTE PTR BX+1,DLJGE THERE3MOV DX,BXMOV MIN,DX ;十位相等,比較個位JMP CONDITHERE2: MOV DX,BX+3MOV MIN,DX ;只比較十位JMP CONDITHERE3: MOV DX

溫馨提示

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

評論

0/150

提交評論