匯編語言程序設計實驗_第1頁
匯編語言程序設計實驗_第2頁
匯編語言程序設計實驗_第3頁
匯編語言程序設計實驗_第4頁
匯編語言程序設計實驗_第5頁
已閱讀5頁,還剩154頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一章匯編語言程序設計的實驗環境及實驗步驟

//你所查看的文檔由東北大學看093660提供僅供參考

知識提要:

本章主要進行匯編語言實驗環境及實驗步驟,涉及到的知識點包括:

1、匯編語言源程序編寫好以后,必須經過下列幾個步驟才能在機器上運行:

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

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

(3)連接目標程序(.OBJ-.EXE)

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

(5)運行程序輸出結果。

2、Windows環境下的匯編語言集成編程環境的使用

實驗一DOS環境下的匯編語言編程環境使用(基礎與驗證型)

一、實驗要求和目的

1、掌握匯編語言程序設計的基本方法和技能;

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

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

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

二、軟硬件環境

1、硬件環境:微機CPU486以上,500MB以上硬盤,32M以上內存;

2、軟件環境:裝有MASM5.0、DEBUG>LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應用程序。

三、實驗涉及的主要知識單元

1、匯編語言源程序的匯編過程

匯編語言源程序的匯編過程是是利用匯編程序(MASM)對已編輯好的源程序文件(.ASM)進行匯編,

將源程序文件中以ASCH碼表示的助記符指令逐條翻譯成機器碼指令,并完成源程序中的偽指令所指出的

各種操作,最后可以建立3個文件:擴展名為.OBJ的目標文件、擴展名為.LST的列表文件和擴展名

為,CRF的交叉索引文件。目標文件是必須建立的,它包含了程序中所有的機器碼指令和偽指令指出的各

種有關信息,但該文件中的操作數地址還不是內存的絕對地址,只是一個可浮動的相對地址。列表文件

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

檢查用。交叉索引文件(.CRF)是用來了解源程序中各符號的定義和引用情況的。.LST和.CRF兩個文件

不是必須建立的,可有有無,可以通過匯編時的命令加以選擇。

在對源程序文件(ASM文件)匯編時,匯編程序將對ASM文件進行兩遍掃描,若程序文件中有語法錯

誤,則結束匯編,匯編程序將指出源程序中存在的錯誤,這時應返回編輯環境修改源程序中的錯誤,再經

過匯編,直到最后得到無錯誤的目標程序,即OBJ文件。因此,匯編程序的主要功能可以概括為以下三點:

(1)檢查源程序中的語法錯誤,并給出錯誤信息;(2)產生目標程序文件(OBJ文件),并可給出列表文件

(.LST文件);(3)展開宏指令。

匯編程序是系統提供的用于匯編的系統軟件,目前常用的匯編程序有Microsoft公司推出的宏匯編程

MASM(MACROASSEMBLER)和BORLAND公司推出的TASM(TURBOASSEMBLER)兩種。Microsoft公司推出有宏

匯編程序MASM和小匯編程序ASM兩種,二者的區別在于:MASM有宏處理功能,而ASM沒有宏處理功

能,因此,MASM比ASM的功能強大,但MASM需要占據較大的內存空間,當內存空間較小時(如64KB),

只能使用ASMo

2、目標程序的連接過程

匯編后產生的目標程序(OBJ文件)并不是可執行程序文件(EXE文件),還不能直接運行,它必須通過

連接程序(LINK)連接成一個可執行程序后才能運行。連接程序進行連接時,其輸入有兩個部分:一是目標

文件(.OBJ),目標文件可以是一個也可以是多個,可以是匯編語言經匯編后產生的目標文件,也可以是高

級語言(例如C語言)經編譯后產生的目標文件;另一是庫文件(.LIB),庫文件是系統中已經建立的,主要

是為高級語言提供的。連接后輸出兩個文件,一是擴展名為.EXE的可執行文件,另一個是擴展名為.MAP

