




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
3.1用DEBUG運(yùn)行匯編語(yǔ)言程序
DEBUG調(diào)試程序是以DOS外部命令程序的形式提供的,它的文件名是DEBUG.COM。在進(jìn)入DEBUG的提示符‘-’之后,用戶可以通過(guò)DEBUG的命令輸入?yún)R編源程序,并用相應(yīng)命令將其匯編成機(jī)器語(yǔ)言程序;然后調(diào)試并運(yùn)行該程序。使用DEBUG運(yùn)行匯編程序較之使用ASM和MASM運(yùn)行匯編程序有以下優(yōu)點(diǎn):可在最下層環(huán)境下運(yùn)行;免去使用ASM和MASM必須熟悉文本編輯程序、ASM和MASM本身程序以及LINK程序的麻煩,因而調(diào)試周期短程序員可在不熟悉ASM和MASM所涉及的偽指令的情況下運(yùn)行匯編語(yǔ)言程序,為以后學(xué)習(xí)重點(diǎn)轉(zhuǎn)移到程序設(shè)計(jì)打下堅(jiān)實(shí)的使用指令編程的基礎(chǔ);熟悉DEBUG的命令使用,為以后的軟件開(kāi)發(fā)掌握調(diào)試工具,這是因?yàn)镈EBUG除了可運(yùn)行匯編語(yǔ)言程序外,還可以直接用來(lái)檢查和修改內(nèi)存單元、裝入、存儲(chǔ)及啟動(dòng)運(yùn)行程序、檢查及修改寄存器,也就是說(shuō)DEBUG可深入到計(jì)算機(jī)的基本級(jí),可使用戶更緊密地與計(jì)算機(jī)中真正進(jìn)行的工作相聯(lián)系。然而能在DEBUG下運(yùn)行匯編語(yǔ)言源程序也受到了一些限制,它不宜匯編較長(zhǎng)的程序,不便于分塊程序設(shè)計(jì),不便于形成以DOS外部命令形式構(gòu)成的EXE文件,不能使用浮動(dòng)地址,也不能使用絕大多數(shù)ASM和MASM提供的偽指令。例3.1在DEBUG下運(yùn)行如下程序:
MOVDL,33H;字符3的ASCII碼送DLMOVAH,2;使用DOS的2號(hào)功能調(diào)用
INT21H;進(jìn)入功能調(diào)用,輸出‘3’
INT20H;BIOS中斷服務(wù)程序正常結(jié)束。該程序運(yùn)行結(jié)果是在顯示器上輸出一個(gè)字符‘3’。如果要輸出其它字符,請(qǐng)改變程序中‘33H’為相應(yīng)字符的ASCII碼。其中涉及DOS和BIOS功能調(diào)用。因?yàn)槲覀兪窃贒OS的支持下運(yùn)行匯編語(yǔ)言程序,所以一般情況下,不能輕易使用輸入/輸出指令直接通過(guò)端口輸入/輸出,而必須使用DOS內(nèi)部提供的子程序完成輸入/輸出。DOS功能調(diào)用就是為諸如此類的目的設(shè)置的。
DOS功能調(diào)用要求在進(jìn)入INT21H調(diào)用前,首先將功能調(diào)用號(hào),也就是功能種類號(hào)送AH寄存器,并依功能號(hào)準(zhǔn)備初始數(shù)據(jù)。也就是說(shuō)INT21H的2號(hào)功能調(diào)用是輸出DL寄存器中字符。INT20H是BIOS中斷服務(wù)子程序,這一軟中斷用來(lái)正常結(jié)束程序。運(yùn)行步驟:
(1)進(jìn)入DEBUG
設(shè)C盤上有DEBUG.COM程序,進(jìn)入DOS后鍵入DEBUG〈ENTER〉,即C>DEBUG屏幕顯示:-‘-’號(hào)是進(jìn)入DEBUG的提示符,在該提示符下可鍵入任意DEBUG命令。現(xiàn)在用A命令送程序如下:(2)輸入程序并匯編-A100169C:0100MOVDL,33169C:0102MOVAH,2169C:0104INT21169C:0106INT20169C:0108至此程序已送完,并匯編成機(jī)器指令?,F(xiàn)在用G命令運(yùn)行程序如下:(3)運(yùn)行程序-G3Programterminatednormally
如果現(xiàn)在想看一下機(jī)器指令是什么樣子的話,方法之一是可以用反匯編命令U作如下操作:(4)反匯編-U100,108169C:0100B233MOVDL,33169C:0102B402MOVAH,02169C:0104CD21INT21169C:0106CD20INT20169C:0108(5)寫COM文件-RBXBX0000:-RCXCX0000:8-NEXCOM.COM-W(6)送機(jī)器指令程序-E200B233B402CD21CD20(7)執(zhí)行機(jī)器指令程序-G=2003Pogramterminatednormally(8)退出DEBUG返回DOS,執(zhí)行EXCOMCOM文件-QC>EXCOM3C>3.2DEBUG命令
DEBUG命令是在DEBUG提示符“-”下,由鍵盤鍵入的。每條命令以單個(gè)字母的命令符開(kāi)頭,然后是命令的操作參數(shù),操作參數(shù)與操作參數(shù)之間,用空格或逗號(hào)隔開(kāi),操作參數(shù)與命令符之間用空格隔開(kāi),命令的結(jié)束符是回車鍵(ENTER)。命令及參數(shù)的輸入可以是大小寫的結(jié)合。Crtl+Break鍵可中止命令的執(zhí)行。Crtl+NumLock鍵可暫停屏幕卷動(dòng),按任一鍵繼續(xù)。所用數(shù)均為十六進(jìn)制數(shù),且不必寫H。3.2.1匯編命令A(yù)
格式:(1)A〈段寄存器名〉:〈位移〉
(2)A〈段地址〉:〈位移〉
(3)A〈位移〉
(4)A功能:鍵入該命令后顯示段地址和位移并等待用戶從鍵盤逐條鍵入?yún)R編命令,逐條匯編成代碼指令,直到顯示下一地址時(shí)用戶直接鍵入回車鍵返回到提示符“”。其中(1)用指定段寄存器內(nèi)容作段地址,(3)用CS內(nèi)容作段地址,(4)以CS∶100作地址。以后命令中提及的各種‘地址’形式,均指(1)、(2)、(3)中A后的地址形式。3.2.2比較命令C
格式:C〈源地址范圍〉,〈目標(biāo)地址〉其中〈范圍〉是由〈起始地址〉〈終止地址〉指出的一片連續(xù)單元,或〈起始地址〉L〈長(zhǎng)度〉。功能:從〈源地址范圍〉的起始地址單元起逐個(gè)與目標(biāo)起始地址以后的單元順序比較單元的內(nèi)容,直至源終止地址為止。遇有不一致時(shí),以〈源地址〉〈源內(nèi)容〉〈目標(biāo)內(nèi)容〉〈目標(biāo)地址〉的形式顯示失配單元及內(nèi)容。3.2.3顯示內(nèi)存命令D
格式:(1)D〈地址〉(2)D〈范圍〉(3)D功能:以兩種形式顯示指定內(nèi)存范圍內(nèi)容。一種形式為十六進(jìn)制內(nèi)容,一種形式為相應(yīng)字節(jié)的ASCII碼字符,對(duì)不可見(jiàn)字符以‘·’代替。其中(1)以CS為段寄存器。(3)顯示CS∶100起始的一片內(nèi)容。3.2.4修改內(nèi)存命令E
格式:(1)E〈地址〉〈單元內(nèi)容〉(2)E〈地址〉〈單元內(nèi)容表〉其中〈單元內(nèi)容〉是一個(gè)十六進(jìn)制數(shù),或用引號(hào)′或″括起來(lái)的字符串;〈單元內(nèi)容表〉是以逗號(hào)分隔的十六進(jìn)制數(shù),或用′或″括起來(lái)的字符串,或者是二者的組合。功能:(1)將指定內(nèi)容寫入指定單元后顯示下一地址,可連續(xù)鍵入修改內(nèi)容,直至新地址出現(xiàn)后鍵入回車〈ENTER〉止。(2)將〈單元內(nèi)容表〉逐一寫入由〈地址〉開(kāi)始的一片單元。3.2.5填充內(nèi)存命令F
格式:F〈范圍〉〈單元內(nèi)容表〉功能:將單元內(nèi)容表中的值逐個(gè)填入指定范圍,單元內(nèi)容表中內(nèi)容用完后重復(fù)使用。例如:
F5BC:200L10B2,′XYZ′,3C3.2.6
執(zhí)行命令C
格式:(1)G(2)G=〈地址〉(3)G=〈地址〉,〈斷點(diǎn)〉功能:(1)從CS∶IP開(kāi)始執(zhí)行(2)從指定地址開(kāi)始執(zhí)行(3)從指定地址開(kāi)始執(zhí)行,到斷點(diǎn)自動(dòng)停止。
3.2.7十六進(jìn)制算術(shù)運(yùn)算指令H
格式:H〈值1〉〈值2〉功能:求十六進(jìn)制數(shù)〈值1〉和〈值2〉的和與差并顯示結(jié)果。
3.2.8端口輸入命令I(lǐng)
格式:I〈端口地址〉功能:將從指定端口輸入的內(nèi)容顯示出來(lái)。3.2.9讀盤命令L
格式:L〈地址〉〈盤號(hào)〉〈起始邏輯扇區(qū)〉〈所讀扇區(qū)個(gè)數(shù)n〉
其中〈地址〉的缺省值為CS∶100。邏輯扇區(qū)可由物理扇區(qū)號(hào)換算得到,以雙面雙密度盤為例:物理扇區(qū)是按0面0道1區(qū),0面0道2區(qū),……0面0道9區(qū),0面1道1區(qū),……0面39道9區(qū),1面0道1區(qū),……1面39道9區(qū)排列。而邏輯扇區(qū)與物理扇區(qū)號(hào)的對(duì)應(yīng)關(guān)系為物理扇區(qū)0面0道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號(hào)為0~8;物理扇區(qū)1面0道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號(hào)為9~11H;物理扇區(qū)0面1道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號(hào)為12~1AH……這樣每道先0面后1面一直排下去。
其中〈盤號(hào)〉為0、1或2,0表示A盤,1表示B盤,2表示硬盤。功能:將〈盤號(hào)〉指定的盤上,從〈起始邏輯扇區(qū)〉起,共n個(gè)邏輯扇區(qū)上的所有字節(jié)順序讀入指定內(nèi)存地址的一片連續(xù)單元。當(dāng)L后的參數(shù)缺省時(shí),必須在L之前由N命令指定(或進(jìn)入DEBUG時(shí)一并指出)所讀盤文件名。此時(shí)L執(zhí)行后將該文件裝入內(nèi)存。例如:
NEXAMPLEL
將當(dāng)前盤上的EXAMPLE文件裝入CS:100起始的一片內(nèi)存單元。
3.2.10內(nèi)存搬家命令M
格式:M〈源地址范圍〉〈目標(biāo)起始地址〉其中源及目標(biāo)地址若僅輸入偏移量,則隱含相對(duì)DS。功能:把〈源地址范圍〉中的內(nèi)容順序搬至〈目標(biāo)起始地址〉起的一片連續(xù)單元。例如:
MCS:100110600
把從CS∶100起至CS∶110止17個(gè)字節(jié)搬至DS∶600至DS∶610的一片單元。3.2.11命名待讀文件命令N
格式:N文件名說(shuō)明功能:為L(zhǎng)命令指定待裝入文件注:其它形式參考DOS手冊(cè)3.2.12端口輸出命令O
格式:O〈端口地址〉〈字節(jié)〉功能:將該〈字節(jié)〉從指定〈端口地址〉輸出。例如:
O2F4F將4FH從2FH口輸出3.2.13結(jié)束DEBUG返回DOS命令Q格式:Q功能:返回DOS提示符下3.2.14顯示寄存器命令R
格式:(1)R
(2)R〈寄存器名〉功能:(1)顯示當(dāng)前所有寄存器內(nèi)容、狀態(tài)標(biāo)志及將要執(zhí)行的下一指令的地址、代碼及匯編語(yǔ)句形式。其中對(duì)狀態(tài)標(biāo)志FLAG以每位的形式顯示,詳見(jiàn)表3-1。
表3-1狀態(tài)標(biāo)志顯示形式
標(biāo)志位狀態(tài)顯示形式溢出標(biāo)志OF有/無(wú)OV/NV
方向標(biāo)志DF減/增DN/UP
中斷標(biāo)志IF開(kāi)/關(guān)
EI/DI
符號(hào)標(biāo)志SF負(fù)/正NG/PL
零標(biāo)志ZF零/非ZR/NZ
輔助標(biāo)志AF有/無(wú)AC/NA
奇偶標(biāo)志PF偶/奇PE/PO
進(jìn)位標(biāo)志CF有/無(wú)CY/NC(2)顯示指定存儲(chǔ)器內(nèi)容例如:
RAXRF3.2.15
搜索指定內(nèi)存命令S
格式:S〈地址范圍〉〈表〉功能:在指定范圍搜索表中內(nèi)容,找到后顯示表中元素所在地址例如:
SCS:10011041顯示04BA:010404BA:010D表示在位移100H至110H間的上述兩處有41H。又如:
SCS:100L1141″AB″E表示在當(dāng)前代碼段位移100H至111H處找連續(xù)4個(gè)字節(jié)內(nèi)容為41H、41H、42H、0EH的地址。3.2.16執(zhí)行并顯示系統(tǒng)環(huán)境命令T
格式:T[=〈地址〉][〈條數(shù)〉]功能:〈地址〉的缺省值是當(dāng)前IP值,〈條數(shù)〉的缺省值是一條。執(zhí)行由指定地址起始的、由〈條數(shù)〉指定的若干條命令。例如:
T執(zhí)行當(dāng)前指令并顯示狀態(tài)T10從當(dāng)前指令始執(zhí)行10H條指令
3.2.17反匯編命令U
格式:(1)
U〈地址〉(2)U〈地址范圍〉功能:將指定范圍內(nèi)的代碼以匯編語(yǔ)句形式顯示,同時(shí)顯示地址及代碼。注意,反匯編時(shí)一定確認(rèn)指令的起始地址后再作,否則將得不到正確結(jié)果。地址及范圍的缺省值是上次U指令后下一地址的值。這樣可以連續(xù)反匯編。3.2.18寫盤命令W
格式:W〈地址〉〈盤號(hào)〉〈起始邏輯扇區(qū)〉〈所寫邏輯扇區(qū)數(shù)n〉功能:與L命令不同的地方是將內(nèi)存〈地址〉起始的一片單元內(nèi)容寫入指定扇區(qū)。只有W而沒(méi)有參數(shù)時(shí),與N命令配合使用寫盤文件。3.3DEBUG命令綜合使用例
例3.2進(jìn)入DEBUG,使用A命令將源程序?qū)懭雰?nèi)存,使用G命令執(zhí)行,再用U命令反匯編,接著用D命令顯示后,用Q命令退出DEBUG,返回DOS提示符。(1)進(jìn)入DEBUG,并用A命令直接寫入并匯編一個(gè)程序A>debug-A1001392:0100MOVDL,331392:0102MOVAH,21392:0104INT211392:0106INT201392:0108(2)執(zhí)行該程序
G3Programterminatednormally(3)用U命令反匯編-U1001081392:0100B233MOVDL,331392:0102B402MOVAH,021392:0104CD21INT211392:0106CD20INT201392:010861DB61(4)用D命令顯示內(nèi)存
D1001081392:0100B233B402CD21CD2061.3...!.a例3.3進(jìn)入DEBUG,先顯示200H處開(kāi)始的一片單元,接著用E命令,將一段機(jī)器代碼指令(就是上面的一段小程序)寫入200~208H,然后執(zhí)行,再用U命令反匯編。A>DEBUG
D2001392:020000000000000000000000000000000000...............1392:021000000000000000000000000000000000...............1392:02204E8700004E924E9D4EA84EB34EBE4EC9N...N.N.N.N.N.N.1392:02304ED44EDF00004EEA4EF54E004F0B4F16N.N...N.N.N.O.O.1392:02404F214F2C4F377A034F001301FF00A705O!O,O7z.O.......1392:02508000CE04100021D740AF21D740AF21D7......!.@.!.@.!.1392:0260400422B7400422D7402F21D7402F21E2@.″.@.″@/!.@/!.1392:027043CC21B7406B21C740AF21C740AF21C7C.!.@K!.@.!.@.!(1)用E命令把代碼指令寫入內(nèi)存
E200B233B402CD21CD201B(2)用G命令從200H開(kāi)始執(zhí)行
G=2003Programterminatednormally(3)用U命令反匯編-U2002081392:0200B233MOVDL,331392:0202B402MOVAH,021392:0204CD21INT211392:0206CD20INT201392:02081B00SBBAX,[BX+SI]-QA>例3.4進(jìn)入DEBUG,用A命令送程序,用R命令顯示,并用T命令單條執(zhí)行
(1)進(jìn)入并用A命令寫入?yún)R編源程序
A>DEBUG
A100
1392:0100MOVAH,3
1392:0102MOVAL,2
1392:0104ADDAL,AH
1392:0106INT20
1392:0108
(2)用R命令顯示寄存器狀態(tài)
R
AX=0000BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1392ES=1392SS=1392CS=1392IP=0100NVUPEIPLNZNAPONC
1392:0100B403MOVAH,03
(3)用T命令單條執(zhí)行
T
AX=0300BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1392ES=1392SS=1392CS=1392IP=0102NVUPEIPLNZNAPONC
1392:0102B002MOVAL,02
T
AX=0302BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1392ES=1392SS=1392CS=1392IP=0104NVUPEIPLNZNAPONC
1392:010400E0ADDAL,AH
(4)結(jié)果在AL中(AL)=5
T
AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1392ES=1392SS=1392CS=1392IP=0106NVUPEIPLNZNAPONC
1392:0106CD02INT20
T
AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1392ES=1392SS=1392CS=011CIP=1094NVUPDIPLNZNAPONC
011C:109490NOP
(5)用G命令接著執(zhí)行
G
Programterminatednormally(6)退出
Q
A>
例3.5除以前接觸過(guò)的命令外,下面還使用了整片搬家命令M,以及比較一片內(nèi)存單元與另一片內(nèi)存單元內(nèi)容的命令C。
(1)進(jìn)入DEBUG,顯示100H至110H內(nèi)容
A>DEBUG
D100110
1392:01000F00B98AFFF3AE4761031F8BC34812B1.......Ga....H..
1392:011004
(2)用F命令將31H裝入100H至110H
F10011031
(3)用D顯示100H至117H
D100117
1392:0100313131313131313131313131313131311111111111111111
1392:0110318BC6F70AD0D31.......
(4)用E命令修改105H至108H的內(nèi)容
E10561,61,62,63
(5)用D命令顯示100H至110H的內(nèi)容
D100110
1392:01003131313131616162633131313131313111111aabc1111111
1392:011031
1
(6)用M命令將100H至110H的內(nèi)容復(fù)制到200H至210H
M100110200
(7)用D命令顯示200H至210H的內(nèi)容
D200210
1392:02003131313131616162633131313131313111111aabc11111111392:0210311
(8)用E命令修改201H,202H,203H,20DH,20EH,20FH內(nèi)容
E201323134
E20D414243
(9)用D命令顯示200H至210H內(nèi)容及100H至110H內(nèi)容
D200210
1392:02003132313431616162633131313141424312141aabc1111ABC
1392:0210311
D100110
1392:01003131313131616162633131313131313111111aabb1111111
1392:0110311
(10)用C命令比較100H至110H與200H至210H的內(nèi)容,并顯示二者不一致的部分
-C100110200
1392:01031321392:0201
1392:010331341392:0203
1392:010D31411392:020D
1392:010E31421392:020E
1392:010F31421392:020F
-Q
A>
例3.6以下是使用E命令和S命令的例子。
E300′ABCDEFG′
D300306
1392:030041424344454647ABCDEFG
E3101234′″
D310315
1392:0310273132333427′1234′
E320313233414243
D320325
1392:0320313233414243123ABC
S300306′D′
1392:0303
S310315′D′
S310315′3′
1392:0313
S310315′
1392:0310
1392:0315
D310325
1392:0310273132333427221341AF211341AF2113′1234′″.A.!.A.!.
1392:0320313233414243123ABC
Q
例3.7以下用L命令將A盤目錄讀入內(nèi)存。因?yàn)閷?duì)雙面雙密軟盤,盤目錄區(qū)在0道0面6扇區(qū),而L10000B是將A盤上從0面0道1扇區(qū)始共11個(gè)邏輯扇區(qū)讀入內(nèi)存,每扇區(qū)512個(gè)字節(jié),所以讀入內(nèi)存后目錄在當(dāng)前段0B00H處,用D命令可顯示出所有目錄項(xiàng)。退出DEBUG后將E9文件刪除。再進(jìn)入DEBUG,并將目錄讀入內(nèi)存,顯示出可見(jiàn)文件名E9的目錄項(xiàng)還在,但E字母處已變?yōu)镋5H,這是文件已刪標(biāo)志。現(xiàn)用E命令修改它仍為E字母的ASCII碼45H,并用W命令記盤可見(jiàn)文件已恢復(fù)。
(1)進(jìn)入DEBUG前先顯示A盤目錄
C>dira:
VolumeindriveAhasnolabel
VolumeSerialNumberis0C6218C9
DirectoryofA:\
E5273031007905:05p
E5328751007905:17p
E54105581007905:47p
E920501007906:03p
E9217441007906:05p
E1020501007906:10p
6file(s)26580bytes
331776bytesfree
(2)進(jìn)入DEBUG,并用L命令將A盤上0扇區(qū)起共11個(gè)邏輯扇區(qū)讀入內(nèi)存169C:0100起始一片單元
C>debug
L10000b
(3)顯示0B00起始的內(nèi)存內(nèi)容
db00
169C:0B0045353220202020202020202000000000E52....
169C:0B10000000000000BB8847150200871C0000........G.......
169C:0B2045353320202020202020202000000000E53....
169C:0B300000000000002F8A47150A003B0B0000....../.G...;...
169C:0B4045353420202020202020202000000000E54....
169C:0B50000000000000F68D47150D003E290000........G...>)..
169C:0B6045392020202020202020202000000000E9....
169C:0B700000000000006.....n.G.......
-d
169C:0B8045393220202020202020202000000000E92....
169C:0B90000000000000BB9047151B0000060000........G.......
169C:0BA045313020202020202020202000000000E10....
169C:0BB0000000000000469147151D0002080000......F.G.......
169C:0BC000000000000000000000000000000000................
169C:0BD000000000000000000000000000000000................
169C:0BE000000000000000000000000000000000................
169C:0BF000000000000000000000000000000000................
-q
C>
(4)刪除文件e9
C>
C>erasea:e9
C>dira:e9
VolumeindriveAhasnolabel
VolumeSerialNumberis0C6218C9
DirectoryofA:\
Filenotfound
(5)進(jìn)入DEBUG并用L再讀盤,用D命令顯示,可見(jiàn)該文件已刪
C>debug
L10000b
db00
169C:0B0045353220202020202020202000000000E52....
169C:0B10000000000000BB8847150200871C0000........G.......
169C:0B2045353320202020202020202000000000E53....
169C:0B300000000000002F8A47150A003B0B0000....../.G...;...
169C:0B4045353420202020202020202000000000E54..
..
169C:0B50000000000000F68D47150D003E290000........G...>)..
169C:0B60E5392020202020202020202000000000.9....
169C:0B700000000000006.....n.G.......
(6)用E命令恢復(fù)字母E
e0b6045
d0b600b6f
169C:0B6045392020202020202020202000000000E9....
(7)修改后寫盤
w10000b
q
(8)可見(jiàn)已恢復(fù)
C>dira:
VolumeindriveAhasnolabel
VolumeSerialNumberis0C6218C9
DirectoryofA:\
E5273031007905:05p
E5328751007905:17p
E54105581007905:47p
E920501007906:03p
E9217441007906:05p
E1020501007906:10p
6file(s)26580bytes
334848bytesfree
例3.8對(duì)于1.2M軟盤引導(dǎo)記錄占1個(gè)扇區(qū),第一文件定位表FAT1占7個(gè)扇區(qū),第二文件定位表FAT2占7個(gè)扇區(qū),根目錄占14個(gè)扇區(qū)。因此可以用L1000020將根目錄讀入內(nèi)存,于是可用例37的方法恢復(fù)已刪除的文件。例如刪除e9再恢復(fù)。
C>dirA:
VolumeindriveAhasnolabel
VolumeSerialNumberis455518E4
DirectoryofA:\
E5273031007905:05p
E5328751007905:17p
E54105581007905:47p
E920501007906:03p
E9217441007906:05p
E1020501007906:10p
6file(s)26580bytes
785920bytesfree
C>debug
L1000020
d1f00
169C:1F0045353220202020202020202000000000E52....
169C:1F10000000000000BB8847150200871C0000........G.......
169C:1F2045353320202020202020202000000000E53....
169C:1F300000000000002F8A47150A003B0B0000....../.G...;...
169C:1F4045353420202020202020202000000000E54..
..
169C:1F50000000000000F68D47150D003E290000........G...>)..
169C:1F6045392020202020202020202000000000E9....
169C:1F700000000000006.....n.G.......
q
C>dela:e9
C>dira:e9
VolumeindriveAhasnolabel
VolumeSerialNumberis455518E4
DirectoryofA:\
Filenotfound
C>debug
-L1000020
-d1f00
169C:1F0045353220202020202020202000000000E52....
169C:1F10000000000000BB8847150200871C0000........G.......
169C:1F2045353320202020202020202000000000E53....
169C:1F300000000000002F8A47150A003B0B0000....../.G...;...
169C:1F4045353420202020202020202000000000E54..
..
169C:1F50000000000000F68D47150D003E290000........G...>)..
169C:1F60E5392020202020202020202000000000.9....
169C:1F700000000000006.....n.G.......
e1f6045
d1f601f6f
169C:1f6045392020202020202020202000000000E9....
-w1000020
-q
C>dira:
VolumeindriveAhasnolabel
VolumeSerialNumberis455518E4
DirectoryofA:\
Filenotfound
E5273031007905:05p
E5328751007905:17p
E54105581007905:47p
E920501007906:03p
E9217441007906:05p
E1020501007906:10p
6file(s)26580bytes
788480bytesfree
例3.9利用DEBUG調(diào)試EXE文件
(1)程序清單及匯編連接步驟
A>typeSAM.ASM
CODESEGMENT
ASSUMECS:CODE
START:MOVDL,33H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
C>MASMSAM;
microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.
51774+401858Bytessymbolspacefree
0warningErrors
0SevereErrors
C>LINKSAM;
Microsoft(R)OverlayLinkerVersion3.60
Copyright(C)MicrosoftCorp19831987.Allrightsreserved.
LINK:warningL4021:nostacksegment
C>SAM
3
C>DEBUGSAM.EXE
G
3
Programterminatednormally
Q
(2)用N命令裝入,用G命令執(zhí)行C>DEBUG
NSAM.EXE
L
R
AX=0000BX=0000CX=000ADX=0000SP=0000BP=0000SI=0000DI=0000
DS=16ADES=16ADSS=16BDCS=16BDIP=0000NVUPEIPLNZNAPONC
16BD:0000B233MOVDL,33
-U16BD:00000008
16BD:0000B233MOVDL33
16BD:0002B402MOVAH,O2
16BD:0004CD21INT21
16BD:0006B44CMOVAH,4C
16BD:0008CD21INT21
G
3
Programterminatednormally
Q
(3)裝入執(zhí)行后,再用T命令單條執(zhí)行
C>DEBUGSMA.EXE
R
AX=0000BX=0000CX=000ADX=0000SP=0000BP=0000SI=0000DI=0000
DS=16ADES=16ADSS=16BDCS=16BDIP=0000NVUPEIPLNZNAPONC
16BD:0000B233MOVDL,33
T=0
AX=0000BX=0000CX=000ADX=0033SP=0000BP=0000SI=0000DI=0000
DS=16ADES=16ADSS=16BDCS=16BDIP=0002NVUPEIPLNZNAPONC
16BD:0002B402MOVAH,02
T
AX=0200BX=0000CX=000ADX=0033SP=0000BP=0000SI=0000DI=0000
DS=16ADES=16ADSS=16BDCS=16BDIP=0004NVUPEIPLNZNAPONC
16BD:0004CD21INT21
G
3
Programterminatednormally
Q
3.4用MASM(或ASM)運(yùn)行匯編語(yǔ)言程序
一個(gè)能經(jīng)MASM(或ASM)匯編后運(yùn)行的匯編語(yǔ)言源程序不同于在DEBUG下運(yùn)行的匯編語(yǔ)言程序。首先在程序的書寫方式上要加上邏輯段的說(shuō)明,而且必須至少有一個(gè)邏輯代碼段。其次一個(gè)書寫正確的源程序必須經(jīng)過(guò)源程序輸入、匯編、連接后產(chǎn)生一個(gè)EXE文件,才能作為DOS的外部命令在DOS下運(yùn)行。小匯編(ASM)下的匯編語(yǔ)言程序可在64KB的內(nèi)存條件下運(yùn)行,且只能有限地使用偽指令。而宏匯編(MASM)下則必須在96KB以上的內(nèi)存條件下運(yùn)行,且可使用各種偽指令。本書中的例子均在MASM下通過(guò)。ASM和MASM的程序運(yùn)行過(guò)程除匯編時(shí)用ASM代替MASM進(jìn)行匯編外,其它步驟完全相同。
3.4.1MASM匯編語(yǔ)言程序的調(diào)試步驟在MASM下調(diào)試運(yùn)行匯編語(yǔ)言程序的步驟如圖3-1所示:
3.4.2典型實(shí)例
下面通過(guò)幾個(gè)典型例子說(shuō)明匯編語(yǔ)言的運(yùn)行步驟。
例3.10在MASM下運(yùn)行與例3.1功能相同的程序,請(qǐng)讀者務(wù)必注意二者在程序結(jié)構(gòu)上的不同和運(yùn)行方式的不同,具體步驟如下:
(1)運(yùn)行環(huán)境的準(zhǔn)備
一張操作系統(tǒng)盤,例如DOS50
一張匯編系統(tǒng)盤,應(yīng)含如下文件:
MASM宏匯編程序文件
LINK連接程序文件
CREF索引程序文件
EDLIN行文本編輯程序
一張已格式化的空盤,用以存儲(chǔ)用戶程序。
準(zhǔn)備好上述3張盤后應(yīng)用DOS盤進(jìn)入DOS
A>
(2)利用任何文本編輯輸入源程序,擴(kuò)展名必須為ASM。本例源程序文件名為SAMASM。
A>typesam.asm
CODESEGMENT
ASSUMECS:CODE
START:MOVDL,33H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(3)匯編
A>masm
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.
Sourcefilename[.ASM]:sam
Objectfilename[sam.OBJ]:
Sourcelisting[NUL.LST]:sam
Crossreference[NUL.CRF]:sam
50698+402934Bytessymbolspacefree
0WarningErrors
0SevereErrors
(4)連接
A>link
Microsoft(R)OverlayLinkerVersion3.60
Copyright(C)MicrosoftCorp19831987.Allrightsreserved.
ObjectModules[.OBJ]:sam
RunFile[SAM.EXE]:
ListFile[NUL.MAP]:sam
Libraries[.LIB]:
LINK:warningL4021:nostacksegment
(5)執(zhí)行
①直接執(zhí)行
A>sam
3
②在DEBUG下執(zhí)行,必須寫全名
A>c:\dos\debug
nsam.exe
1
g
3
Programterminatednormally
q
(6)產(chǎn)生索引表文件并輸出
A>cref
Microsoft(R)CrossReferenceUntilityVersion5.00
Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.
Crossreference[.CRF]:sam
Listing[sam.REF]:
2Symbols
A>typesam.ref
SymbolCrossReference(#definition,+modification)Cref1
CODE..............1#28
START.............3#9
2Symbols
(7)打印LST清單文件和MAP文件如下:
A>typesam.lst
10000CODESEGMENT
2ASSUMECS:CODE
30000B233START:MOVDL,33H
40002B402MOVAH,2
50004CD21INT21H
60006B44CMOVAH,4CH
70008CD21INT21H
8000ACODEENDS
9ENDSTART
SegmentsandGroups:
NameLengthAlignCombineClass
CODE..............000APARANONE
Symbols:
NameTypeValueAttr
START.............LNEAR0000CODE
@FILENAME..........TEXTsam
9SourceLines
9TotalLines
4Symbols
50698+402934Bytessymbolspacefree
0WarningErrors
0SevereErrors
A>TYPESAM.MAP
LINK:WarningL4021:nostacksegment
StartStopLengthNameClass
00000H00009H0000AHCODE
Programentrypointat0000:0000
例311匯編和連接可采取簡(jiǎn)單的辦法。下面是完成與例3.10相同功能的程序的執(zhí)行步驟。設(shè)源程序文件為SAM1.ASM。
(1)用行編輯輸入源程序
A>edlinsam1.asm
Newfile
*i
1:*CODESEGMENT
2:*STARTPROCFAR
3:*ASSUMECS:CODE
4:*PUSHDS
5:*MOVAX,0
6:*PUSHAX
7:*MOVDL,33H
8:*MOVAH,2
9:*INT21H
10:*RET
11:*STARTENDP
12:*CODEENDS
*e
(2)匯編
A>MASMSAM1
Microsoft(R)MacroAssemblerVersion5.10
Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.
50186+410435Bytessymbolspacefree
0warningErrors
0SevereErrors
(3)連接
A>LINKSAM1;
Microsoft(R)SegmentedExecutableLinkerVersion5.01.21
Copyright(C)MicrosoftCorp19841988.Allrightsreserved.
LINK:warningL4021:nostacksegment
(4)執(zhí)行
A>SAM1
3
(5)在DEBUG下執(zhí)行
A>DEBUGSAM1EXE
G
3
Programterminatednormally
Q
A>DEBUGSAM1.EXE
R
AX=0000BX=0000CX=000CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=126EES=126ESS=16127ECS=127EIP=0000NVUPEIPLNZNAPONC
127E:00001EPUSHDS
U127E:010
127E:00001EPUSHDS
127E:0001MOVAX,0000
127E:0004PUSHAX
127E:0005MOVDL,33
127E:0007MOVAH,02
127E:0008INT21
127E:000BRETF
127E:000CINCBX
127E:000DOUT22,AX
127E:000FMOVBX,E743
Q
A>DEBUGSAM1EXE
G=0
3
Programterminatednormally
Q
A>
上例3.10中的匯編連接步驟也可由DOS批命令文件一次完成。方法是首先用行編輯建立如下批命令文件ASSEM.BAT,這里假設(shè)用戶程序在B盤,而MASM及LINK文件在A盤。
A>
A>typeassem.bat
masm%1,,,,;
type%1.1st
erase%1.1st
cref%1;
type%1.ref
erase%1.ref
erase%1.crf
Link%1
然后在DOS提示符下執(zhí)行該批命令。
B>A:ASSEMSAM
3.5用TASM運(yùn)行匯編語(yǔ)言程序
Turbo匯編TASM是Borland公司推出的,可與Microsoft公司的MASM匹配的匯編語(yǔ)言軟件。Turbo匯編語(yǔ)言程序可與TurboC、TurboPASCAL、TurboProlog及TurboBASIC語(yǔ)言程序方便地連接。用TASM調(diào)試匯編語(yǔ)言程序的步驟與MASM下的調(diào)試步驟基本相同。3.5.1TASM匯編語(yǔ)言程序的調(diào)試步驟
在TASM下調(diào)試匯編語(yǔ)言程序的步驟如圖3-2所示:
3.5.2安裝TurboAssembler由于TurboAssembler包含在BorlandC++軟件包中,使用其中的INSTALLEXE程序即可完成安裝。
TurboAssembler除包括TASMEXE,TLINKEXE外,還有下列文件:
·MAKEEXE單獨(dú)運(yùn)行的程序制作實(shí)用程序。多數(shù)程序中都包括許多源文件,這些程序在同其它程序連接之前,程序中的源文件可能有必要通過(guò)預(yù)處理、編譯和其它處理。當(dāng)已修改過(guò)模塊或與模塊相關(guān)的某些程序后,忘記了再編譯將可能導(dǎo)致錯(cuò)誤的發(fā)生,另一方面,你可以重新編譯一遍所有的程序,這是非常安全可靠的,但是非常浪費(fèi)時(shí)間。使用MAKE可以解決這種矛盾,MAKE通過(guò)檢查文件上的描述部分和標(biāo)識(shí)日期部分,識(shí)別哪些文件是經(jīng)過(guò)了修改的,然后調(diào)用其它程序,諸如編譯程序、匯編程序、連接程序和其它實(shí)用程序,生成新的目標(biāo)文件、可執(zhí)行文件,而對(duì)不需要修改的程序不做任何多余的處理??傊甅AKE可對(duì)多個(gè)源文件的程序進(jìn)行維護(hù),有助于大型軟件的開(kāi)發(fā)。在此,對(duì)MAKE的具體操作不作進(jìn)一步的介紹。
·TLIBEXETurbo庫(kù)管理程序,相當(dāng)于MASM中的LIBEXE。
·TCREFEXE相當(dāng)于MASM中的CREF。
·THELPEXETurboAssembler的幫助實(shí)用程序。
·GREFEXE一種文件搜索實(shí)用程序,可以在幾個(gè)文件中快速查找字符串。例如,想看看在哪個(gè)源文件中調(diào)用了setupmodem函數(shù),可以執(zhí)行下面的命令:
C>GREPSetupmodem*.ASM
在當(dāng)前目錄中的所有ASM里查找Setupmodem字符串,若找到則給出相應(yīng)信息。
·OBJXREF.EXE目錄模塊交叉引用實(shí)用程序,可用來(lái)檢查一系列目標(biāo)文件和庫(kù)文件,并生成有關(guān)這些文件內(nèi)容的報(bào)告。一類報(bào)告里列出公用名的定義和對(duì)它們的引用,另一類報(bào)告是列出目標(biāo)模塊定義的段的長(zhǎng)度?!OUCH.EXE在使用MAKE時(shí),若想要強(qiáng)制重編譯或重創(chuàng)建一個(gè)特殊的目標(biāo)文件,而該目標(biāo)文件所依賴的源文件卻沒(méi)有改動(dòng)時(shí),可使用TOUCH來(lái)解決這一問(wèn)題。TOUCH把若干文件的日期和時(shí)間改為當(dāng)前的日期和時(shí)間,這樣,運(yùn)行MAKE就可重編譯或重創(chuàng)建相應(yīng)特殊的目標(biāo)文件。
TOUCH允許DOS的通配符“*”和“?”。
3.5.3使用TASM進(jìn)行匯編
使用TASM進(jìn)行匯編后,必須用TLINK進(jìn)行連接。TASM、TLINK與MASM、LINK的使用方法基本一致,但TASM、TLINK均提供了大量的命令行參數(shù),有助于用戶更好地完成編譯和連接的工作。
鍵入下述命令:
C>TASM/h或
C>TASM/?
你會(huì)看到全屏幕的提示信息,這些信息描述了許多命令行選擇項(xiàng)和用以定義要匯編的文件的語(yǔ)法。屏幕前兩行顯示如下:
TurboAssemblerVersion2.5Copyright(C)1988byBorlandInternational,Inc.
Syntax:TASM[optious]source[,object][,listing][,xref]
第一行為TASM的版本信息,第二行說(shuō)明了TASM命令行選擇項(xiàng)的語(yǔ)法。余下部分為參數(shù)說(shuō)明,參數(shù)(options)項(xiàng)是任選的,以斜杠(“/”)加上參數(shù)表示,比如:
/h,/?Printthishelpscreen
參數(shù)選擇項(xiàng)用以控制匯編方式。至于object文件、listing文件,xref文件均與MASM中的目標(biāo)文件、列表文件、交叉匯編文件一致,其后綴名分別為OBJ、LST、XRF。
TASM允許同時(shí)匯編多個(gè)文件,文件名之間用加號(hào)“+”或空格連接,并且允許使用DOS通配符“*”和“?”。
C>TASM*
表示匯編當(dāng)前目錄下所有
ASM文件。
其常用命令行選擇項(xiàng)簡(jiǎn)要介紹如下:
/a在目標(biāo)文件中按字母順序存放段,在源文件用ALPHA偽指令可完成同樣的功能。
/b為處理兼容性而設(shè)置,不引起任何附加動(dòng)作,對(duì)匯
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 下水井維修合同范本
- 供應(yīng)合同范本長(zhǎng)期
- 2025年吐魯番怎么考貨運(yùn)從業(yè)資格證
- 住宅綠化養(yǎng)護(hù)合同范本
- 醫(yī)療健康服務(wù)合同范本
- 個(gè)體工商退股合同范本
- 助理編輯聘約合同范本
- 蘇州代建合同范本
- 公司改造施工合同范本
- 營(yíng)地臨建合同范本
- 小學(xué)生必背古詩(shī)詞75﹢80首檢測(cè)表
- 財(cái)務(wù)部績(jī)效考核評(píng)分規(guī)則及績(jī)效考核評(píng)分表
- 放射診療設(shè)備清單
- 供應(yīng)鏈中的社會(huì)責(zé)任
- HDPE纏繞-B型結(jié)構(gòu)壁管施工方案
- 早期教育概論(高職學(xué)前教育專業(yè))全套教學(xué)課件
- 《AutoCAD 中文版實(shí)例教程(AutoCAD 2020) (微課版)(第 2 版)》課件 馬連志 第3、4章 基本繪圖操作、高級(jí)繪圖操作
- 幼兒教師職業(yè)道德(高職學(xué)前教育專業(yè))全套教學(xué)課件
- 汽車發(fā)動(dòng)機(jī)構(gòu)造與維修中職PPT完整全套教學(xué)課件
- 養(yǎng)老院管理-考核考評(píng)
- 蘇科版八年級(jí)生物下冊(cè)全冊(cè)完整課件
評(píng)論
0/150
提交評(píng)論