匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩164頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一章匯編語(yǔ)言程序設(shè)計(jì)的實(shí)驗(yàn)環(huán)境及實(shí)

驗(yàn)步驟

知識(shí)提要:

本章主要進(jìn)行匯編語(yǔ)言實(shí)驗(yàn)環(huán)境及實(shí)驗(yàn)步驟,涉及到的知識(shí)點(diǎn)包括:

1、匯編語(yǔ)言源程序編寫好以后,

(1)編輯源程序(生成.ASM

(2)匯編源程序(.ASM-.OBJ

(3)連接目標(biāo)程序(.OBJf.EXE

(4)調(diào)試可執(zhí)行程序(使用調(diào)試程序Debug調(diào)試生成的.EXE文件)

(5)運(yùn)行程序輸出結(jié)果。

2、Windows環(huán)境下的匯編語(yǔ)言集成編程環(huán)境的使用

實(shí)驗(yàn)一DOS環(huán)境下的匯編語(yǔ)言編程環(huán)境使用(基礎(chǔ)與驗(yàn)證

型)

一'實(shí)驗(yàn)要求和目的

1、掌握匯編語(yǔ)言程序設(shè)計(jì)的基本方法和技能;

2、熟練掌握使用全屏幕編輯程序EDIT編輯匯編語(yǔ)言源程序;

3、熟練掌握宏匯編程序MASM的使用;

4、熟練掌握連接程序LINK的使用。

二'軟硬件環(huán)境

1、硬件環(huán)境:微機(jī)CPU486以上,500MB以上硬盤,32M以上內(nèi)存;

2、軟件環(huán)境:裝有MASM5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應(yīng)

用程序。

三、實(shí)驗(yàn)涉及的主要知識(shí)單元

1、匯編語(yǔ)言源程序的匯編過(guò)程

匯編語(yǔ)言源程序的匯編過(guò)程是是利用匯編程序(MASM)對(duì)已編輯好的源程序文件

(.ASM)進(jìn)行匯編,將源程序文件中以ASCH碼表示的助記符指令逐條翻譯成機(jī)器碼指

令,并完成源程序中的偽指令所指出的各種操作,最后可以建立3個(gè)文件:擴(kuò)展名為.OBJ

的目標(biāo)文件、擴(kuò)展名為.LST的列表文件和擴(kuò)展名為.CRF的交叉索引文件。目標(biāo)文件是

必須建立的,它包含了程序中所有的機(jī)器碼指令和偽指令指出的各種有關(guān)信息,但該文件

中的操作數(shù)地址還不是內(nèi)存的絕對(duì)地址,只是一個(gè)可浮動(dòng)的相對(duì)地址。列表文件(.LST)

中包含了源程序的全部信息(包括注釋)和匯編后的目標(biāo)程序,列表文件可以打印輸出,可

供調(diào)試檢查用。交叉索引文件(.CRF)是用來(lái)了解源程序中各符號(hào)的定義和引用情況

的。.LST和.CRF兩個(gè)文件不是必須建立的,可有有無(wú),可以通過(guò)匯編時(shí)的命令加以選擇。

在對(duì)源程序文件(ASM文件)匯編時(shí),匯編程序?qū)?duì)ASM文件進(jìn)行兩遍掃描,若程序

文件中有語(yǔ)法錯(cuò)誤,則結(jié)束匯編,匯編程序?qū)⒅赋鲈闯绦蛑写嬖诘腻e(cuò)誤,這時(shí)應(yīng)返回編輯

環(huán)境修改源程序中的錯(cuò)誤,再經(jīng)過(guò)匯編,直到最后得到無(wú)錯(cuò)誤的目標(biāo)程序,即OBJ文件。

因此,匯編程序的主要功能可以概括為以下三點(diǎn):(1)檢查源程序中的語(yǔ)法錯(cuò)誤,并給出

錯(cuò)誤信息;(2)產(chǎn)生目標(biāo)程序文件(OBJ文件),并可給出列表文件(.LST文件);(3)展開(kāi)宏

指令。

匯編程序是系統(tǒng)提供的用于匯編的系統(tǒng)軟件,目前常用的匯編程序有Microsoft公司

推出的宏匯編程MASM(MACROASSEMBLER)和BORLAND公司推出的TASM(TURBOASSEMBLER)

兩種。Microsoft公司推出有宏匯編程序MASM和小匯編程序ASM兩種,二者的區(qū)別在于:

MASM有宏處理功能,而ASM沒(méi)有宏處理功能,因此,MASM比ASM的功能強(qiáng)大,但

MASM需要占據(jù)較大的內(nèi)存空間,當(dāng)內(nèi)存空間較小時(shí)(如64KB),只能使用ASM。

2、目標(biāo)程序的連接過(guò)程

匯編后產(chǎn)生的目標(biāo)程序(OBJ文件)并不是可執(zhí)行程序文件(EXE文件),還不能直接運(yùn)

行,它必須通過(guò)連接程序(LINK)連接成一個(gè)可執(zhí)行程序后才能運(yùn)行。連接程序進(jìn)行連接

時(shí),其輸入有兩個(gè)部分:一是目標(biāo)文件(.OBJ),目標(biāo)文件可以是一個(gè)也可以是多個(gè),可以

是匯編語(yǔ)言經(jīng)匯編后產(chǎn)生的目標(biāo)文件,也可以是高級(jí)語(yǔ)言(例如C語(yǔ)言)經(jīng)編譯后產(chǎn)生的目

標(biāo)文件;另一是庫(kù)文件CLIB),庫(kù)文件是系統(tǒng)中已經(jīng)建立的,主要是為高級(jí)語(yǔ)言提供的。

連接后輸出兩個(gè)文件,一是擴(kuò)展名為.EXE的可執(zhí)行文件,另一個(gè)是擴(kuò)展名為.MAP的內(nèi)

存分配文件,它是連接程序的列表文件,又稱為連接映像(LinkM叩),它給出每個(gè)段在存

儲(chǔ)器中的分配情況,該文件可有可無(wú)。連接程序給出的“無(wú)堆棧段的警告性錯(cuò)誤”并不影

響程序的運(yùn)行。所以,到此為止,連接過(guò)程已經(jīng)結(jié)束,可以在操作系統(tǒng)下執(zhí)行該.EXE程序

了。

3、匯編語(yǔ)言和DOS操作系統(tǒng)的接口

編寫的匯編語(yǔ)言源程序是在DOS環(huán)境下運(yùn)行時(shí),必須了解匯編語(yǔ)言是如何同DOS操