的內存分配文件,它是連接程序的列表文件,又稱為連接映像(LinkMap),它給出每個段在存儲器中的分

配情況,該文件可有可無。連接程序給出的''無堆棧段的警告性錯誤”并不影響程序的運行。所以,到此

為止,連接過程已經結束,可以在操作系統下執行該.EXE程序了。

3、匯編語言和DOS操作系統的接口

編寫的匯編語言源程序是在DOS環境下運行時,必須了解匯編語言是如何同DOS操作系統接口的。

用編輯程序把源程序輸入到機器中,用匯編程序把它轉換為目標程序,用連接程序對其進行連接和定

位時,操作系統為每一個用戶程序建立了一個程序段前綴區PSP,其長度為256個字節,主要用于存放所

要執行程序的有關信息,同時也提供了程序和操作系統的接口。操作系統在程序段前綴的開始處(偏移地址

0000H)安排了一條INT20H軟中斷指令。INT20H中斷服務程序由DOS提供,執行該服務程序后,控制

就轉移到DOS,即返回到DOS管理的狀態。因此,用戶在組織程序時,必須使程序執行完后能去執行存

放于PSP開始處的INT20H指令,這樣便返回到DOS,否則就無法繼續鍵入命令和程序。

DOS在建立了程序段前綴區PSP之后,將要執行的程序從磁盤裝入內存。在定位程序時,DOS將代

碼段置于PSP下方,代碼段之后是數據段,最后放置堆棧段。內存分配好之后,DOS就設置段寄存器DS

和ES的值,以使它們指向PSP的開始處,即INT20H的存放地址,同時將CS設置為PSP后面代碼段的

段地址,IP設置為指向代碼段中第一條要執行的指令位置,把SS設置為指向堆棧的段地址,讓SP指向堆

棧段的棧底,然后系統開始執行用戶程序。為了保證用戶程序執行完后能返回到DOS狀態,可使用如下

兩種方法。

(一)標準方法

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

FAR過程)的開始部分用如下三條指令將PSP中INT20H指令的段地址及偏移地址壓入堆棧:

PUSHDS;保護PSP段地址

MOVAX,0;保護偏移地址0

PUSHAX

這樣,當程序執行到主程序的最后一條指令RET時,由于該過程具有FAR屬性,故存在堆棧內的兩

個字就分別彈出到CS和IP,從而執行INT20H指令,使控制返回到DOS狀態。返回DOS的標志就是程

序運行完后出現一個DOS的標識符,如C:\>o

(二)非標準方法

也可在用戶的程序中不定義過程段,只在代碼段結束之前(即CODEENDS之前)增加兩條語句:

MOVAH,4CH

INT21H

則程序執行完后也會自動返回DOS狀態。

止匕外,由于開始執行用戶程序時,DS并不設置在用戶的數據段的起始處,ES同樣也不設置在用戶的

附加段起始處,因而在程序開始處使用以下方法重新裝填DS和ES的值使其指向用戶的數據段:

MOVAX,段名

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

四、實驗內容與步驟

1、實驗內容

編寫程序,判斷一個年份是否是閏年。

2、實驗步驟

匯編語言程序設計上機過程如圖1.1所示。

圖1.1匯編語言程序上機過程

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

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

EDIT.EXE建立匯編語言源程序文件ABC.ASM,注意文件名的擴展名必須是.ASM。也可以在Windows2000

或者在WindowsXP環境下鼠標單擊“開始”一“運行”,在“運行”中輸入“CMD”進入DOS模式,

運行EDIT軟件,例如:

C>EDITABC.ASM

進入EDIT的程序編輯畫面時,輸入匯編語言源程序如下:

DATASEGMENT

INFONDBODH,OAH,?Pleaseinputayear:$'

YDBODH,OAH,JThisisaleapyear!$'

NDBODH,OAH,'Thisisnotaleapyear!$'

WDW0

BUFDB8

DB?

DB8DUP(?)

DATAENDS

STACKSEGMENT'stack5

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODE

