實 驗?? DEBUG程序的使用
一、?實驗目的
1.?學習使用DEBUG程序的各種命令。
2.?利用DEBUG學習
3.?了解計算機取指令、執行指令的工作過程。
4.?掌握用DEBUG調試自編程序的方法。
二、?實驗任務
1.?參照附錄1,掌握DEBUG程序的各種命令,重點是命令R,D ,A,U,T,P,G命令的使用。
2.?用命令A匯編下列指令,判斷指令正誤并說明原因。
(1)?ROR AX,8
(2)?LEA DI,[AX]
(3)?MOV DS,2010
(4)?PUSH AL
(5)?OUT 900,AL
(6)?MOV [BX],0
3.?用命令查看8086/8088 CPU在開機后執行的第一條指令。
4.?用命令D查看DS:200~22F和F000:200~22F兩內存塊內容,用命令F將字符“A”分別填入這兩個內存塊,比較填入前后結果,了解可讀寫內存RAM和只讀內存ROM的區別。
5.?用A命令匯編一條INT 1C指令,用命令T單步執行該指令,比較指令執行前后CS和IP、堆棧指針SP及堆棧內容變化情況,了解什么是中斷向量表,中斷向量和中斷子程,掌握中斷指令的執行過程。
6.?利用T,P,G命令,執行下列指令段,注意它們的不同之處。
(1)?MOV DI,300
MOV SI,400
MOV CX,3
CLD
REP MOVSB
INT 3
(2)?MOV AH,2
MOV DL,41
INT 21
INT 3
(3)?先在CS:200處匯編一條RET指令,再在CS:100處匯編。
MOV BX,200
CALL BX
INT 3
??????? 然后從MOV BX,200處開始執行。
7.?用命令A匯編下列程序段,并將程序寫到硬盤上,然后調試程序段,觀察程序段能否完成指定功能,若不能,說明原因,并修改程序。
(1)?完成將DS:2000開始的5個字節內存內容相加,并把相加的結果存放在DS2005內存單元中。
MOV CX,5
MOV AL,0
MOV BX,2000
?????????? nest:?? ADD AL,[BX]
????????????????? INC BX
????????????????? DEC CX
????????????????? LOOP nest
????????????????? MOV [BX],AL
????????????????? INT 3
(2)?以雙重循環來實現延時,然后再給AX賦值。
????????? MOV AX,0
again1:MOV SI,3
again2:MOV DI,3
????? DEC DI
????? JNZ again2
????? DEC SI
????? JNZ again1
????? MOV AX,100
????? INT 3
8.進入DEBUG后,首先用命令R查看當前DS內容,記錄此值,假設為X。
在DEBUG下匯編、調試完成下列功能的程序。
(1)?將內容F000:2000H起30H個字數據傳送到內存X:1000H開始處。
(2)?測試內存X:300H開始的10H個字節數據,計算其中正數、負數、0的個數,并將結果分別存放在X:400H開始的三個內存單元中。
三、?實驗說明
1.?關于任務1,參照附錄1中的實例,了解DEBUG的各種命令。
2.?在DEBUG下,用戶可對所有寄存器、RAM內存隨意查看和修改,但由于對DOS操作系統在內存中存放情況不了解,可能會將存放有操作系統程序的內存內容破壞,從而可能引起系統運行異常,往往是出現死機現象,故建議使用DOS分配給用戶的內存可用區,其低端地址是剛進入DEBUG時,用命令R查看到的CS:IP。涉及到修改內存的命令有A,E,F,M,L等。
3.?初學者在使用DEBUG命令修改內存或執行程序時,由于多種原因,出現死機是較經常的現象,可按RESET復位按鈕,重新啟動系統。
4.?用連續執行命令G執行程序時,注意給出執行的首地址,或查看當前CS和IP值是否為要執行程序段的首地址,并注意查看執行的指令流程中有無返回DEBUG功能的程序段,如指令INT 20T或斷點設置INT3,否則發出命令后,很容易出現死機,原因是如無程序段使系統返回命令接受狀態,CPU將不斷到內存取指令、執行指令,使作戶失去對系統的控制,出現死機。為避免這種情況,可在用戶程序段的最后加上一條INT 20H指令,或用斷點方式執行。避免出現死機。
5.?關于任務2,在命令A下匯編各條指令,對于錯誤的指令,DEBUG指令出其錯誤位置,對于正確的指令,將其匯編到相應內存,據此可判斷指令正誤,而具體原因需自己分析。
6.?關于任務3,8086/8088 CPU在開機后執行的第一條指令在內存FFFF:0H開始處。
7.?關于任務4,由于可讀寫內存RAM的內容可修改,而只讀內存ROM的內容不能修改,故命令F未能將字符‘A’填入F000:200H~22FH的內存中,內存F000:200H~22FH的內容填寫前后保持不變。
8.?關于任務5,中斷指令INT N是指令系統中較復雜的一條指令,結合教材中對中斷指令的介紹,利用DEBUG來學習,加強對中斷指令執行過程、中斷向量表、中斷向量和中斷子程序等內容的理解。
9.?關于任務6,用A命令匯編好后,用T,P,G命令分別執行,記錄指令執行前后各寄存器(包括標志寄存器各標志位值)、堆棧指針及堆棧內容變化情況,以及與指令有關內存單元的內容,總結T和P執行某些指令的不同之處及適用場合。
10.關于任務7和8,為避免調試過程中出現死機,造成內存中的程序丟失,而重復多次輸入程序,在用A命令將程序匯編到內存后,先用命令N和W將程序寫到磁盤上,再進行調試運行。當調試過程中出現異常時,重新啟動系統,用命令N和L將文件從磁盤裝入內存,重新對程序進行調試運行。
11.DEBUG下不支持符號地址,如任務7中的標號next,again1,again2等,在命令A下輸入程序時,不輸入標號(如next:),在用到標號的指令(如LOOP,JNZ等),在其后直接輸入要跳轉的目的地址。
對向前跳轉的指令,如匯編任務7,輸入程序的過程如下:
-A ↙
1270:0100???? MOV CX,5 ↙
1270:0103???? MOV AL,0 ↙
1270:0105???? MOV BX,2000 ↙
1270:0108???? ADD AL,[BX] ↙
1270:010A???? INC BX ↙
1270:010B???? DEC CX
1270:010C???? LOOP 0108 ↙
1270:101E????? MOV [BX],AL ↙
1270:0110???? INT 3
1270:0112 ↙
用目的地址0108代替標號next在LOOP指令中的位置,而在輸入ADD AL,[BX]這條指令時,不輸入標號next.
對向后跳轉的指令,由于目的地址尚未確定,可先隨意輸入一個地址,若是條件轉移指令,注意跳轉范圍應在-128~127之間,待程序輸入完畢,目的地址明確后,再用命令A修改跳轉指令。
如下程序段,功能是比較AX和CX中的兩符號數,將較大的數放在AX和BX中,較小的數放在CX中。
?????????? CMP??? AX,CX
?????????? JX???? continue
?????????? XCHG?? AX,CX
continue: MOV??? BX,AX
用命令A輸入程序的過程如下:
-A ↙
1270:0100???? CMP AX,CX ↙
1270:0102???? JG 0102 ↙???????? 輸入本條指令的地址0102代替標號continue
1270:0104???? XCHG AX,CX ↙
1270:0106???? MOV BX,AX ↙
1270:0108 ↙
-A 102↙???????????????????????????? 修改跳轉指令的目的地址
1270:0102????? JG 0106 ↙???????? 輸入目的地址0106
1270:0104? ↙
-U 1270:0100 L 0 A ↙?????????? 用命令U查看程序,跳轉正確
1270:0100 39C8?????????????? CMP??? AX,CX
1270:0102 7F02?????????????? JG???? 0106
1270:0104 87C1?????????????? XCHG?? AX,CX
1270:0106 89C3?????????????? MOV??? BX,AX
12.執行任務7中的任務時,會發現執行的結晶與設計的結果不相符,但又無法從源程序段發現出錯原因時,可用命令T跟蹤執行程序,查看每條指令執行完后的結果是否與設想的一致,如發現有誤,找出原因,然后修改程序,再跟蹤執行,直到結果與設想相符,并能實現程序段功能.這個過程就是程序的調試過程。調試程序時,要有耐心。
13.將任務8中調試好的程序以文件形式存儲在磁盤上。結束實驗前,將實驗結果演示給指導教師檢查。
四、?問題思考
1.?假設某內存單元的內容為CCH,試問該內容如看作一條指令、看作無符號數、看作帶符號數,那將分別表示什么?不查看教材中的指令系統代碼,如何在DEBUG下知道CCH表示一條什么指令?
2.?在指令MOV[BX],AX中,操作數[BX]的尋址方式是什么?在DEBUG下執行完該指令后,如何查看執行結果?
3.?可否隨意在DEBUG提示符“-”后不帶參數發出命令G?什么情況下使用命令G時,可不用“=”給出執行的首地址?
4.?分析出現死機的幾種情況。如何理解死機現象?試從計算機的工作原理進行解釋。
五、?實驗報告
1.?分析任務2中各條指令錯誤原因。
2.?記錄CPU在開機后報告文學行的第一條指令。
3.?描述中斷指令執行過程,記錄1CH的中斷子程。
4.?說明可讀寫內存RAM和只讀內存ROM的區別。
5.?說明命令T和P的差別。
6.?指出任務6中程序段的出錯原因,給出修改后的程序段。
7.?給出任務7中調試好的程序。
8.?回答問題思考。
9.?針對實驗目的認真做小結。
評論
查看更多