作系統(tǒng)接口的。

用編輯程序把源程序輸入到機(jī)器中,用匯編程序把它轉(zhuǎn)換為目標(biāo)程序,用連接程序?qū)?/p>

其進(jìn)行連接和定位時(shí),操作系統(tǒng)為每一個(gè)用戶程序建立了一個(gè)程序段前綴區(qū)PSP,其長(zhǎng)度

為256個(gè)字節(jié),主要用于存放所要執(zhí)行程序的有關(guān)信息,同時(shí)也提供了程序和操作系統(tǒng)的

接口。操作系統(tǒng)在程序段前綴的開(kāi)始處(偏移地址0000H)安排了一條INT20H軟中斷指

令。INT20H中斷服務(wù)程序由DOS提供,執(zhí)行該服務(wù)程序后,控制就轉(zhuǎn)移到DOS,即返回

到DOS管理的狀態(tài)。因此,用戶在組織程序時(shí),必須使程序執(zhí)行完后能去執(zhí)行存放于PSP

開(kāi)始處的INT20H指令,這樣便返回到DOS,否則就無(wú)法繼續(xù)鍵入命令和程序。

DOS在建立了程序段前綴區(qū)PSP之后,將要執(zhí)行的程序從磁盤裝入內(nèi)存。在定位程序

時(shí),DOS將代碼段置于PSP下方,代碼段之后是數(shù)據(jù)段,最后放置堆棧段。內(nèi)存分配好之

后,DOS就設(shè)置段寄存器DS和ES的值,以使它們指向PSP的開(kāi)始處,即INT20H的存

放地址,同時(shí)將CS設(shè)置為PSP后面代碼段的段地址,IP設(shè)置為指向代碼段中第一條要執(zhí)

行的指令位置,把SS設(shè)置為指向堆棧的段地址,讓SP指向堆棧段的棧底,然后系統(tǒng)開(kāi)始

執(zhí)行用戶程序。為了保證用戶程序執(zhí)行完后能返回到DOS狀態(tài),可使用如下兩種方法。

(-)標(biāo)準(zhǔn)方法

首先將用戶程序的主程序定義成一個(gè)FAR過(guò)程,其最后一條指令為RET。然后在代碼

段的主程序(即FAR過(guò)程)的開(kāi)始部分用如下三條指令將PSP中INT20H指令的段地址及偏

移地址壓入堆棧:

PUSHDS;保護(hù)PSP段地址

MOVAX,0;保護(hù)偏移地址0

PUSHAX

這樣,當(dāng)程序執(zhí)行到主程序的最后一條指令RET時(shí),由于該過(guò)程具有FAR屬性,故

存在堆棧內(nèi)的兩個(gè)字就分別彈出到CS和IP,從而執(zhí)行INT20H指令,使控制返回到DOS

狀態(tài)。返回DOS的標(biāo)志就是程序運(yùn)行完后出現(xiàn)一個(gè)DOS的標(biāo)識(shí)符,如C:\>?

(二)非標(biāo)準(zhǔn)方法

也可在用戶的程序中不定義過(guò)程段,只在代碼段結(jié)束之前(即CODEENDS之前)增加

兩條語(yǔ)句:

MOVAH,4CH

INT21H

則程序執(zhí)行完后也會(huì)自動(dòng)返回DOS狀態(tài)。

此外,由于開(kāi)始執(zhí)行用戶程序時(shí),DS并不設(shè)置在用戶的數(shù)據(jù)段的起始處,ES同樣也

不設(shè)置在用戶的附加段起始處,因而在程序開(kāi)始處使用以下方法重新裝填DS和ES的值使

其指向用戶的數(shù)據(jù)段:

MOVAX,段名

MOV段寄存器名,AX;段寄存器名可以是DS、ES、SS之一

四'實(shí)驗(yàn)內(nèi)容與步驟

1、實(shí)驗(yàn)內(nèi)容

編寫程序,判斷一個(gè)年份是否是閏年.

2、實(shí)驗(yàn)步驟

匯編語(yǔ)言程序設(shè)計(jì)上機(jī)過(guò)程如圖1」所示。

圖1.1匯編語(yǔ)言程序上機(jī)過(guò)程

(-)用編輯程序EDIT建立匯編語(yǔ)言源程序文件(ASM文件)

例如,編寫程序,判斷一個(gè)年份是否是閏年的匯編語(yǔ)言源程序,可以在DOS模式下用

編輯程序EDIT.EXE建立匯編語(yǔ)言源程序文件ABC.ASM,注意文件名的擴(kuò)展名必須

是.ASM。也可以在Windows2000或者在WindowsXP環(huán)境下鼠標(biāo)單擊“開(kāi)始”一“運(yùn)

行”,在“運(yùn)行”中輸入“CMD”進(jìn)入DOS模式,運(yùn)行EDIT軟件,例如:

C>EDITABC.ASM

進(jìn)入EDIT的程序編輯畫面時(shí),輸入?yún)R編語(yǔ)言源程序如下:

DATASEGMENT

INFONDBODH,OAH,JPleaseinputayear:$'

YDBODH,OAH,JThisisaleapyear!$'

NDBODH,OAH,JThisisnotaleapyear!$'

WDW0

BUFDB8

DBQ

DB8DUP(?)

DATAENDS

STACKSEGMENT'stack'

DB200DUP(O)

STACKENDS

CODESEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODE

START:MOVAX,DATA

MOVDS,AX

LEADX,INFON

MOVAH,9

INT2111

LEADX,BUF

MOVAH,10

INT21H

MOVCL,[BUF+1]

LEADI,BUF+2

CALLDATACATE

CALLIFYEARS

JCAl

LEADX,N

MOVAH,9

INT2111

JMPEXIT

Al:LEADX,Y

MOVAH,9

INT21H

EXIT:MOVAH,4CH

INT2111

DATACATEPROCNEAR

LEASI,BUF+2

MOVBX,0

X3:

MOVAL,[SI]

SUBAL,3OH

MOVAH,0

XCHGAX,BX

MOVDX,10D

MULDX

XCHGAX,BX

ADDBX,AX

INCSI

LOOPX3

MOVW,BX

RET

DATACATEENDP

IFYEARSPROCNEAR

PUSHBX

PUSHCX

PUSHDX

MOVAX,W

MOVCX,AX

MOVDX,0

MOVBX,4

DIVBX

CMPDX,0

JNZLABI

MOVAX,CX

MOVBX,100

DIVBX

CMPDX,0

JNZLAB2

MOVAX,CX