START:MOVAX,DATA

MOVDS,AX

LEADX,INFON

MOVAH,9

INT21H

LEADX,BUF

MOVAH,10

INT21H

MOVCL,[BUF+1]

LEADI,BUF+2

CALLDATACATE

CALLIFYEARS

JCAl

LEADX,N

MOVAH,9

INT21H

JMPEXIT

Al:LEADX,Y

MOVAH,9

INT21H

EXIT:MOVAH,4CH

INT21H

DATACATEPROCNEAR

LEASI,BUF+2

MOVBX,0

X3:

MOVAL,[SI]

SUBAL,30H

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文件匯編成目標程序文件(OBJ文件)

當源程序建立以后,仍以ABC.ASM程序為例,我們用匯編程序MASM對ABC.ASM源程序文件進

行匯編,以便產生機器碼的目標程序文件ABC.OBJ,其操作步驟如下:

OMASMABC

Microsoft(R)MacroAssemblerVersion5.00

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

Objectfilename[ABC.OBJ]:

Sourcelisting[NUL.LST]:ABC

Cross-reference[NUL.CRF]:ABC

50674+450574Bytessymbolspacefree

0WarningErrors

0SevereErrors

由此可知,匯編程序調入后,首先顯示版本號,然后出現三個提示行。

第一個提示行為:Objectfilename[ABC.OBJ]:

這是詢問目標程序文件名,方括號內為機器規定的默認的文件名,通常直接按回車鍵,表示采用默認

的文件名(如上所示),這是我們匯編的主要目的。

第二個提示行為:Sourcelisting[NUL.LST]:

這是詢問是否建立列表文件。若不建立,直接回車;若要建立,可以輸入文件名ABC再回車,表示

要建立名為ABC的列表文件。列表文件中同時列出源程序和機器語言程序清單,并給出符號表,有利于

程序調試。

第三個提示行為:Cross-reference[NUL.CRF]:

這是詢問是否要建立交叉索引文件。若不建立,則直接回車;若要建立,可以輸入文件名ABC,表示

要建立ABC.CRF文件。由于.CRF是非文本文件,為了建立交叉索引文件,還必須調用CREF.EXE程序,

即輸入:

OCREFABC

Microsoft(R)Cross-ReferenceUtilityVersion5.00

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

listing[ABC.REF]:

17Symbols

這時首先顯示版本號,然后出現一個提示行:Listing[ABC.REF]:

這是詢問交叉索引文件名。這時可用回車承認方括號內機器默認的文件名,如上所示。這樣就建立了

