匯編語言的運(yùn)行方式_第1頁
匯編語言的運(yùn)行方式_第2頁
匯編語言的運(yùn)行方式_第3頁
匯編語言的運(yùn)行方式_第4頁
匯編語言的運(yùn)行方式_第5頁
已閱讀5頁,還剩109頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論