MOVBX,400

DIVBX

CMPDX,0

JZLAB2

LABI:CLC

JMPLAB3

LAB2:STC

LAB3:POPDX

POPCX

POPBX

RET

IFYEARSENDP

CODEENDS

ENDSTART

(二)用匯編程序MASM將ASM文件匯編成目標(biāo)程序文件(OBJ文件)

當(dāng)源程序建立以后,仍以ABC.ASM程序?yàn)槔?,我們用匯編程序MASM對(duì)ABC.ASM

源程序文件進(jìn)行匯編,以便產(chǎn)生機(jī)器碼的目標(biāo)程序文件ABC.OBJ,其操作步驟如下:

OMASMABC

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

Objectfilename[ABC.OBJ]:

Sourcelisting[NUL.LST]:ABC

Cross-reference[NUL.CRFJ:ABC

50674+450574Bytessymbolspacefree

0WarningErrors

0SevereErrors

由此可知,匯編程序調(diào)入后,首先顯示版本號(hào),然后出現(xiàn)三個(gè)提示行。

第一個(gè)提示行為:Objectfilename[ABC.OBJ]:

這是詢問(wèn)目標(biāo)程序文件名,方括號(hào)內(nèi)為機(jī)器規(guī)定的默認(rèn)的文件名,通常直接按回車

鍵,表示采用默認(rèn)的文件名(如上所示),這是我們匯編的主要目的。

第二個(gè)提示行為:Sourcelisting[NUL.LST]:

這是詢問(wèn)是否建立列表文件。若不建立,直接回車;若要建立,可以輸入文件名ABC

再回車,表示要建立名為ABC的列表文件。列表文件中同時(shí)列出源程序和機(jī)器語(yǔ)言程序清

單,并給出符號(hào)表,有利于程序調(diào)試。

第三個(gè)提示行為:Cross-referencefNUL.CRF]:

這是詢問(wèn)是否要建立交叉索引文件。若不建立,則直接回車;若要建立,可以輸入文

件名ABC,表示要建立ABC.CRF文件。由于CRF是非文本文件,為了建立交叉索引文

件,還必須調(diào)用CREF.EXE程序,即輸入:

OCREFABC

Microsoft(R)Cross-ReferenceUtilityVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

listing[ABC.REF]:

17Symbols

這時(shí)首先顯示版本號(hào),然后出現(xiàn)一個(gè)提示行:Listing[ABC.REF]:

這是詢問(wèn)交叉索引文件名。這時(shí)可用回車承認(rèn)方括號(hào)內(nèi)機(jī)器默認(rèn)的文件名,如上所

示。這樣就建立了ABC.REF文件。其內(nèi)容是用戶定義的所有符號(hào)(包括變量),并給出每個(gè)

符號(hào)定義所在的行號(hào)(附以#)以及引用的行號(hào)。如下是ABC.REF文件的內(nèi)容:

MicrosoftCross-ReferenceVersion5.00SatDec0118:49:422007

SymbolCross-Reference(#definition,+modification)Cref-1

Al4247#

BUF15#35383955

CODE28#29111

DATA1#212930

DATACATE4053#80

EXIT4650#

IFYEARS4182#110

INFON2#32

LABI92103#

LAB297102105#

LAB3104106#

N10#43

STACK22#222729

START30#112

W14#76+86

X360#73

Y6#47

17Symbols

調(diào)入?yún)R編程序,當(dāng)我們回答了上述各提示行的詢問(wèn)之后,匯編程序就對(duì)源程序進(jìn)行匯

編。若匯編過(guò)程中發(fā)現(xiàn)源程序有語(yǔ)法錯(cuò)誤,則列出有錯(cuò)誤的語(yǔ)句和錯(cuò)誤的代碼。錯(cuò)誤分警

告錯(cuò)誤(WraningErrors)和嚴(yán)重錯(cuò)誤(SevereErrors)o警告錯(cuò)誤是指匯編程序認(rèn)為的一般性錯(cuò)

誤;嚴(yán)重錯(cuò)誤是指匯編程序認(rèn)為無(wú)法進(jìn)行正確匯編的錯(cuò)誤,并給出錯(cuò)誤的個(gè)數(shù)及行號(hào)、錯(cuò)

誤的性質(zhì)等。這時(shí),就要對(duì)錯(cuò)誤進(jìn)行分析,找出問(wèn)題和原因,然后再調(diào)用編輯程序加以修

改,修改后重新匯編,直到匯編后無(wú)錯(cuò)誤為止。

(三)用連接程序LINK生成可執(zhí)行程序文件(EXE文件)

經(jīng)匯編后產(chǎn)生的二進(jìn)制的目標(biāo)程序文件(OBJ文件)并不是可執(zhí)行程序文件(EXE文件),

必須經(jīng)連接以后,才能成為可執(zhí)行文件。連接程序并不是專為匯編語(yǔ)言程序設(shè)計(jì)的。如果

一個(gè)程序是由若干個(gè)模塊組成的,也可通過(guò)連接程序LINK把它們連接在一起。這些模塊

可以是匯編程序產(chǎn)生的目標(biāo)文件,也可以是高級(jí)語(yǔ)言編譯程序產(chǎn)生的目標(biāo)文件。

連接過(guò)程如下:

OLINKABC

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

RunFile[ABC.EXE]:

ListFile[NUL.MAP]:ABC

Libraries[.LIB]:

在連接程序調(diào)入后,首先顯示版本號(hào),然后出現(xiàn)三個(gè)提示行。

第一個(gè)提示行為:RunFile[ABC.EXE]:

這是詢問(wèn)要產(chǎn)生的可執(zhí)行文件的文件名。一般直接回車采用方括號(hào)內(nèi)規(guī)定的隱含文件

名。

第二個(gè)提示行為:ListFile[NUL.MAPJ:

這是詢問(wèn)是否要建立連接映象文件。若不建立,則直接回車;若要建立,則輸入文件

名再回車。如果要建立該文件,可以輸入文件名ABC。

第三個(gè)提示行為:Libraries[.LIB]:

這是詢問(wèn)是否用到庫(kù)文件。若無(wú)特殊需要,則直接回車即可。

上述提示行回答后,連接程序開(kāi)始連接。若連接過(guò)程中有錯(cuò),則顯示錯(cuò)誤信息,錯(cuò)誤

分析清楚后,要重新調(diào)入編輯程序進(jìn)行修改,然后重新匯編,再經(jīng)過(guò)連接,直至無(wú)錯(cuò)為

止。連接以后,便產(chǎn)生了可執(zhí)行程序文件(EXE文件)。

(四)程序的執(zhí)行

當(dāng)我們建立了可執(zhí)行文件ABC.EXE后,就可直接在DOS下執(zhí)行該程序:

OABC

根據(jù)程序提示,輸入一個(gè)年份,計(jì)算機(jī)會(huì)輸出是否閏年的結(jié)果。

五'實(shí)驗(yàn)要求與提示

1、實(shí)驗(yàn)要求

(1)掌握匯編語(yǔ)言程序設(shè)計(jì)上機(jī)過(guò)程;

(2)回答思考問(wèn)題;

(3)記錄實(shí)驗(yàn)結(jié)果。

2、實(shí)驗(yàn)提示

按照?qǐng)D1.1的上機(jī)過(guò)程進(jìn)行實(shí)驗(yàn)。

六、思考與練習(xí)以及測(cè)評(píng)標(biāo)準(zhǔn)

(1)匯編過(guò)程中MASMABC和MASMABC.ASM的結(jié)果是否一致。

(2)連接過(guò)程中LINKABC和LINKABC.OBJ的結(jié)果是否一致。

(3)使用Word如何錄入?yún)R編語(yǔ)言源程序。