ABC.REF文件。其內容是用戶定義的所有符號(包括變量),并給出每個符號定義所在的行號(附以#)以及

引用的行號。如下是ABC.REF文件的內容:

MicrosoftCross-ReferenceVersion5.00SatDec0118:49:422007

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

Al4247#

BUF15#35383955

CODE28#29111

DATA1#212930

DATACATE4053#80

EXIT4650#

IFYEARS4182#110

INF0N2#32

LABI92103#

LAB297102105#

LAB3104106#

N10#43

STACK22#222729

START30#112

W14#76+86

X360#73

Y6#47

17Symbols

調入匯編程序,當我們回答了上述各提示行的詢問之后,匯編程序就對源程序進行匯編。若匯編過程

中發現源程序有語法錯誤,則列出有錯誤的語句和錯誤的代碼。錯誤分警告錯誤(WraningErrors)和嚴重錯

誤(SevereErrors)。警告錯誤是指匯編程序認為的一般性錯誤;嚴重錯誤是指匯編程序認為無法進行正確匯

編的錯誤,并給出錯誤的個數及行號、錯誤的性質等。這時,就要對錯誤進行分析,找出問題和原因,然

后再調用編輯程序加以修改,修改后重新匯編,直到匯編后無錯誤為止。

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

經匯編后產生的二進制的目標程序文件(OBJ文件)并不是可執行程序文件(EXE文件),必須經連接以

后,才能成為可執行文件。連接程序并不是專為匯編語言程序設計的。如果一個程序是由若干個模塊組成

的,也可通過連接程序LINK把它們連接在一起。這些模塊可以是匯編程序產生的目標文件,也可以是高

級語言編譯程序產生的目標文件。

連接過程如下:

OLINKABC

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

RunFile[ABC.EXE]:

ListFile[NUL.MAP]:ABC

Libraries[.LIB]:

在連接程序調入后,首先顯示版本號,然后出現三個提示行。

第一個提示行為:RunFile[ABC.EXE]:

這是詢問要產生的可執行文件的文件名。一般直接回車采用方括號內規定的隱含文件名。

第二個提示行為:ListFile[NUL.MAP]:

這是詢問是否要建立連接映象文件。若不建立,則直接回車;若要建立,則輸入文件名再回車。如果

要建立該文件,可以輸入文件名ABC。

第三個提示行為:Libraries[.LIB]:

這是詢問是否用到庫文件。若無特殊需要,則直接回車即可。

上述提示行回答后,連接程序開始連接。若連接過程中有錯,則顯示錯誤信息,錯誤分析清楚后,要

重新調入編輯程序進行修改,然后重新匯編,再經過連接,直至無錯為止。連接以后,便產生了可執行程

序文件(EXE文件)。

(四)程序的執行

當我們建立了可執行文件ABC.EXE后,就可直接在DOS下執行該程序:

OABC

根據程序提示,輸入一個年份,計算機會輸出是否閏年的結果。

五、實驗要求與提示

1、實驗要求

(1)掌握匯編語言程序設計上機過程;

(2)回答思考問題;

(3)記錄實驗結果。

2、實驗提示

按照圖1.1的上機過程進行實驗。

六、思考與練習以及測評標準

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

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

(3)使用Word如何錄入匯編語言源程序。

實驗二Debug的使用(基礎與驗證型)

一、實驗要求和目的

熟練掌握動態調試程序DEBUG的使用;

二、軟硬件環境

1、硬件環境:微機CPU486以上,500MB以上硬盤,32M以上內存;

2、軟件環境:裝有MASM5.0、Debug、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應用程序。

三、實驗涉及的主要知識單元

通過編輯、匯編和連接后的程序是可以執行的程序。但是,一個程序特別是比較復雜的程序不能保證

沒有一點錯誤。因此,在投入正式運行前必須進行調試,以檢查程序的正確性。調試程序Debug就是用來

調試匯編語言程序的一種工具。Debug的主要功能有顯示和修改寄存器及內存單元的內容;按指定地址啟

動并運行程序;設置斷點使程序分段運行,以便檢查程序運行過程中的中間結果或確定程序出錯的位置;

反匯編被調試程序,它將一個可執行文件中的指令機器碼反匯編成助記符指令并同時給出指令所在的內存

地址;單條追蹤或多條追蹤被調試程序,它可以逐條指令執行或幾條指令執行被調試程序,每執行一條(或

幾條)指令后,Debug程序將中斷程序的運行并提供有關結果信息;匯編一段程序,在Debug的匯編命令

下可以直接輸入助記符指令,并將其匯編成可運行程序段。此外,Debug還可以將磁盤指定區的內容或一

個文件裝入到內存或將內存的信息寫到磁盤上等等。

啟動Debug程序:在DOS狀態下可以用下面的命令啟動Debug程序:

DEBUG[路徑文件名.擴展名]

Debug后面的文件名及路徑是指被調試程序的文件名及路徑,Debug后面的文件必須是程序的可執行

文件,其擴展名可以是.EXE或.COM。在此命令后,DOS將調試程序Debug調入內存,Debug接著將被調

程序送入內存。比如:DEBUG123.EXE

調試程序Debug的主要命令如下:

(一)顯示內存單元內容的命令D

格式⑴:-D地址

從指定地址開始,顯示128個字節的內容,每一行的左邊顯示段內偏移地址,接著顯示16個單元的

內容,最右邊區域則顯示這一行的16個單元所對應的可顯示的字符。若無可顯示的字符,則用圓點(小數

點)填充。

D命令中的地址可為段內偏移量,也可為段基址和段內偏移量兩部分,中間用冒號隔開,如1680:0110,

即指段基址為1680H,段內偏移量為0110H。Debug中所顯示的數據均為十六進制數,且省去了后面的H

志。

格式(2):-D范圍

將顯示指定地址范圍內的內存單元的內容,起始地址可由段基址及段內偏移量兩個部分組成,中間用

冒號隔開,也可以只指出段內偏移量,而此時的段基址在DS中。這里所說的范圍包含起始地址和

結束地址。

比如-DDS:10001020

將顯示數據段偏移地址為1000H到1020H的內容。

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

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

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

例如:

EDS:011041'CLOSE'41

該命令執行后,將用列表中的7個字符填入從DS:0110到DS:0116的7個存儲單元中。

格式(2):E地址

它的功能是可以連續地逐個修改內存單元的內容。當屏幕上顯示指定單元的地址和內容之后,可采取

下列辦法:

①若指定單元的內容需要修改,則將新的內容的十六進制數輸入,再按空格鍵,修改便告完成,然后

顯示下一個存儲單元的地址及內容,若需要修改,可進行同樣的操作。若某一個單元的內容不需要修改,

而操作又要進行下去,則可直接按空格鍵。

②若需要顯示前一個單元的地址和內容,則輸入連接號',若要修改,則輸入新的內容;若顯示前

一個單元的地址和內容仍要修改,則可進行同樣的操作;若顯示的內容不需要修改,則可直接按'鍵,

使該操作由高地址向低地址單元連續不斷地進行。

③按<CR>鍵,結束E命令。

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

格式⑴:R

此時將顯示所有寄存器的內容和全部標志位的狀態,以及現行CS:IP所指的機器指令代碼和反匯編

符號。

格式(2):R寄存器名

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

可以輸入1-4個十六進制數,再按<CR>鍵。

格式(3):RF

該格式可用于顯示標志和修改標志位狀態。

當系統給出標志位狀態后,可采取下列辦法:

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

②若需要修改一個或多個標志位,可輸入其相反的值。各標志位之間可以無空格且與順序無關,修改

后按<CR>鍵。

由于標志位狀態顯示時,是用下列特殊符號表示的,因而修改時,只要輸入規定的符號即可。下面是

標志名和狀態符號的對照表:

標志名置位符號復位符號

溢出標志OF(是/否)OVNV

方向標志DF(減/增)DNUP

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

符號標志SF(負/正)NGPL

零標志ZF(是/否)ZRNZ

輔助進位標志AF(是/否)ACNA

奇偶校驗標志PF(偶/奇)PEPO

進位標志CF(是/否)CYNC

只有追蹤標志TF,不能用指令直接修改。

例如:輸入RF命令,系統可能作出如下響應:

OVDNEINGZRACPECY-

若現在要修改奇偶、零、中斷和溢出標志位,可在光標處輸入:

PONZDINV<CR>

(四)運行程序命令G

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

該命令可以在程序運行中設置斷點。它是Debug程序進行程序調試的主要命令之一。

示例:-g001a則執行從當前cs:ip至001a的指令,注意:地址設置必須從指令的第一字節設起。

①第一個參數”=地址”規定了程序執行的起始地址,以CS內容作段地址,等號后面的地址只需給出

地址偏移量。此時,命令G與地址之間的等號不能省去。

如果在G命令執行前,已經設置了CS值和IP值,則也可以直接用G命令,從指定地址執行程序。

②格式中后面給出的地址是指斷點地址,最多可設置10個斷點。當程序執行到一個斷點時,就停下

來,顯示CPU各寄存器的內容和標志位的狀態,以及下一條待執行的指令,被調試程序的所有斷點全部

被取消,并返回Debug。

③地址參數所指的單元,必須包含有有效的8088指令的第一個字節,否則將產生不可預料的結果。

④堆棧必須至少包含有6個可用字節,否則也將產生不可預料的結果。

⑤若斷點地址只包括地址偏移量,則認為段地址在CS寄存器中。

(五)追蹤命令T

格式(1):T[=地址]

該命令可以在指令執行中進行追蹤,若略去地址,則從CS:IP現行值執行。每一次T命令都執行一

條指令。

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

此時,它可對多條指令進行追蹤,即在執行了由值所指定的若干條指令之后,停止執行并顯示各寄存

器的內容和各標志位,還指出下一條待執行的指令。

(六)匯編命令A

若在調試目標程序的過程中,要求改寫或增添一段目標程序,則可以用A命令直接在Debug下實現。

格式:A[地址]

該命令可以從指定地址開始,將輸入的匯編語言語句立即匯編成機器代碼,連續存放在內存單元中。

在程序輸入完畢后,最后一行不輸入內容,直接按回車鍵,即可返回DEBUG程序,還可用反匯編命令U

對剛輸入的內容進行反匯編,以驗證輸入的程序是否正確。

使用A命令應遵守以下規則:

①所有輸入數值,均為十六進制數。

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

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

④遠調用時的返回指令助記符用RETF。

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

⑥匯編語言能自動匯編短、近和遠的轉移及近和遠的調用,也能由NEAR和FAR前綴來超越。

例如:

0110:0600JMP602;短轉移

0110:0602JMPNEAR605;近轉移

0110:0605JMPFAR60A;遠轉移

第一條JMP指令中含有一個字節偏移量。

第二條JMP指令中含有兩個字節偏移量。

第三條JMP指令中含有兩個字節的偏移量及兩個字節的段地址。

⑦當DEBUG不能確定某些操作數涉及的是字類型存儲單元還是字節類型的存儲單元時,在這種情

況下,必須用前綴“WORDPTR”或“BYTEPTR”來加以說明。

例如:

NEGBYTEPTR[128]

DECWORD[SI]

⑧當Debug不能確定一個操作數是立即數還是存儲單元的地址時,可以把地址放在方括號中。

⑨兩個最常用的偽指令DB和DW可以在A命令中使用,用來直接把字節或字的值送入相應的存儲

單元。

例如:

DB2,5,3,4,'THISISANEXAMPLE?

DW6000,2000,7000,'BA'

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

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

POP[BX+DI]

(七)反匯編命令U

格式(1):U地址

該命令從指定的地址開始,反匯編32個字節。若略去指定地址,則以上一個U命令反匯編的最后一

條指令地址的下一條指令地址作為起始地址;若沒有用過U命令,則以由Debug初始化的段寄存器的值作

段地址,以100作為地址偏移量。

格式(2):U范圍這種格式的命令,可以對指定范圍的內存單元進行反匯編,范圍可以由起始地址、結

束地址(只能包含地址偏移量)或起始地址及長度來指定。其命令格式如:

U04BA:1000108或U04BA:0100L7

兩者是等效的。

(八)輸入命令I

格式:I端口地址

該命令從指定端口輸入一個字節并顯示。

例如:I2E8

CC

它表示所顯示的是從02E8端口輸入的一個字節為CCo

(九)輸出命令O

格式:。端口地址字節值

其功能是向指定的端口輸出一個字節。

例如:O2E812

它表示將一個字節12H送到輸出端口2E80

(十)命名命令N

格式:N文件標識符[文件標識符]

該命令用給定的兩個文件標識符格式化在CS:5C和CS:6C的兩個文件控制塊中(若在調用Debug時具

有一個文件標識符,則它已格式化在CS:5c的文件控制塊中),文件控制塊是將要介紹的裝入命令L和寫

命令W所需要的。

N命令能把文件標識符和別的參數放至CS:81開始的參數保存區中。在CS:80中保存輸入的字符個數,

寄存器AX保存前兩個文件標識符中的驅動器標志。

例如:

A>DEBUG<CR>

NTEST<CR>

L<CR>

N命令后,用L命令可將TEST調入自己的CS:100開始的存儲區中。若對正在調試的程序TEST進行

調試時,需要用到其它的文件標識符及其它參數,也可用N命令加以實現。;

例如:

A>DEBUGTEST<CR>

N文件]文件2<CR>

