版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章匯編語言的運(yùn)行方式本章從幾個(gè)典型例子出發(fā),通過上機(jī)實(shí)習(xí),引導(dǎo)讀者在DOS下學(xué)會使用DEBUG調(diào)試程序運(yùn)行匯編語言程序;學(xué)會使用宏匯編MASM和Turbo匯編TASM運(yùn)行匯編語言程序。并將系統(tǒng)地介紹
DEBUG的命令,以便在以后各章的學(xué)習(xí)中能夠有一個(gè)熟練的調(diào)試和運(yùn)行手段。使得讀者在進(jìn)入第5章以后能夠一面學(xué)習(xí)匯編指令,一面積累設(shè)計(jì)、調(diào)試和運(yùn)行完整的匯編語言程序的有關(guā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)行匯編語言程序,為以后學(xué)習(xí)重點(diǎn)轉(zhuǎn)移到程序設(shè)計(jì)打下堅(jiān)實(shí)的使用指令編程的基礎(chǔ);熟悉DEBUG的命令使用,為以后的軟件開發(fā)掌握調(diào)試工具,這是因?yàn)镈EBUG除了可運(yùn)行匯編語言程序外,還可以直接用來檢查和修改內(nèi)存單元、裝入、存儲及啟動運(yùn)行程序、檢查及修改寄存器,也就是說DEBUG可深入到計(jì)算機(jī)的基本級,可使用戶更緊密地與計(jì)算機(jī)中真正進(jìn)行的工作相聯(lián)系。然而能在DEBUG下運(yùn)行匯編語言源程序也受到了一些限制,它不宜匯編較長的程序,不便于分塊程序設(shè)計(jì),不便于形成以DOS外部命令形式構(gòu)成的 EXE文件,不能使用浮動地址,也不能使用絕大多數(shù)ASM和MASM提供的偽指令。例3.1在DEBUG下運(yùn)行如下程序:MOVDL,33H;字符3的ASCII碼送DLMOVAH,2;使用DOS的2號功能調(diào)用INT21H;進(jìn)入功能調(diào)用,輸出‘3’INT
20H;BIOS中斷服務(wù)程序正常結(jié)束。該程序運(yùn)行結(jié)果是在顯示器上輸出一個(gè)字符
‘3’。如果要輸出其它字符,請改變程序中
‘33H’為相應(yīng)字符的ASCII碼。其中涉及DOS和BIOS功能調(diào)用。因?yàn)槲覀兪窃贒OS的支持下運(yùn)行匯編語言程序,所以一般情況下,不能輕易使用輸入/輸出指令直接通過端口輸入/輸出,而必須使用DOS內(nèi)部提供的子程序完成輸入/輸
出。DOS功能調(diào)用就是為諸如此類的目的設(shè)置的。DOS功能調(diào)用要求在進(jìn)入INT21H調(diào)用前,首先將功能調(diào)用號,也就是功能種類號送AH寄存器,并依功能號準(zhǔn)備初始數(shù)據(jù)。也就是說INT21H的2號功能調(diào)用是輸出DL寄存器中字符。INT20H是BIOS中斷服務(wù)子程序,這一軟中斷用來正常結(jié)束程序。運(yùn)行步驟:(1)進(jìn)入DEBUG設(shè)C盤上有DEBUG.COM程序,進(jìn)入DOS后鍵入DEBUG〈ENTER〉,即C>DEBUG屏幕顯示:-‘-’號是進(jìn)入DEBUG的提示符,在該提示符下可鍵入任意DEBUG命令?,F(xiàn)在用A命令送程序如下:(2)輸入程序并匯編-A100169C:0100MOVDL,33169C:0102MOVAH,2169C:0104INT21169C:0106INT20169C:0108至此程序已送完,并匯編成機(jī)器指令?,F(xiàn)在用G命令運(yùn)行程序如下:(3)運(yùn)行程序-G3Program
terminated
normally如果現(xiàn)在想看一下機(jī)器指令是什么樣子的話,方法之一是可以用反匯編命令U作如下操作:(4)反匯編-U100,108169C:0100B233MOVDL,33169C:0102B402MOVAH,02169C:0104CD21INT21169C:0106CD20INT20169C:0108(5)寫COM文件-RBX
BX
0000:-RCX
CX
0000:8-N
EXCOM.COM-W送機(jī)器指令程序-E200
B2
33
B4
02
CD
21
CD
20執(zhí)行機(jī)器指令程序-G=2003Pogram
terminated
normally退出DEBUG返回DOS,執(zhí)行EXCOM-QCOM文件C>EXCOM3C>3.2 DEBUG命令DEBUG命令是在DEBUG提示符“-”下,由鍵盤鍵入的。每條命令以單個(gè)字母的命令符開頭,然后是命令的操作參數(shù),操作參數(shù)與操作參數(shù)
之間,用空格或逗號隔開,操作參數(shù)與命令符
之間用空格隔開,命令的結(jié)束符是回車鍵
(ENTER)。命令及參數(shù)的輸入可以是大小寫的結(jié)合。Crtl+Break鍵可中止命令的執(zhí)行。
Crtl+Num
Lock鍵可暫停屏幕卷動,按任一鍵繼續(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〈長度〉。 功能:從〈源地址范圍〉的起始地址單元起逐個(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碼字符,對不可見字符以‘·’代替。
其中(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ù),或用引號′或″括起來的字符串;〈單元內(nèi)容表〉是以逗號分隔的十六進(jìn)制數(shù),或用′或″括起來的字符串,或者是二者的組合。
功能:(1)將指定內(nèi)容寫入指定單元后顯示下一地址,可連續(xù)鍵入修改內(nèi)容,直至新地址出現(xiàn)后鍵入回車〈ENTER〉止。
(2)將〈單元內(nèi)容表〉逐一寫入由〈地址〉開始的一片單元。3.2.5填充內(nèi)存命令F格式:F〈范圍〉〈單元內(nèi)容表〉
功能:將單元內(nèi)容表中的值逐個(gè)填入指定范圍,單元內(nèi)容表中內(nèi)容用完后重復(fù)使用。例如:F
5BC:200
L
10
B2,′XYZ′,3C3.2.6執(zhí)行命令C格式:(1)G(2)G=〈地址〉(3)G=〈地址〉,〈斷點(diǎn)〉功能:(1)從CS∶IP開始執(zhí)行(2)從指定地址開始執(zhí)行(3)從指定地址開始執(zhí)行,到斷點(diǎn)自動停止。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)容顯示出來。3.2.9讀盤命令L格式:L〈地址〉〈盤號〉〈起始邏輯扇區(qū)〉〈所讀扇區(qū)個(gè)數(shù)n〉
其中〈地址〉的缺省值為CS∶100。邏輯扇區(qū)可由物理扇區(qū)號換算得到,以雙面雙密度盤為例:物理扇區(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ū)號的對應(yīng)關(guān)系為物理扇區(qū)
0面0道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號為0~8;物理扇區(qū)1面0道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號為9~11H;物理扇區(qū)0面1道1扇區(qū)至9扇區(qū),邏輯扇
區(qū)號為12~1AH……這樣每道先0面后1面一直
其中〈盤號〉為0、1或2,0表示A盤,1表示B盤,2表示硬盤。
功能:將〈盤號〉指定的盤上,從〈起始邏輯扇區(qū)〉起,共n個(gè)邏輯扇區(qū)上的所有字節(jié)順序讀入指定內(nèi)存地址的一片連續(xù)單元。當(dāng)L后的參數(shù)缺省時(shí),必須在L之前由N命令指定(或進(jìn)入DEBUG時(shí)一并指出)所讀盤文件名。此時(shí)L執(zhí)行后將該文件裝入內(nèi)存。例如:N
EXAMPLEL將當(dāng)前盤上的EXAMPLE文件裝入CS:100起始的一片內(nèi)存單元。3.2.10內(nèi)存搬家命令M格式:M
〈源地址范圍〉 〈目標(biāo)起始地址〉其中源及目標(biāo)地址若僅輸入偏移量,則隱含相對DS。功能:把〈源地址范圍〉中的內(nèi)容順序搬至〈目標(biāo)起始地址〉起的一片連續(xù)單元。例如:M
CS:100
110
600把從CS∶100起至CS∶110止17個(gè)字節(jié)搬至
DS∶600至DS∶610的一片單元。3.2.11命名待讀文件命令N格式:N文件名說明功能:為L命令指定待裝入文件注:其它形式參考DOS手冊3.2.12端口輸出命令O格式:O 〈端口地址〉 〈字節(jié)〉
功能:將該〈字節(jié)〉從指定〈端口地址〉輸出。例如:O
2F
4F將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í)行的下一指令的地址、代碼及匯編語句形式。其中對狀態(tài)標(biāo)志FLAG以每位的形式顯示,詳見表3-1。表3-1狀態(tài)標(biāo)志顯示形式標(biāo)志位狀態(tài)顯示形式溢出標(biāo)志OF有/無OV/NV方向標(biāo)志DF減/增DN/UP中斷標(biāo)志IF開/關(guān)EI/DI符號標(biāo)志SF負(fù)/正NG/PL零標(biāo)志ZF零/非ZR/NZ輔助標(biāo)志AF有/無AC/NA奇偶標(biāo)志PF偶/奇PE/PO進(jìn)位標(biāo)志CF有/無CY/NC(2)顯示指定存儲器內(nèi)容例如:R
AXR
F3.2.15搜索指定內(nèi)存命令S格式:S 〈地址范圍〉 〈表〉
功能:在指定范圍搜索表中內(nèi)容,找到后顯示表中元素所在地址例如:S CS:100
110
41顯示04BA:010404BA:010D表示在位移100H至110H間的上述兩處有41H。又如:S CS:100L
11
41
″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)T
10 從當(dāng)前指令始執(zhí)行10H條指令3.2.17反匯編命令U格式:(1)U〈地址〉(2)U〈地址范圍〉
功能:將指定范圍內(nèi)的代碼以匯編語句形式顯示,同時(shí)顯示地址及代碼。注意,反匯編時(shí)一定確認(rèn)指令的起始地址后再作,否則將得不到正確結(jié)果。地址及范圍的缺省值是上次U指令后下一地址的值。這樣可以連續(xù)反匯編。3.2.18寫盤命令W 格式:W 〈地址〉 〈盤號〉 〈起始邏輯扇區(qū)〉 〈所寫邏輯扇區(qū)數(shù)n〉 功能:與L命令不同的地方是將內(nèi)存〈地址〉起始的一片單元內(nèi)容寫入指定扇區(qū)。只有W而沒有參數(shù)時(shí),與N命令配合使用寫盤文件。3.3
DEBUG命令綜合使用例例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í)行該程序G3Program
terminated
normally(3)用U命令反匯編-U100
1081392:0100
B233MOV
DL,331392:0102B402MOVAH,021392:0104CD21INT211392:0106CD20INT201392:010861DB61(4)用D命令顯示內(nèi)存
D100
1081392:0100
B2
33
B4
02
CD
21CD
20
61.3...!.
a例3.3進(jìn)入DEBUG,先顯示200H處開始的一片單元,接著用E命令,將一段機(jī)器代碼指令(就是上面的一段小程序)寫入200~208H,然后執(zhí)行,再用U命令反匯編。A>DEBUGD2001392: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!.@.!.@.!用E命令把代碼指令寫入內(nèi)存E200
B2
33
B4
02
CD
21
CD
20
1B用G命令從200H開始執(zhí)行
G=2003Program
terminated
normally(3)用U命令反匯編-U200
2081392: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>DEBUGA1001392:0100MOVAH,31392:0102MOVAL,21392:0104ADDAL,AH1392:0106INT201392:0108(2)用R命令顯示寄存器狀態(tài)RAX=0000BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0100 NV
UP
EI
PL
NZ
NA
PO
NC1392:0100
B403
MOV
AH,03(3)用T命令單條執(zhí)行TAX=0300BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0102NV
UP
EIPL
NZ
NAPO
NC1392:0102
B002MOVAL,02TAX=0302BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0104NV
UP
EIPL
NZ
NAPO
NC1392:0104
00E0ADDAL,AH(4)結(jié)果在AL中(AL)=5TAX=0305SP=0000DS=1392IP=0106BX=0000BP=0000ES=1392NV
UP
EICX=0000SI=0000SS=1392PL
NZ
NADX=0000DI=0000CS=1392PO
NC1392:0106CD02
INT20TAX=0305BX=0000
CX=0000DX=0000SP=0000BP=0000
SI=0000
DI=0000DS=1392ES=1392
SS=1392
CS=011CIP=1094NV
UP
DI
PL
NZ
NA
PO
NC011C:109490NOP用G命令接著執(zhí)行 GProgram
terminated
normally退出QA>例3.5除以前接觸過的命令外,下面還使用了整片搬家命令M,以及比較一片內(nèi)存單元與另一片內(nèi)存單元內(nèi)容的命令C。(1)進(jìn)入DEBUG,顯示100H至110H內(nèi)容
A>DEBUGD100
11061
031392:0100
0F
00
B9
8A
FF
F3
AE
471F
8B
C3
48
12
B1
.......Ga....H..1392:0110
04用F命令將31H裝入100H至110H F100
110
31用D顯示100H至117HD100
1171392:0100
31
31
31
31
31
31
31
31 31
31
31
31
31
31
31
311392:0110
31
8B
C6
F7
0AD0D311111111111111111.......(4)用E命令修改105H至108H的內(nèi)容E105
61,61,62,63(5)用D命令顯示100H至110H的內(nèi)容D1001101392:0100
31
311392:0110
3131
31
31
61
61
6263
31
31
31
31
31
31
31
11111aabc11111111(6)用M命令將100H至110H的內(nèi)容復(fù)制到
200H至210HM100
110
200(7)用D命令顯示200H至210H的內(nèi)容D2002101392:0200
31
311392:0210
3131
31
31
61
61
6263
31
31
31
31
31
31
31
11111aabc11111111(8)用E命令修改201H,202H,203H,20DH,20EH,20FH內(nèi)容E201323134E20D414243(9)用D命令顯示200H至210H內(nèi)容及100H至110H內(nèi)容D2002101392:0200
31
3231
34
316161626331313131414243
12141aabc1111ABC1392:0210
311D1001101392:0100
31
311392:0110
3131
31
316161626331313131313131
11111aabb11111111(10)用C命令比較100H至110H與200H至210H的內(nèi)容,并顯示二者不一致的部分-C100
110
2001392:01031321392:02011392:010331341392:02031392:010D31411392:020D1392:010E31421392:020E1392:010F31421392:020F-QA>例3.6 以下是使用E命令和S命令的例子。E300′ABCDEFG′D300
3061392:0300
41
42
43
44
45
46
47ABCDEFGE310
1234′″D310
3151392:0310
27
31
32
33
34
27E320
31
32
33
41
42
43D320
3251392:0320
31
32
33
41
42
43′1234′123ABCS300
306
′D′1392:0303S310
315
′D′S310
315
′3′1392:0313S310
315
′1392:03101392:0315D310
3251392:0310
27
31
32
33
34
27
22
1341
AF
21
13
41
AF
21
13
′1234′″.A.!.A.!.1392:0320
31
32
33
41
42
43Q123ABC例3.7 以下用L命令將A盤目錄讀入內(nèi)存。因?yàn)閷﹄p面雙密軟盤,盤目錄區(qū)在0道0面6扇區(qū),而L100
0
0 B是將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)存,顯示出可見文件名E9的目錄項(xiàng)還在,但E字母處已變?yōu)镋5H,這是文件已刪標(biāo)志?,F(xiàn)用E命令修改它仍為E字母的ASCII碼45H,并用W命令記盤可見文件已恢復(fù)。(1)進(jìn)入DEBUG前先顯示A盤目錄C>dirVolumea:indriveAhasnolabelVolume
SerialNumberis0C6218C9Directory
ofA:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580bytes331776
bytes
free(2)進(jìn)入DEBUG,并用L命令將A盤上0扇區(qū)起共11個(gè)邏輯扇區(qū)讀入內(nèi)存169C:0100起始一片單元C>debugL
100
0
0
b(3)顯示0B00起始的內(nèi)存內(nèi)容
db00169C:0B0045353220202020202020202000000000E52....169C:0B10000000000000BB8847150200871C0000........G.......169C:0B2045353320202020202020202000000000E53....169C:0B300000000000002F8A47150A003B0B0000....../.G...;...169C:0B4045353420202020202020202000000000E54....169C:0B50000000000000F68D47150D003E290000........G...>)..169C:0B6045392020202020202020202000000000E9....169C:0B700000000000006.....n.G.......-d169C:0B8045393220202020202020202000000000E92....169C:0B90000000000000BB9047151B0000060000........G.......169C:0BA045313020202020202020202000000000E10....169C:0BB0000000000000469147151D0002080000......F.G.......169C:0BC000000000000000000000000000000000................169C:0BD000000000000000000000000000000000................169C:0BE000000000000000000000000000000000................169C:0BF000000000000000000000000000000000................-qC>18C9(4)刪除文件e9C>C>erase
a:e9C>dir
a:e9Volume
in
drive
A
has
no
labelVolume
Serial
Number
is
0C62Directory
of
A:\File
not
found(5)進(jìn)入DEBUG并用L再讀盤,用D命令顯示,可見該文件已刪C>debugL
100
0
0
bdb00169C:0B0045353220202020202020202000000000E52....169C:0B10000000000000BB8847150200871C0000........G.......169C:0B2045353320202020202020202000000000E53....169C:0B300000000000002F8A47150A003B0B0000....../.G...;...169C:0B4045353420202020202020202000000000E54....169C:0B50000000000000F68D47150D003E290000........G...>)..169C:0B60E5392020202020202020202000000000.9....169C:0B700000000000006.....n.G.......(6)用E命令恢復(fù)字母Ee0b60
45d0b60
0b6f169C:0B604539202020202020(7)修改后寫盤
w
100
0
0
bq2020202000000000E9....(8)可見已恢復(fù)C>dirVolumea:indriveAhasnolabelVolume
SerialNumberis0C6218C9Directory
ofA:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580
bytes334848
bytes
free例3.8 對于1.2M軟盤引導(dǎo)記錄占1個(gè)扇區(qū),第一文件定位表FAT1占7個(gè)扇區(qū),第二文件定位表FAT2占7個(gè)扇區(qū),根目錄占14個(gè)扇區(qū)。因此可以用L1000020將根目錄讀入內(nèi)存,于是可用例3 7的方法恢復(fù)已刪除的文件。例如刪除e9再恢復(fù)。18E4C>dir
A:Volume
in
drive
A
has
no
labelVolume
Serial
Number
is
4555Directory
of
A:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580
bytes785920
bytes
freeC>debugL100
0020d1f00169C:1F0045353220202020202020202000000000E52....169C:1F10000000000000BB8847150200871C0000........G.......169C:1F2045353320202020202020202000000000E53....169C:1F300000000000002F8A47150A003B0B0000....../.G...;...169C:1F4045353420202020202020202000000000E54....169C:1F50000000000000F68D47150D003E290000........G...>)..169C:1F6045392020202020202020202000000000E9....169C:1F700000000000006.....n.G.......18E4qC>del
a:e9C>dir
a:e9Volume
in
drive
A
has
no
labelVolume
Serial
Number
is
4555Directory
of
A:\File
not
foundC>debug-L
100
0
0
20-d1f00169C:1F0045353220202020202020202000000000E52....169C:1F10000000000000BB8847150200871C0000........G.......169C:1F2045353320202020202020202000000000E53....169C:1F300000000000002F8A47150A003B0B0000....../.G...;...169C:1F4045353420202020202020202000000000E54....169C:1F50000000000000F68D47150D003E290000........G...>)..169C:1F60E5392020202020202020202000000000.9....169C:1F700000000000006.....n.G.......e1f60
45d1f60
1f6f169C:1f60
45
39
20
20
20
20
20
20-w
100
0
0
20-q20
20
20
20
00
00
00
00
E9....18E4C>dir
a:Volume
in
drive
A
has
no
labelVolume
Serial
Number
is
4555Directory
of
A:\File
not
foundE5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580
bytes788480
bytes
free例3.9 利用DEBUG調(diào)試 EXE文件(1)程序清單及匯編連接步驟A>type
SAM.ASMCODESEGMENTASSUME
CS:CODEMOV
DL,33HMOV
AH,2INT
21HMOV
AH,4CHINT
21HENDSEND
STARTSTART:CODEC>MASM
SAM;microsoft(R)Macro
AssemblerVersion5.00Copyright(C)Microsoft
Corp19811985,1987.All
rights
reserved.51774+401858
Bytes
symbol
space
free0
warning
Errors0
Severe
ErrorsC>LINK
SAM;Microsoft
(R)
Overlay
Linker
Version3.60Copyright
(C)
Microsoft
Corp
1983
1987.All
rights
reserved.LINK:warning
L4021:no
stack
segmentC>SAM3C>DEBUG
SAM.EXEG3Program
terminated
normallyQ(2)用N命令裝入,用G命令執(zhí)行C>DEBUGN
SAM.EXELRAX=0000
BX=0000
CX=000A
DX=0000
SP=0000
BP=0000SI=0000
DI=0000DS=16AD
ES=16AD
SS=16BD
CS=16BD
IP=0000
NV
UP
EIPL
NZ
NA
PO
NCMOV
DL,3316BD:0000
B233-U16BD:0000
000816BD:0000
B23316BD:0002
B40216BD:0004
CD2116BD:0006
B44C16BD:0008
CD21G3MOV
DL33MOV
AH,O2INT
21MOV
AH,4CINT
21Program
terminated
normallyQ(3)裝入執(zhí)行后,再用T命令單條執(zhí)行C>DEBUG
SMA.EXERBX=0000
CX=000A
DX=0000
SP=0000
BP=0000
SI=0000ES=16AD
SS=16BD
CS=16BD
IP=0000
NV
UP
EI
PL
NZAX=0000DI=0000DS=16ADNA
PO
NC16BD:0000
B233
MOV
DL,33T=0BX=0000
CX=000A
DX=0033
SP=0000
BP=0000
SI=0000AX=0000DI=0000DS=16ADNA
PO
NCES=16AD
SS=16BD
CS=16BD
IP=0002
NV
UP
EI
PL
NZ16BD:0002
B402
MOV
AH,02TBX=0000
CX=000A
DX=0033
SP=0000
BP=0000
SI=0000AX=0200DI=0000DS=16ADNA
PO
NCES=16AD
SS=16BD
CS=16BD
IP=0004
NV
UP
EI
PL
NZ16BD:0004
CD21G3INT
21Program
terminated
normallyQ3.4用MASM(或ASM)運(yùn)行匯編語言程序一個(gè)能經(jīng)MASM(或ASM)匯編后運(yùn)行的匯編語言源程序不同于在DEBUG下運(yùn)行的匯編語言程序。首先在程序的書寫方式上要加上邏輯段的說明,而且必須至少有一個(gè)邏輯代碼段。其次一個(gè)書寫正確的源程序必須經(jīng)過源程序輸入、匯編、連接后產(chǎn)生一個(gè)
EXE文件,才能作為DOS的外部命令在DOS下運(yùn)行。小匯編(ASM)下的匯編語言程序可在64KB的內(nèi)存條件下運(yùn)行,且只能有限地使用偽指令。而宏匯編(MASM)下則必須在96KB以上的內(nèi)存條件下運(yùn)行,且可使用各種偽指令。本書中的例子均在MASM下通過。ASM和MASM的程序運(yùn)行過程除匯編時(shí)用ASM代替MASM進(jìn)行匯編外,其它步驟完全相同。3.4.1 MASM匯編語言程序的調(diào)試步驟在MASM下調(diào)試運(yùn)行匯編語言程序的步驟如圖3-1所示:3.4.2
典型實(shí)例下面通過幾個(gè)典型例子說明匯編語言的運(yùn)行步驟。例3.10 在MASM下運(yùn)行與例3.1功能相同的程序,請讀者務(wù)必注意二者在程序結(jié)構(gòu)上的不同和運(yùn)行方式的不同,具體步驟如下:(1)運(yùn)行環(huán)境的準(zhǔn)備一張操作系統(tǒng)盤,例如DOS
5
0一張匯編系統(tǒng)盤,應(yīng)含如下文件:MASMLINKCREFEDLIN宏匯編程序文件連接程序文件
索引程序文件
行文本編輯程序一張已格式化的空盤,用以存儲用戶程序。準(zhǔn)備好上述3張盤后應(yīng)用DOS盤進(jìn)入DOSA>(2)
利用任何文本編輯輸入源程序,擴(kuò)展名必須為 ASM。本例源程序文件名為SAM ASM。A>type
sam.asmCODESEGMENTASSUME
CS:CODESTART:
MOV
DL,33HMOV
AH,2INT
21HMOV
AH,4CHINT
21HCODEENDSEND
START(3)
匯編A>masmMicrosoft
(R)
Macro
Assembler
Version5.00Copyright
(C)
Microsoft
Corp
19811985,1987.All
rights
reserved.Source
filename
[.ASM]:samObject
filename
[sam.OBJ]:Source
listing
[NUL.LST]:samCross reference
[NUL.CRF]:sam50698+402
934
Bytes
symbol
space
free0
Warning
Errors0
Severe
Errors(4)連接
A>linkMicrosoft
(R)
Overlay
Linker
Version3.601987.Copyright
(C)
Microsoft
Corp
1983All
rights
reserved.Object
Modules
[.OBJ]:samRun
File
[SAM.EXE]:List
File
[NUL.MAP]:samLibraries
[.LIB]:LINK:warning
L4021:no
stack
segment(5)執(zhí)行①直接執(zhí)行
A>sam3②在DEBUG下執(zhí)行,必須寫全名
A>c:\dos\debugn
sam.exe1g3Program
terminated
normallyqReference
Untility
Version(6)產(chǎn)生索引表文件并輸出A>crefMicrosoft
(R)
Cross5.00Copyright
(C)
Microsoft
Corp
1981
1985,1987.Allrights
reserved.Cross reference
[.CRF]:samListing
[sam.REF]:2
SymbolsA>type
sam.refSymbol
Cross
Reference(#definition,+modification)
Cref
1CODE.
.
.
.
.
.
.
.
.
.
.
.
.
.
1#298START.
.
.
.
.
.
.
.
.
.
.
.
.
3#2
Symbols(7)打印 LST清單文件和 MAP文件如下:A>type
sam.lst1
00002CODE
SEGMENTASSUME
CS:CODE3
0000B233START:MOV
DL,33H4
0002B402MOVAH,25
0004CD21INT21H6
0006B44CMOVAH,4CH7
0008CD21INT21H8
000ACODEENDSEND
START9Segments
and
Groups:N
a
m
e000ALength
Align
Combine
ClassPARA
NONECODE..............Symbols:Value
AttrCODESTART.............N
a
m
eL
NEARType0000TEXT
sam@FILENAME..........9
Source
Lines9
Total
Lines4
Symbols50698+402934
Bytes
symbol
space
free0
Warning
Errors0
Severe
ErrorsA>TYPE
SAM.MAPLINK:Warning
L4021:no
stacksegmentStart
Stop
Length
NameClass00000H
00009H
0000AH
CODEProgram
entry
point
at
0000:0000例3
11 匯編和連接可采取簡單的辦法。下面是完成與例3.10相同功能的程序的執(zhí)行步驟。設(shè)源程序文件為SAM1.ASM。(1) 用行編輯輸入源程序A>edlin
sam1.asmNew
file*i1:* CODE
SEGMENT2:* START
PROC
FAR3:* ASSUME
CS:CODE4:* PUSH
DS5:* MOV
AX,06:* PUSH
AX7:* MOV
DL,33H8:* MOV
AH,29:* INT
21H10:*
RET11:*START
ENDP12:*CODE
ENDS*e(2)匯編A>MASM
SAM1Microsoft
(R)
Macro
Assembler
Version5.10Copyright
(C)
Microsoft
Corp1981,1988.All
rights
reserved.50186+410435
Bytes
symbol
space
free0
warning
Errors0
Severe
Errors(3)連接A>LINK
SAM1;Microsoft
(R)
SegmentedLinker
Version
5.01.21ExecutableCopyright
(C)
Microsoft
Corp
19841988.All
rights
reserved.LINK:warning
L4021:no
stack
segment(4)執(zhí)行A>SAM13(5)在DEBUG下執(zhí)行A>DEBUGGSAM1
EXE3Programterminated
normallyQA>DEBUGSAM1.EXERAX=0000BX=0000
CX=000C DX=0000
SP=0000
BP=0000
SI=0000DI=0000DS=126EES=126E
SS=16127E
CS=127E
IP=0000
NV
UP
EI
PL
NZNA
PO
NC127E:0000
1EPUSH
DSU127E:0
10127E:00001EPUSHDS127E:0001MOVAX,0000127E:0004PUSHAX127E:0005MOVDL,33127E:0007MOVAH,02127E:0008INT21127E:000BRETF127E:000CINCBX127E:000DOUT22,AX127E:000FMOVBX,E743QA>DEBUG
SAM1
EXEG=03Program
terminated
normallyQA>上例3.10中的匯編連接步驟也可由DOS批命令文件一次完成。方法是首先用行編輯建立如下批命令文件ASSEM.BAT,這里假設(shè)用戶程序在B盤,而MASM及LINK文件在A盤。A>A>type
assem.batmasm
%1,,,,;type
%1.1sterase
%1.1stcref
%1;type
%1.referase
%1.referase
%1.crfLink
%1然后在DOS提示符下執(zhí)行該批命令。B>A:ASSEM
SAM用TASM運(yùn)行匯編語言程序Turbo匯編TASM是Borland公司推出的,可與
Microsoft公司的MASM匹配的匯編語言軟件。
Turbo匯編語言程序可與Turbo
C、TurboPASCAL、Turbo
Prolog及Turbo
BASIC語言程序方便地連接。用TASM調(diào)試匯編語言程序的步驟與MASM下的調(diào)試步驟基本相同。TASM匯編語言程序的調(diào)試步驟在TASM下調(diào)試匯編語言程序的步驟如圖3-2所示:3.5.2
安裝Turbo
Assembler由于Turbo
Assembler包含在Borland
C++軟EXE程序即可完件包中,使用其中的INSTALL成安裝。Turbo
Assembler除包括TASM外,還有下列文件:EXE,TLINK
EXE·MAKE
EXE單獨(dú)運(yùn)行的程序制作實(shí)用程序。多數(shù)程序中都包括許多源文件,這些程序在同其它程序連接之前,程序中的源文件可能有必要通過預(yù)處理、編譯和其它處理。當(dāng)已修改過模塊或與模塊相關(guān)的某些程序后,忘記了再編譯將可能導(dǎo)致錯誤的發(fā)生,另一方面,你可以重新編譯一遍所有的程序,這是非常安全可靠的,但是非常浪費(fèi)時(shí)間。使用MAKE可以解決這種矛盾,MAKE通過檢查文件上的描述部分和標(biāo)識日期部分,識別哪些文件是經(jīng)過了修改的,然后調(diào)用其它程序,諸如編譯程序、匯編程序、連接程序和其它實(shí)用程序,生成新的目標(biāo)文件、可執(zhí)行文件,而對不需要修改的程序不做任何多余的處理??傊?/p>
MAKE可對多個(gè)源文件的程序進(jìn)行維護(hù),有助于大型軟件的開發(fā)。在此,對MAKE的具體操作不作進(jìn)一步的介紹。·TLIB
EXE Turbo庫管理程序,相當(dāng)于MASM中的LIB EXE。相當(dāng)于MASM中的CREF。Turbo
Assembler的幫助實(shí)用程·TCREF
EXE·THELP
EXE序?!REF
EXE一種文件搜索實(shí)用程序,可以在幾個(gè)文件中快速查找字符串。例如,想看看在哪個(gè)源文件中調(diào)用了setupmodem函數(shù),可以執(zhí)行下面的命令:C>GREP
Setupmodem
*.ASM在當(dāng)前目錄中的所有 ASM里查找Setupmodem字符串,若找到則給出相應(yīng)信息?!BJXREF.EXE
目錄模塊交叉引用實(shí)用程序,可用來檢查一系列目標(biāo)文件和庫文件,并生成有關(guān)這些文件內(nèi)容的報(bào)告。一類報(bào)告里列出公用名的定義和對它們的引用,另一類報(bào)告是列出目標(biāo)模塊定義的段的長度?!OUCH.EXE在使用MAKE時(shí),若想要強(qiáng)制重編譯或重創(chuàng)建一個(gè)特殊的目標(biāo)文件,而該目標(biāo)文件所依賴的源文件卻沒有改動時(shí),可使用TOUCH來解決這一問題。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/?你會看到全屏幕的提示信息,這些信息描述了許多命令行選擇項(xiàng)和用以定義要匯編的文件的語法。屏幕前兩行顯示如下:Turbo
Assembler
Version
2.5
Copyright
(C)1988
by
Borland
International,
Inc.Syntax:TASM
[optious]source
[,object][,listing][,xref]第一行為TASM的版本信息,第二行說明了TASM命令行選擇項(xiàng)的語法。余下部分為參數(shù)說明,參數(shù)(options)項(xiàng)是任選的,以斜杠(“/”)加上參數(shù)表示,比如:/h,/?Print
this
help
screen參數(shù)選擇項(xiàng)用以控制匯編方式。至于object文件、listing文件,xref文件均與MASM中的目標(biāo)文件、列表文件、交叉匯編文件一致,其后綴名分別為 OBJ、 LST、 XRF。TASM允許同時(shí)匯編多個(gè)文件,文件名之間用加號“+”或空格連接,并且允許使用DOS通配符
“*”和“?”。C>TASM
*表示匯編當(dāng)前目錄下所有 ASM文件。其常用命令行選擇項(xiàng)簡要介紹如下:/a 在目標(biāo)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲洗碗外包工程合同樣本3篇
- 二零二五年度新型海洋運(yùn)輸合同保險(xiǎn)險(xiǎn)別及理賠流程3篇
- 2025版離婚房產(chǎn)分割與購房款分期支付合同范本4篇
- 二零二五版家用節(jié)電器銷售代理合同規(guī)范3篇
- 蘭州外語職業(yè)學(xué)院《消防工程施工技術(shù)與組織》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度離婚協(xié)議書模板定制與婚姻財(cái)產(chǎn)評估合同3篇
- 專業(yè)幕墻工程勞務(wù)承包合同(2024)版B版
- 二零二五白酒銷售顧問品牌宣傳與推廣協(xié)議2篇
- 2025年度光伏發(fā)電項(xiàng)目勞務(wù)分包與電站運(yùn)營合同4篇
- 2025年私人房產(chǎn)轉(zhuǎn)讓協(xié)議書(含裝修標(biāo)準(zhǔn)細(xì)則)3篇
- 課題申報(bào)書:大中小學(xué)鑄牢中華民族共同體意識教育一體化研究
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國典當(dāng)行業(yè)發(fā)展前景預(yù)測及融資策略分析報(bào)告
- 《乘用車越野性能主觀評價(jià)方法》
- 幼師個(gè)人成長發(fā)展規(guī)劃
- 2024-2025學(xué)年北師大版高二上學(xué)期期末英語試題及解答參考
- 批發(fā)面包采購合同范本
- 乘風(fēng)化麟 蛇我其誰 2025XX集團(tuán)年終總結(jié)暨頒獎盛典
- 2024年大數(shù)據(jù)分析公司與中國政府合作協(xié)議
- 一年級數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)匯編
評論
0/150
提交評論