實(shí)驗(yàn)二Debug的使用(基礎(chǔ)與驗(yàn)證型)

一'實(shí)驗(yàn)要求和目的

熟練掌握動(dòng)態(tài)調(diào)試程序DEBUG的使用;

二、軟硬件環(huán)境

1、硬件環(huán)境:微機(jī)CPU486以上,500MB以上硬盤,32M以上內(nèi)存;

2、軟件環(huán)境:裝有MASM5.0、Debug、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應(yīng)用

程序。

三'實(shí)驗(yàn)涉及的主要知識(shí)單元

通過(guò)編輯、匯編和連接后的程序是可以執(zhí)行的程序.但是,一個(gè)程序特別是比較復(fù)雜

的程序不能保證沒(méi)有一點(diǎn)錯(cuò)誤。因此,在投入正式運(yùn)行前必須進(jìn)行調(diào)試,以檢查程序的正

確性。調(diào)試程序Debug就是用來(lái)調(diào)試匯編語(yǔ)言程序的一種工具。Debug的主要功能有顯示

和修改寄存器及內(nèi)存單元的內(nèi)容:按指定地址啟動(dòng)并運(yùn)行程序:設(shè)置斷點(diǎn)使程序分段運(yùn)

行,以便檢查程序運(yùn)行過(guò)程中的中間結(jié)果或確定程序出錯(cuò)的位置;反匯編被調(diào)試程序,它

將一個(gè)可執(zhí)行文件中的指令機(jī)器碼反匯編成助記符指令并同時(shí)給出指令所在的內(nèi)存地址;

單條追蹤或多條追蹤被調(diào)試程序,它可以逐條指令執(zhí)行或幾條指令執(zhí)行被調(diào)試程序,每執(zhí)

行一條(或幾條)指令后,Debug程序?qū)⒅袛喑绦虻倪\(yùn)行并提供有關(guān)結(jié)果信息;匯編一段程

序,在Debug的匯編命令下可以直接輸入助記符指令,并將其匯編成可運(yùn)行程序段。此

外,Debug還可以將磁盤指定區(qū)的內(nèi)容或一個(gè)文件裝入到內(nèi)存或?qū)?nèi)存的信息寫到磁盤上

等等。

啟動(dòng)Debug程序:在DOS狀態(tài)下可以用下面的命令啟動(dòng)Debug

DEBUG[路徑文件名.

Debug后面的文件名及路徑是指被調(diào)試程序的文件名及路徑,Debug后面的文件必須

是程序的可執(zhí)行文件,其擴(kuò)展名可以是.EXE或.COM。在此命令后,DOS將調(diào)試程序

Debug調(diào)入內(nèi)存,Debug接著將被調(diào)程序送入內(nèi)存。比如:DEBUG123.EXE

調(diào)試程序Debug的主要命令如下:

(―)顯示內(nèi)存單元內(nèi)容的命令D

格式⑴:-D地址

從指定地址開(kāi)始,顯示128個(gè)字節(jié)的內(nèi)容,每一行的左邊顯示段內(nèi)偏移地址,接著顯

示16個(gè)單元的內(nèi)容,最右邊區(qū)域則顯示這一行的16個(gè)單元所對(duì)應(yīng)的可顯示的字符。若無(wú)

可顯示的字符,則用圓點(diǎn)(小數(shù)點(diǎn))填充。

D命令中的地址可為段內(nèi)偏移量,也可為段基址和段內(nèi)偏移量?jī)刹糠?,中間用冒號(hào)隔

開(kāi),如1680:0110,即指段基址為1680H,段內(nèi)偏移量為0110H。Debug中所顯示的數(shù)據(jù)

均為十六進(jìn)制數(shù),且省去了后面的H標(biāo)志。

格式(2):-D范圍

將顯示指定地址范圍內(nèi)的內(nèi)存單元的內(nèi)容,起始地址可由段基址及段內(nèi)偏移量?jī)蓚€(gè)部

分組成,中間用冒號(hào)“:”隔開(kāi),也可以只指出段內(nèi)偏移量,而此時(shí)的段基址在DS中。

這里所說(shuō)的范圍包含起始地址和結(jié)束地址。

比如一DDS:10001020

將顯示數(shù)據(jù)段偏移地址為1000H到1020H的內(nèi)容。

(二)修改內(nèi)存單元內(nèi)容的命令E

格式(1):-E地址內(nèi)容表

它的功能是用給定的內(nèi)容表去代替所指定的內(nèi)存單元的內(nèi)容。

例如:

EDS:011041'CLOSEz41

該命令執(zhí)行后,將用列表中的7個(gè)字符填入從DS:0110到口5:0116的7個(gè)存儲(chǔ)單元

中。

格式(2):E地址

它的功能是可以連續(xù)地逐個(gè)修改內(nèi)存單元的內(nèi)容。當(dāng)屏幕上顯示指定單元的地址和內(nèi)

容之后,可采取下列辦法:

①若指定單元的內(nèi)容需要修改,則將新的內(nèi)容的十六進(jìn)制數(shù)輸入,再按空格鍵,修改

便告完成,然后顯示下一個(gè)存儲(chǔ)單元的地址及內(nèi)容,若需要修改,可進(jìn)行同樣的操作。若

某一個(gè)單元的內(nèi)容不需要修改,而操作又要進(jìn)行下去,則可直接按空格鍵。