(H^一)裝入命令L

格式1:L〈地址>〈驅動器號》〈起始邏輯扇區》〈所讀扇區個數n>

其中〈地址>的缺省值為CS:100。邏輯扇區可由物理扇區號換算得到,以雙面雙密度盤為例:物理

扇區是按。面。道1區,。面。道2區,...,0面。道9區,0面1道1區,,0面39道9區,1面

0道1區,……,1面39道9區排列。而邏輯扇區與物理扇區號的對應關系為物理扇區0面0道1扇區至

9扇區,邏輯扇區號為0—8;物理扇區1面。道1扇區至9扇區,邏輯扇區號為9一11H;物理扇區。面1

道1扇區至9扇區,邏輯扇區號為12—1AH;……o這樣每道先。面后1面一直排下去。

其中〈驅動器號》為0、1或2,0表示A驅,1表示B驅,2表示硬盤。

功能:將〈驅動器號〉指定的盤上,從〈起始邏輯扇區〉起,共n個邏輯扇區上的所有字節順序讀入指定

內存地址開始的一片連續單元。當L后的參數缺省時,必須在L之前由N命令指定(或進入DEBUG時一并

指出)所讀驅動器文件名。此時L執行后將該文件裝入內存。

例如:-NEXAMPLE<Enter>

