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