②若需要顯示前一個(gè)單元的地址和內(nèi)容,則輸入連接號(hào)',若要修改,則輸入新的

內(nèi)容;若顯示前一個(gè)單元的地址和內(nèi)容仍要修改,則可進(jìn)行同樣的操作;若顯示的內(nèi)容不

需要修改,則可直接按'鍵,使該操作由高地址向低地址單元連續(xù)不斷地進(jìn)行。

③按<CR>鍵,結(jié)束E命令。

(三)檢查和修改寄存器內(nèi)容的命令R

格式(D:R

此時(shí)將顯示所有寄存器的內(nèi)容和全部標(biāo)志位的狀態(tài),以及現(xiàn)行CS:IP所指的機(jī)器指

令代碼和反匯編符號(hào)。

格式(2):R寄存器名

該格式可用于檢查和修改指定寄存器的內(nèi)容。若不修改其內(nèi)容,可按<CR>鍵,若需要

修改其內(nèi)容,可以輸入1-4個(gè)十六進(jìn)制數(shù),再按<CR>鍵。

格式(3):RF

該格式可用于顯示標(biāo)志和修改標(biāo)志位狀態(tài)。

當(dāng)系統(tǒng)給出標(biāo)志位狀態(tài)后,可采取下列辦法:

①若不需要修改任一標(biāo)志位,可按<CR>鍵。

②若需要修改一個(gè)或多個(gè)標(biāo)志位,可輸入其相反的值。各標(biāo)志位之間可以無(wú)空格且與

順序無(wú)關(guān),修改后按<CR>鍵。

由于標(biāo)志位狀態(tài)顯示時(shí),是用下列特殊符號(hào)表示的,因而修改時(shí),只要輸入規(guī)定的符

號(hào)即可。下面是標(biāo)志名和狀態(tài)符號(hào)的對(duì)照表:

標(biāo)志名置位符號(hào)復(fù)位符號(hào)

溢出標(biāo)志OF(是/否)OVNV

方向標(biāo)志DF(減/增)DNUP

中斷標(biāo)志IF(允許/禁止)EIDI

符號(hào)標(biāo)志SF(負(fù)/正)NGPL

零標(biāo)志ZF(是/否)ZRNZ

輔助進(jìn)位標(biāo)志AF(是/否)ACNA

奇偶校驗(yàn)標(biāo)志PF(偶/奇)PEPO

進(jìn)位標(biāo)志CF(是/否)CYNC

只有追蹤標(biāo)志TF,不能用指令直接修改。

例如:輸入RF命令,系統(tǒng)可能作出如下響應(yīng):

OVDNEINGZRACPECY-

若現(xiàn)在要修改奇偶、零、中斷和溢出標(biāo)志位,可在光標(biāo)處輸入:

PONZDINV<CR>

(四)運(yùn)行程序命令G

格式:G[=地址][地址[地址…]]

該命令可以在程序運(yùn)行中設(shè)置斷點(diǎn)。它是Debug程序進(jìn)行程序調(diào)試的主要命令之一。

示例:-g001a則執(zhí)行從當(dāng)前cs:ip至001a的指令,注意:地址設(shè)置必須從指令的第一字

節(jié)設(shè)起。

①第一個(gè)參數(shù)“=地址”規(guī)定了程序執(zhí)行的起始地址,以CS內(nèi)容作段地址,等號(hào)后面

的地址只需給出地址偏移量。此時(shí),命令G與地址之間的等號(hào)不能省去。

如果在G命令執(zhí)行前,已經(jīng)設(shè)置了CS值和IP值,則也可以直接用G命令,從指定地

址執(zhí)行程序。

②格式中后面給出的地址是指斷點(diǎn)地址,最多可設(shè)置10個(gè)斷點(diǎn)。當(dāng)程序執(zhí)行到一個(gè)斷

點(diǎn)時(shí),就停下來(lái),顯示CPU各寄存器的內(nèi)容和標(biāo)志位的狀態(tài),以及下一條待執(zhí)行的指令,

被調(diào)試程序的所有斷點(diǎn)全部被取消,并返回Debug。

③地址參數(shù)所指的單元,必須包含有有效的8088指令的第一個(gè)字節(jié),否則將產(chǎn)生不可

預(yù)料的結(jié)果。

④堆棧必須至少包含有6個(gè)可用字節(jié),否則也將產(chǎn)生不可預(yù)料的結(jié)果。

⑤若斷點(diǎn)地址只包括地址偏移量,則認(rèn)為段地址在CS寄存器中。

(五)追蹤命令T

格式⑴:T[=地址]

該命令可以在指令執(zhí)行中進(jìn)行追蹤,若略去地址,則從CS:IP現(xiàn)行值執(zhí)行。每一次T

命令都執(zhí)行一條指令。

格式(2):T[=地址][值]

此時(shí),它可對(duì)多條指令進(jìn)行追蹤,即在執(zhí)行了由值所指定的若干條指令之后,停止執(zhí)

行并顯示各寄存器的內(nèi)容和各標(biāo)志位,還指出下一條待執(zhí)行的指令。

(六)匯編命令A(yù)

若在調(diào)試目標(biāo)程序的過(guò)程中,要求改寫或增添一段目標(biāo)程序,則可以用A命令直接在

Debug下實(shí)現(xiàn)。

格式:A[地址]

該命令可以從指定地址開(kāi)始,將輸入的匯編語(yǔ)言語(yǔ)句立即匯編成機(jī)器代碼,連續(xù)存放

在內(nèi)存單元中。在程序輸入完畢后,最后一行不輸入內(nèi)容,直接按回車鍵,即可返回

DEBUG程序,還可用反匯編命令U對(duì)剛輸入的內(nèi)容進(jìn)行反匯編,以驗(yàn)證輸入的程序是否

正確。

使用A命令應(yīng)遵守以下規(guī)則:

①所有輸入數(shù)值,均為十六進(jìn)制數(shù)。

②前綴助記符,必須在相關(guān)指令的前面輸入,可以在同一行,也可以在不同行輸入。

③段超越助記符為CS:、DS:、ES:、SS:o

④遠(yuǎn)調(diào)用時(shí)的返回指令助記符用RETF。

⑤使用串操作指令時(shí),助記符中必須注明是字節(jié)還是字傳送。

⑥匯編語(yǔ)言能自動(dòng)匯編短、近和遠(yuǎn)的轉(zhuǎn)移及近和遠(yuǎn)的調(diào)用,也能由NEAR和FAR前

綴來(lái)超越。

例如:

0110:0600JMP602;短轉(zhuǎn)移

0110:0602JMPNEAR605;近轉(zhuǎn)移

0110:0605JMPFAR60A;遠(yuǎn)轉(zhuǎn)移

第一條JMP指令中含有一個(gè)字節(jié)偏移量。

第二條JMP指令中含有兩個(gè)字節(jié)偏移量。

第三條JMP指令中含有兩個(gè)字節(jié)的偏移量及兩個(gè)字節(jié)的段地址。

⑦當(dāng)DEBUG不能確定某些操作數(shù)涉及的是字類型存儲(chǔ)單元還是字節(jié)類型的存儲(chǔ)單元

時(shí),在這種情況下,必須用前綴“WORDPTR”或“BYTEPTR”來(lái)加以說(shuō)明。

例如:

NEGBYTEPTR[128]

DECWORD[SI]

⑧當(dāng)Debug不能確定一個(gè)操作數(shù)是立即數(shù)還是存儲(chǔ)單元的地址時(shí),可以把地址放在方

括號(hào)中。

⑨兩個(gè)最常用的偽指令DB和DW可以在A命令中使用,用來(lái)直接把字節(jié)或字的值送

入相應(yīng)的存儲(chǔ)單元。

例如:

DB2,5,3,4,'THISISANEXAMPLEz

DW6000,2000,7000,'BA'

⑩Debug支持所有形式的寄存器間接尋址命令。

例如:ADDBX,74LBP+3][SI-5]

