摘要:本文淺談了Debug在匯編語言程序上機(jī)調(diào)試中的基本步驟和方法,幫助學(xué)生如何利用Debug工具更好地學(xué)習(xí)匯編語言,對于匯編語言教學(xué)具有一定的參考價(jià)值。
關(guān)鍵詞:匯編語言;Debug;調(diào)試;命令
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)09-11653-03
The Method of the Debug Debugging Assembly Language Procedure
JI Bo-jing
(Chizhou Institute, Chizhou 247100, China)
Abstract: This article discussed shallowly basic step and method of Debug in the assembly language procedure hands-on debugging, and help the students how to study the assembly language well by using the Debug tool. It has certain reference value regarding the assembly language teaching.
Key words: Assembly language; Debug; Debugging; Order
1 引言
匯編語言是一種介于計(jì)算機(jī)能直接識(shí)別、執(zhí)行的機(jī)器語言和高級(jí)語言之間的程序設(shè)計(jì)語言。匯編語言最顯著的特
點(diǎn)是它與機(jī)器硬件關(guān)系密切,與機(jī)器語言一一對應(yīng),可以編寫出在“時(shí)空”兩方面最有效率的程序,因此在系統(tǒng)軟件開發(fā)、實(shí)時(shí)工業(yè)控制等場合中是必不可少的軟件開發(fā)工具?,F(xiàn)在大多數(shù)高校的計(jì)算機(jī)專業(yè)均將《匯編語言程序設(shè)計(jì)》作為必修課程,通過該課程的教學(xué),有助于培養(yǎng)學(xué)生的程序設(shè)計(jì)方面的能力,同時(shí)可以讓學(xué)生從根本上認(rèn)識(shí)、理解計(jì)算機(jī)的工作原理,這對《接口技術(shù)》、《單片機(jī)》等后續(xù)課程的學(xué)習(xí)是非常有幫助的。但是在具體的教學(xué)過程中,尤其是在上機(jī)環(huán)節(jié)里學(xué)生普遍感到匯編語言程序難以調(diào)試,以至于不能很好的理解課堂上傳授的理論知識(shí),由此引發(fā)學(xué)生剛接觸這門課程時(shí)學(xué)習(xí)興趣不高。好在系統(tǒng)為我們提供了Debug工具,利用好這個(gè)調(diào)試工具將很大程度地幫助于我們調(diào)試好匯編語言程序,從而提高了學(xué)生的學(xué)習(xí)興趣和教學(xué)效果。下面筆者結(jié)合教學(xué)實(shí)踐就如何使用Debug來調(diào)試匯編語言程序這個(gè)問題談?wù)勛约旱幕痉椒ā?/p>
2 結(jié)合教學(xué)實(shí)踐介紹Debug調(diào)試匯編語言程序的基本方法
2.1 調(diào)試程序前的準(zhǔn)備工作
2.1.1 熟悉Debug工具中常用的命令的使用方法
Debug提供了一系列操作命令,具有很強(qiáng)的調(diào)試功能,涉及的內(nèi)容也相當(dāng)廣。下面簡要介紹在程序調(diào)試中使用的一些常用命令。
R--顯示寄存器的內(nèi)容 A--對助記符指令進(jìn)行匯編
D--顯示內(nèi)存單元的內(nèi)容 G--運(yùn)行程序
U--對二進(jìn)制指令代碼進(jìn)行反匯編 Q--退出Debug
E--修改存儲(chǔ)區(qū)數(shù)據(jù) T--單步執(zhí)行程序
2.1.2 借助參考文件
利用匯編和連接過程中產(chǎn)生的.LST或.MAP文件信息,記下調(diào)試中某些關(guān)鍵變量、標(biāo)號(hào)、子程序的地址,為便于調(diào)試中查看中間結(jié)果和設(shè)置斷點(diǎn)位置。
2.1.3 制定調(diào)試步驟方案
多數(shù)同學(xué)在上機(jī)過程中,完成匯編語言源程序的編輯、匯編、連接以及進(jìn)入Debug調(diào)試環(huán)境后,普遍感到束手無策,不知從何處開始調(diào)試,更無法得知程序的結(jié)果是否正確。面臨這種問題,往往筆者在上機(jī)教學(xué)中告訴學(xué)生首先要回顧一下程序所要求實(shí)現(xiàn)的功能,其次借助.LST或.MAP文件信息分析出程序的已知條件 ,比如已知變量的值及存放的內(nèi)存單元地址,進(jìn)而可將已知變量數(shù)據(jù)所存儲(chǔ)的示意圖畫在紙上,然后分析出程序運(yùn)行的正確結(jié)果及所存放的具體地址。上述問題正確分析完后就可以制定出一個(gè)較具體的調(diào)試步驟方案。
2.2 調(diào)試過程的具體實(shí)施
2.2.1 啟動(dòng)Debug
在完成調(diào)試程序前的準(zhǔn)備工作之后,就啟動(dòng)Debug程序,裝入被調(diào)試程序進(jìn)入調(diào)試環(huán)境。注意,進(jìn)入Debug時(shí)一定要以完整的形式指定用戶可執(zhí)行程序文件名(完整路徑\\文件名.擴(kuò)展名),裝入被調(diào)試程序。
2.2.2 觀察寄存器和數(shù)據(jù)單元的初始值
在裝入用戶程序后,先用R命令顯示寄存器的初始值,通過CS和SS寄存器可以了解到程序代碼段和堆棧段在內(nèi)存中的分布位置;從IP可以知道第一條可執(zhí)行指令在代碼段中的起始地址;DS和ES中的值是相同的,注意它們并不是用戶程序數(shù)據(jù)段的段基值,而是PSP的段基值。然后選擇U命令或者查看連接過程中產(chǎn)生的.MAP文件來找出用戶程序數(shù)據(jù)段的段值,如果用戶想查看數(shù)據(jù)段中的內(nèi)容,還必須提供變量的偏移地址,這時(shí)可以通過.LST文件或者畫出變量存儲(chǔ)示意圖分析出數(shù)據(jù)段中定義的變量的偏移量。緊接著用D命令和已查到的數(shù)據(jù)段段基值、變量偏移地址來查看用戶數(shù)據(jù)段中存儲(chǔ)的內(nèi)容。此時(shí)就可以對程序的各個(gè)功能段在內(nèi)存中的存儲(chǔ)分布情況有了具體的了解,便于后續(xù)的調(diào)試。
2.2.3 目標(biāo)代碼的反匯編
在運(yùn)行程序之前,還須對要執(zhí)行的代碼段進(jìn)行反匯編。只有這樣才能確定待運(yùn)行的程序段的起始地址、斷點(diǎn)地址。
2.2.4 選用適當(dāng)?shù)倪\(yùn)行程序命令,運(yùn)行用戶程序
Debug提供了G、T、P三個(gè)運(yùn)行程序命令,這就要求我們要靈活的選用。比如,對執(zhí)行順序程序部分,通常使用G命令。對于要特別仔細(xì)查看的指令,可選用P命令或T命令,一般建議在單步執(zhí)行時(shí),選用P命令,在需要考察LOOP循環(huán),進(jìn)入子程序或軟中斷調(diào)用時(shí),使用T命令進(jìn)行跟蹤運(yùn)行。
2.2.5 斷點(diǎn)的設(shè)置
在程序的各功能段調(diào)試中,可能包含有轉(zhuǎn)移分支指令,往往需要對分支的原因、分支的正確性進(jìn)行驗(yàn)證。這時(shí)就需要在G命令中加上斷點(diǎn)參數(shù)。
2.2.6 觀察運(yùn)行結(jié)果
匯編語言源程序運(yùn)行后,大多數(shù)情況下運(yùn)行結(jié)果并不直觀的顯示在屏幕上,這時(shí)就可以選擇D命令或者R命令來顯示出存放在內(nèi)存單元或寄存器中的運(yùn)行結(jié)果。
如果用戶希望像高級(jí)語言那樣,程序運(yùn)行結(jié)果可以直接顯示在屏幕上,可以調(diào)用系統(tǒng)提供的DOS系統(tǒng)功能調(diào)用或者BIOS中斷調(diào)用來顯示。用戶可以結(jié)合題目的要求和分析,對運(yùn)行結(jié)果作出判斷,從而可得知用戶程序是否正確。
2.3 舉例說明Debug在匯編語言中的調(diào)試方法
2.3.1 以下是該程序的功能要求和源程序清單:
;定義源字符串變量sstr的值為小寫字母表,用程序?qū)⑺鼜?fù)制到目標(biāo)字符串dstr中。
datasegment
sstrdb'abcdefghijklmnopqrstuvwxyz'
dataends
extra segment
dstrdb 26 dup(?)
extra ends
codesegment
assume cs:code,ds:data,es:extra
start: mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
lea si,sstr
lea di,dstr
mov cx,26
cld
repmovsb
movah,4ch; dos系統(tǒng)功能調(diào)用,標(biāo)志源程序結(jié)束
int21h
code ends
endstart
2.3.2 具體調(diào)試過程
為了方便說明給該程序命名為“mycopy.asm”,首先在DOS環(huán)境下完成對該程序的編輯輸入、匯編、連接,接著啟動(dòng)Debug將生成的mycopy.exe文件裝入內(nèi)存,輸入R命令后,屏幕出現(xiàn)了各個(gè)寄存器的當(dāng)前值,如下所示:
E:\\MASM>debug mycopy.exe
-r
AX=0000BX=0000CX=005CDX=0000SP=0000BP=0000SI=0000DI=0000DS=13D3ES=13D3SS=13E3CS=13E7IP=0000 NV UP EI PL NZ NA PO NC
13E7:0000 B8E313MOVAX,13E3
可以查到當(dāng)前代碼段段基值是13E7H,堆棧段的段基值為13E3H,整個(gè)程序段所占內(nèi)存大小存放在(BX,CX)中,為005CH個(gè)字節(jié)。
輸入U(xiǎn)命令后,屏幕出現(xiàn)了代碼段在內(nèi)存中的存放情況,如下所示:
-u cs:0
13E7:0000 B8E313MOVAX,13E3
13E7:0003 8ED8MOVDS,AX
13E7:0005 B8E513MOVAX,13E5
13E7:0008 8EC0MOVES,AX
13E7:000A 8D360000LEASI,[0000]
13E7:000E 8D3E0000LEADI,[0000]
13E7:0012 B91A00MOVCX,001A
13E7:0015 FCCLD
13E7:0016 F3REPZ
13E7:0017 A4MOVSB
13E7:0018 B44CMOVAH,4C
13E7:001A CD21INT21
13E7:001C ECIN AL,DX
13E7:001D 81EC9000 SUBSP,0090
可以查到數(shù)據(jù)段的段基值為13E3H,附加段段基值為13E5H,并可以找到待運(yùn)行代碼段的起始地址為13E7:0000,結(jié)束地址為13E7:001C。
經(jīng)過分析后可以找到數(shù)據(jù)段中的小寫字母表存放的首偏移地址是0,將要存放復(fù)制過來的小寫字母表的首偏移地址也是0。這樣就可以查看數(shù)據(jù)段中被復(fù)制的小寫字母表在內(nèi)存中存放的情況,選用D命令,如下所示:
-D 13E3:0 L1A
13E3:000061 62 63 64 65 66 67 68-69 6A 6B 6C 6D 6E 6F 70abcdefghijklmnop
13E3:001071 72 73 74 75 76 77 78-79 7Aqrstuvwxyz
可以看出屏幕顯示三欄信息,右邊欄顯示的是數(shù)據(jù)段在內(nèi)存中存放的信息,當(dāng)前是小寫字母表,中間欄顯示的是這些小寫字母在內(nèi)存中存儲(chǔ)的形式,均為十六進(jìn)制,左邊欄顯示的是每一行的16個(gè)字節(jié)單元區(qū)域的首字節(jié)單元地址。
接下來選擇G命令來運(yùn)行程序,如下所示:
-G=13e7:0000001C
Program terminated normally
可以看出該程序的結(jié)果并沒有直觀顯示出來,這時(shí)我們可以分析下該程序的功能,是將數(shù)據(jù)段中的小寫字母表復(fù)制到附加段的存儲(chǔ)區(qū)域,要想觀察結(jié)果得用D命令去查看附加段所在內(nèi)存單元的內(nèi)容是否是小寫字母表就可以了。如下所示:
-d 13e5:0 l1a
13E5:000061 62 63 64 65 66 67 68-69 6A 6B 6C 6D 6E 6F 70abcdefghijklmnop
13E5:001071 72 73 74 75 76 77 78-79 7Aqrstuvwxyz
結(jié)果已經(jīng)顯示在屏幕上了,可以看出附加段里有存放的小寫字母表,可以判斷該程序是正確的。
3結(jié)束語
“匯編語言程序設(shè)計(jì)”是一門實(shí)踐性很強(qiáng)的學(xué)科,要求我們在學(xué)習(xí)理論知識(shí)的同時(shí)更重視上機(jī)環(huán)節(jié)的實(shí)踐操作能力的培養(yǎng),尤其要熟練地靈活使用Debug調(diào)試工具,以實(shí)驗(yàn)實(shí)踐促進(jìn)理論知識(shí)的深入理解,從而激發(fā)學(xué)生的學(xué)習(xí)興趣,提高教學(xué)質(zhì)量和教學(xué)效率,為學(xué)生的后續(xù)課程的學(xué)習(xí)打下扎實(shí)的基礎(chǔ)。
參考文獻(xiàn):
[1] 沈美明. IBM——PC匯編語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,1991.
[2] 王正智. 宏匯編語言程序設(shè)計(jì)[M].成都:電子科技大學(xué)出版社,2000.
[3] 羅省賢. 匯編語言程序設(shè)計(jì)教程[M].北京:電子工業(yè)出版社,2004.
[4] 楊季文. 80X86匯編語言程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,1998.