-L<Enter>

將當前驅動器上的EXAMPLE文件裝入CS:100起始的一片內存單元。

格式2:L地址或L

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

若省略地址,則裝入到CS:100開始的內存區域中。

若是帶有擴展名.COM或.EXE文件,無論命令中是否指定了地址,一律裝入到CS:100開始的內存區

域中去。

通常在BX和CX中包含了所讀入文件的字節數,但對具有擴展名.EXE文件,則BX和CX中還包含

實際程序長度。

(十二)寫命令W

功能:為L/W命令指定待裝入/寫盤文件

格式1:W(地址〉〈盤號〉〈起始邏輯扇區,〈所寫邏輯扇區數n>

功能:與L命令不同的地方是將內存從〈地址>起始的一片單元內容寫入指定扇區。只有W而沒有參

數時,與N命令配合使用將文件寫盤。該命令把由地址所指定的內存區域中的數據寫入指定的驅動器。若

地址中只包含偏移量,則段地址在CS中。

其中,扇區號決定了寫入起始扇區;區段數決定了寫入的區段個數;扇區號和區段數均用十六進制數

表示。

格式2:W地址或W

該命令把指定內存區域中的數據,寫入到由CS:5c處的文件控制塊所規定的文件中去。若省略地址,

則內存區域從CS:100開始。

對于擴展名為.EXE或.HEX文件不能寫入。因為這些文件的寫入要用一種特殊格式,而此格式Debug

程序不支持。

(十三)退出Debug命令Q

格式:Q

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

Q命令并不把內存中的文件存盤,若需要存盤的話,應在退出前用W命令寫入磁盤。

四、實驗內容與步驟

1、實驗內容

(1)進入和退出Debug程序

(2)學會Debug中的D命令、E命令、R命令、T命令、A命令、G命令、U命令、N命令、W命令等的

使用。

(3)利用Debug,驗證乘法、除法、加法、減法、帶進位加、帶借位減、堆棧操作指令、串操作指令

的功能。

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

2、實驗步驟

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

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

(3)現有一個雙字加法源程序如下,其中存在錯誤。現假設已匯編、連結生成了可執行文件HB.EXE,

存放在d:\MASM目錄下。請使用Debug對其進行調試。

CodeSEGMENT

ASSUMECS:code,DS:code

ORG100H;從100口處開始存放下列指令

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

MOVDS,AX

MOVSI,200H;取第一個數的首地址

MOVAX,[SI];將第一個數的低16位取到AX

MOVDI,204H;取第二個數的首地址

ADDAX,[DI];第一個數和第二個數的低16應相加

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

MOVAX,[SI+2];取第一個數的高16位送到AX中

ADDAX,[DI+2];兩個數的高16位相加

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

MOVAX,4C00H;使用DOS的4cH號功能調用

INT21H;進入功能調用,返回DOS

ORG200H;從200H處開始存放下列數據

DD12345678h,654387A9h,Oh;被加數、加數、和

CodeENDS

ENDstart

調試過程:

①進入Debug并裝入可執行文件HB.EXE

D:\MASM>DebugHB.EXE<Enter>

②觀察寄存器初始狀態

-R<Enter>

AX=OOOOBX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=OOOODI=OOOO

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

18A2:0100B8A218MOVAX,18A2

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

(2)Debug中默認的進制是十六進制。

③以單步工作方式開始運行程序

首先用T命令順序執行用戶程序的前1兩條指令,將段寄存器DS預置為用戶的數據段。

-T<Enter>

AX=18A2BX=0000CX=020CDX=OOOOSP=OOOOBP=0000SI=0000D>0000

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

18A2:01038ED8MOVDS,AX

-T<Enter>

AX=18A2BX=OOOOCX=020CDX=OOOOSP=OOOOBP=OOOOSI=0000DI=0000

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

18A2:0105BE0002MOVSI,0200

④觀察用戶程序數據段初始內容

-D20020F<Enter>

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

⑤連續工作方式運行程序至返回DOS前(設斷點),查看運行結果。為此,現使用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:011BB8004CMOVAX,4C00

18A2:011ECD21INT21

可見,要執行10條指令,至011B處停止

-G=100,011B<Enter>

AX=7777BX=0000CX=020CDX=0000SP=0000BP=0000SI=0200DI=0204

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

18A2:011BB8004CMOVAX,4C00

-D20020F<Enter>

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

和為7777DE21H,正確。

⑥再取一組數據,查看運行結果。為此,首先用E命令修改數據。

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

-D20020F<Enter>

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

-G=100,11B<Enter>

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

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

18A2:011BB8004CMOVAX,4C00

-D20020F<Enter>

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

和為68AC9B5DH,錯誤。說明程序有問題。

⑦再將斷點設在完成低位字加法后,查看運行結果。

-G=100,112<Enter>

AX=9B5DBX=0000CX=020CDX=OOOOSP=OOOOBP=OOOOSI=0200D>0204

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

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

-D20020F<Enter>

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

低位和為9B5D,正確。說明錯誤可能出在后面

⑧使用T命令從剛才的斷點處向后單步調試,查看運行結果。

-T=112<Enter>

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

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

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寄存器的結果為68AC,而應為68AD。可見是本條加法指令使用錯誤,這里應使用帶進位加法指令。

⑨使用A命令裝入正確指令后再次運行,察看結果。

-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,正確。對于這樣一個簡單程序一般來說不會再有問題。退出后修改源程序即可。

⑩退出

-Q<Enter>

D:\>

需要說明的是此程序很簡單,只需使用T命令逐條單步調試即可。本例采用的調試方法似乎過于繁瑣,

但這是為了說明程序調試的一般方法,以便讀者調試復雜程序時借鑒。

五、實驗要求與提示

1、實驗要求

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

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

(3)回答思考問題;

(4)記錄實驗結果。

2、實驗提不

一般使用Debug調試匯編程序的步籌如下:

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

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

(3)以單步工作方式開始運行程序

(4)觀察用戶程序數據段初始內容

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

(6)連續工作方式運行程序

(7)修改程序和數據

(8)運用斷點調試程序

六、思考與練習以及測評標準

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

(2)整理每個Debug命令使用的方法,實際示例及執行結果。

(3)啟動Debug后,要裝入某一個.EX

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論