POP[BX+DI]

(七)反匯編命令U

格式(1):U地址

該命令從指定的地址開(kāi)始,反匯編32個(gè)字節(jié)。若略去指定地址,則以上一個(gè)U命令

反匯編的最后一條指令地址的下一條指令地址作為起始地址;若沒(méi)有用過(guò)U命令,則以由

Debug初始化的段寄存器的值作段地址,以100作為地址偏移量。

格式(2):U范圍這種格式的命令,可以對(duì)指定范圍的內(nèi)存單元進(jìn)行反匯編,范圍可以

由起始地址、結(jié)束地址(只能包含地址偏移量)或起始地址及長(zhǎng)度來(lái)指定。其命令格式如:

U04BA:1000108或U04BA:0100L7

兩者是等效的。

(A)輸入命令I(lǐng)

格式:I端口地址

該命令從指定端口輸入一個(gè)字節(jié)并顯示。

例如:I2E8

CC

它表示所顯示的是從02E8端口輸入的一個(gè)字節(jié)為CCo

(九)輸出命令0

格式:0端口地址字節(jié)值

其功能是向指定的端口輸出一個(gè)字節(jié)。

例如:02E812

它表示將一個(gè)字節(jié)12H送到輸出端口2E8。

(十)命名命令N

格式:N文件標(biāo)識(shí)符[文件標(biāo)識(shí)符]

該命令用給定的兩個(gè)文件標(biāo)識(shí)符格式化在CS:5C和CS:6C的兩個(gè)文件控制塊中(若在

調(diào)用Debug時(shí)具有一個(gè)文件標(biāo)識(shí)符,則它已格式化在CS:5c的文件控制塊中),文件控制

塊是將要介紹的裝入命令L和寫命令W所需要的。

N命令能把文件標(biāo)識(shí)符和別的參數(shù)放至CS:81開(kāi)始的參數(shù)保存區(qū)中。在CS:80中保存

輸入的字符個(gè)數(shù),寄存器AX保存前兩個(gè)文件標(biāo)識(shí)符中的驅(qū)動(dòng)器標(biāo)志。

例如:

A>DEBUG<CR>

NTEST<CR>

L<CR>

N命令后,用L命令可將TEST調(diào)入自己的CS:100開(kāi)始的存儲(chǔ)區(qū)中。若對(duì)正在調(diào)試的

程序TEST進(jìn)行調(diào)試時(shí),需要用到其它的文件標(biāo)識(shí)符及其它參數(shù),也可用N命令加以實(shí)

現(xiàn)。;

例如:

A>DEBUGTEST<CR>

N文件1文件2<CR>

(H■*一)裝入命令L

格式1:L〈地址》〈驅(qū)動(dòng)器號(hào)》〈起始邏輯扇區(qū)〉〈所讀扇區(qū)個(gè)數(shù)n>

其中〈地址》的缺省值為CS:100。邏輯扇區(qū)可由物理扇區(qū)號(hào)換算得到,以雙面雙密

度盤為例:物理扇區(qū)是按0面。道1區(qū),0面0道2區(qū),...,0面0道9區(qū),。面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ū)。面。道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號(hào)為0—8;物理扇區(qū)1

面。道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號(hào)為9—11H;物理扇區(qū)。面1道1扇區(qū)至9扇區(qū),邏輯

扇區(qū)號(hào)為12—1AH;……o這樣每道先0面后1面一直排下去。

其中〈驅(qū)動(dòng)器號(hào)>為0、1或2,0表示A驅(qū),1表示B驅(qū),2表示硬盤。

功能:將〈驅(qū)動(dòng)器號(hào)〉指定的盤上,從〈起始邏輯扇區(qū)》起,共n個(gè)邏輯扇區(qū)上的所有字

節(jié)順序讀入指定內(nèi)存地址開(kāi)始的一片連續(xù)單元。當(dāng)L后的參數(shù)缺省時(shí),必須在L之前由N

命令指定(或進(jìn)入DEBUG時(shí)一并指出)所讀驅(qū)動(dòng)器文件名。此時(shí)L執(zhí)行后將該文件裝入內(nèi)

存。

例如:-NEXAMPLE<Enter>

-L<Enter>

將當(dāng)前驅(qū)動(dòng)器上的EXAMPLE文件裝入CS:100起始的一片內(nèi)存單元。

格式2:L地址或L

該命令把已在CS:5C中格式化的文件控制塊所指定的文件裝入到指定區(qū)域中。

若省略地址,則裝入到CS:100開(kāi)始的內(nèi)存區(qū)域中。

若是帶有擴(kuò)展名COM或.EXE文件,無(wú)論命令中是否指定了地址,一律裝入到CS:100

開(kāi)始的內(nèi)存區(qū)域中去。

通常在BX和CX中包含了所讀入文件的字節(jié)數(shù),但對(duì)具有擴(kuò)展名.EXE文件,則BX

和CX中還包含實(shí)際程序長(zhǎng)度。

(十二)寫命令W

功能:為L(zhǎng)/W命令指定待裝入/寫盤文件

格式1:W〈地址>〈盤號(hào)》〈起始邏輯扇區(qū),〈所寫邏輯扇區(qū)數(shù)n>

功能:與L命令不同的地方是將內(nèi)存從〈地址>起始的一片單元內(nèi)容寫入指定扇區(qū)。只

有W而沒(méi)有參數(shù)時(shí),與N命令配合使用將文件寫盤。該命令把由地址所指定的內(nèi)存區(qū)域

中的數(shù)據(jù)寫入指定的驅(qū)動(dòng)器。若地址中只包含偏移量,則段地址在CS中。

其中,扇區(qū)號(hào)決定了寫入起始扇區(qū);區(qū)段數(shù)決定了寫入的區(qū)段個(gè)數(shù);扇區(qū)號(hào)和區(qū)段數(shù)

均用十六進(jìn)制數(shù)表示。

格式2:W地址或W

該命令把指定內(nèi)存區(qū)域中的數(shù)據(jù),寫入到由CS:5c處的文件控制塊所規(guī)定的文件中

去。若省略地址,則內(nèi)存區(qū)域從CS:100開(kāi)始。

對(duì)于擴(kuò)展名為.EXE或.HEX文件不能寫入。因?yàn)檫@些文件的寫入要用一種特殊格式,

而此格式Debug程序不支持。

(十三)退出Debug命令Q

格式:Q

該命令退出Debug程序并返回DOS。

Q命令并不把內(nèi)存中的文件存盤,若需要存盤的話,應(yīng)在退出前用W命令寫入磁盤。

四'實(shí)驗(yàn)內(nèi)容與步驟

1、實(shí)驗(yàn)內(nèi)容

(1)進(jìn)入和退出Debug程序

(2)學(xué)會(huì)Debug中的D命令、E命令、R命令、T命令、A命令、G命令、U命令、N命

令、W命令等的使用。

(3)利用Debug,驗(yàn)證乘法、除法、加法、減法、帶進(jìn)位加、帶借位減、堆棧操作指

令、串操作指令的功能。

(4)使用Debug調(diào)試程序調(diào)試匯編程序。

2、實(shí)驗(yàn)步驟

(1)在DOS提示符下,進(jìn)入Debug程序。

(2)詳細(xì)記錄每一步所用的命令,以及查看結(jié)果的方法和具體結(jié)果。

(3)現(xiàn)有一個(gè)雙字加法源程序如下,其中存在錯(cuò)誤。現(xiàn)假設(shè)已匯編、連結(jié)生成了可執(zhí)

行文件HB.EXE,存放在d:\MASM目錄下。請(qǐng)使用Debug對(duì)其進(jìn)行調(diào)試。

CodeSEGMENT

ASSUMECS:code,DS:code

ORG100H;從10011處開(kāi)始存放下列指令

Start:MOVAX,code;將口$置成code段的首地址

MOVDS,AX

MOVSI,200H;取第一個(gè)數(shù)的首地址

MOVAX,[SI];將第一個(gè)數(shù)的低16位取到AX

MOVDl,204H;取第二個(gè)數(shù)的首地址

ADDAX,[DI];第一個(gè)數(shù)和第二個(gè)數(shù)的低16應(yīng)相加

MOV[SI+8],AX;低16位相加的結(jié)果送到20811和209H單元

MOVAX,[SI+2];取第一個(gè)數(shù)的高16位送到AX中

ADDAX,[DI+2];兩個(gè)數(shù)的高16位相加

MOV[SI+OAH],AX;高16位相加的結(jié)果送到20AH,20BH單元

MOVAX,4C00H;使用DOS的4al號(hào)功能調(diào)用

INT21H;進(jìn)入功能調(diào)用,返回DOS

ORG200H;從20(^處開(kāi)始存放下列數(shù)據(jù)

DD12345678h,654387A9h,Oh;被加數(shù)、加數(shù)、和

CodeENDS

ENDstart

調(diào)試過(guò)程:

①進(jìn)入Debug并裝入可執(zhí)行文件IIB.EXE

D:\MASM>DebugHB.EXE<Enter>

②觀察寄存器初始狀態(tài)

-R<Enter>

AX=0000BX=0000CX=020CDX=0000SP=0000BP=0000SI=OOOO1)1=0000

DS=1892ES=1892SS=18A2CS=18A2IP=0100NVUPEIPLNZNAP0NC

18A2:0100B8A218MOVAX,18A2

注:(1)以上顯示的寄存器值,可能和你的電腦顯示的不一樣。

(2)Debug中默認(rèn)的進(jìn)制是十六進(jìn)制。

③以單步工作方式開(kāi)始運(yùn)行程序

首先用T命令順序執(zhí)行用戶程序的前1兩條指令,將段寄存器DS預(yù)置為用戶的數(shù)據(jù)

段。

-T<Enter>

AX=18A2BX=0000CX=020cDX=0000SP=0000BP=0000SI=0000DI=0000

DS=1892ES=1892SS=18A2CS=18A2IP=0103NVUPEIPLNZNAPONC

18A2:01038ED8MOVDS,AX

-T<Enter>

AX=18A2BX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=OOOODI=OOOO

DS=18A2ES=1892SS=18A2CS=18A2IP=0105NVUPEIPLNZNAPONC

18A2:0105BE0002MOVSI,0200

④觀察用戶程序數(shù)據(jù)段初始內(nèi)容

-D20020F<Enter>

18A2:020078563412A9874365-0000000000741350xV4...Cet.P

⑤連續(xù)工作方式運(yùn)行程序至返回DOS前(設(shè)斷點(diǎn)),查看運(yùn)行結(jié)果。為此,現(xiàn)使用U命

令反匯編。

-U100<Enter>

18A2:0100B8A218MOVAX,18A2

18A2:01038ED8MOVDS,AX

18A2:0105BE0002MOVSI,0200

18A2:01088B04MOVAX,[SI]

18A2:010ABF0402MOVDI,0204

18A2:010D0305ADDAX,[DI]

18A2:010F894408MOV[SI+08],AX

18A2:01128B4402MOVAX,[SI+02]

18A2:0115034502ADDAX,[DI+02]

18A2:011889440AMOV[SI+OA],AX

18A2:0UBB8004CMOVAX,4C00

18A2:011ECD21INT21

可見(jiàn),要執(zhí)行10條指令,至011B處停止

-G=100,011B<Enter>

AX=7777BX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200DI=0204

DS=18A2ES=1892SS=18A2CS=18A21P=O11BNVUPEIPLNZNAPENC

18A2:011BB8004CMOVAX,4C00

-D20020F<Enter>

18A2:020078563412A9874365-21DE777743438306xV4...Ce!.wCC..

和為7777DE21H正確。

⑥再取一組數(shù)據(jù),查看運(yùn)行結(jié)果。為此,首先用E命令修改數(shù)據(jù)。

-E200CD,AB,78,56,90,EF,34,12<Enter>

-D20020F<Enter>

18A2:0200CDAB785690EF3412-21DE777743438306..xV..4.!.wCC..

-G=100,11B<Enter>

AX二68ACBX=0000CX=020CDX=0000SP=0000BP=0000SI=0200DI=0204

DS=18A2ES=1892SS=18A2CS=18A2IP=011BNVUPEIPLNZNAPENC

18A2:011BB8004CMOVAX,4C00

-D20020F<Enter>

18A2:0200CDAB785690EF3412-5D9BAC6843438306..xV..4..hCC..

和為68AC9B5DH,錯(cuò)誤。說(shuō)明程序有問(wèn)題。

⑦再將斷點(diǎn)設(shè)在完成低位字加法后,查看運(yùn)行結(jié)果。

-G=100,112<Enter>

AX=9B5DBX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200DI二0204

DS=18A2ES=1892SS=18A2CS=18A2IP=0112NVUPEINGNZNAP0CY

18A2:01128B4402MOVAX,[SI+02]DS:0202=5678

-D20020F<Enter>

18A2:0200CDAB785690EF3412-5D9BAC6843438306..xV..4.]..hCC..

低位和為9B5D,正確。說(shuō)明錯(cuò)誤可能出在后面

⑧使用T命令從剛才的斷點(diǎn)處向后單步調(diào)試,查看運(yùn)行結(jié)果。

-T=112<Enter>

AX=5678BX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200DI=0204

DS=18A2ES=1892SS=18A2CS=18A2IP=0115NVUPEINGNZNAP0CY

18A2:0115034502ADDAX,[DI+02]DS:0206=1234

-T<Enter>

AX=68ACBX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200DI=0204

DS=18A2ES=1892SS=18A2CS=18A2IP=0118NVUPEIPLNZNAPENC

18A2:011889440AMOV[SI+OA],AXDS:020A=68AC

AX寄存器的結(jié)果為68AC,而應(yīng)為68AD。可見(jiàn)是本條加法指令使用錯(cuò)誤,這里應(yīng)使用帶進(jìn)

位加法指令。

⑨使用A命令裝入正確指令后再次運(yùn)行,察看結(jié)果。

-A115<Enter>

18A2:0115ADCAX,[DI+02]<Enter>

18A2:0118<Enter>

-G=100,11B<Enter>

AX=68ADBX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200DI=0204

DS=18A2ES=1892SS=18A2CS=18A2IP=011BNVUPEIPLNZNAPONC

18A2:011BB8004CMOVAX,4C00

-D20020F<Enter>

18A2:0200CDAB785690EF3412-5D9BAD6843438306..xV..4.]..hCC..

和為68AD9B5DH,正確。對(duì)于這樣一個(gè)簡(jiǎn)單程序一般來(lái)說(shuō)不會(huì)再有問(wèn)題。退出后修改源程

序即可。

⑩退出

-Q<Enter>

D:\>

需要說(shuō)明的是此程序很簡(jiǎn)單,只需使用T命令逐條單步調(diào)試即可。本例采用的調(diào)試方

法似乎過(guò)于繁瑣,但這是為了說(shuō)明程序調(diào)試的一般方法,以便讀者調(diào)試復(fù)雜程序時(shí)借鑒。

五'實(shí)驗(yàn)要求與提示

1、實(shí)驗(yàn)要求

(1)熟練掌握Debug的命令;

(2)熟練掌握使用Debug調(diào)試匯編程序;

(3)回答思考問(wèn)題;

(4)記錄實(shí)驗(yàn)結(jié)果。

2、實(shí)驗(yàn)提示

一般使用Debug調(diào)試匯編程序的步籌如下:

(1)調(diào)用DEBUG,裝入用戶程序

(2)觀察寄存器初始狀態(tài)

(3)以單步工作方式開(kāi)始運(yùn)行程序

(4)觀察用戶程序數(shù)據(jù)段初始內(nèi)容

(5)繼續(xù)以單步工作方式運(yùn)行程序

(6)連續(xù)工作方式運(yùn)行程序

(7)修改程序和數(shù)據(jù)

(8)運(yùn)用斷點(diǎn)調(diào)試程序

六、思考與練習(xí)以及測(cè)評(píng)標(biāo)準(zhǔn)

(1)如何啟動(dòng)和退出Debug程序。

(2)整理每個(gè)Debug命令使用的方法,實(shí)際示例及執(zhí)行結(jié)果。

(3)啟動(dòng)Debug后,要裝入某一個(gè).EXE文件,應(yīng)通過(guò)什么方法實(shí)現(xiàn)?

(4)用Debug調(diào)試程序時(shí),如何設(shè)置斷點(diǎn)?

⑸編寫計(jì)算下面函數(shù)值的程序:

\,x>0

y=<0,x=0

-l,x<0

設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量,使用Debug查看X、Y兩個(gè)變量的

數(shù)據(jù)。

⑹分類統(tǒng)計(jì)字?jǐn)?shù)組data中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù),并分別存入內(nèi)存字變量

Positive、Negative和Zero中,數(shù)組元素個(gè)數(shù)保存在其第一個(gè)字中。使用

Debug查看Positive、Negative和Zero三個(gè)變量的數(shù)據(jù)。

七'參考程序

;CH1EX1.ASM

編寫計(jì)算下面函數(shù)值的程序:

'\,x>Q

y=<0,x=0

-l,x<0

設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量程序如下:

源程序如下:

DATASEGMENT

XDB-10

YDB?

DATAENDS

STACKSEGMENTSTACK

DB200DUP(O)

STACKENDS

CODESEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODE

START:MOVAX,DATA

MOVDS,AX

CMPX,0;與0進(jìn)行比較

JGEAl;X20轉(zhuǎn)Al

MOVYr1;X<0時(shí),/fY

JMPEXIT

Al:JGA2;X>0轉(zhuǎn)A2

MOVY,0;X=0時(shí),0~Y

JMPEXIT

A2:MOVY,1;X>0,l-Y

EXIT:MOVAH,4CH

INT21H

CODEENDS

ENDSTART

Debugchlexl.exe

|cAC

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論