




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一章匯編語言程序設計的實驗環(huán)境及實
驗步驟
知識提要:
本章主要進行匯編語言實驗環(huán)境及實驗步驟,涉及到的知識點包括:
1、匯編語言源程序編寫好以后,
(1)編輯源程序(生成.ASM
(2)匯編源程序(.ASM-.OBJ
(3)連接目標程序(.OBJf.EXE
(4)調試可執(zhí)行程序(使用調試程序Debug調試生成的.EXE文件)
(5)運行程序輸出結果。
2、Windows環(huán)境下的匯編語言集成編程環(huán)境的使用
實驗一DOS環(huán)境下的匯編語言編程環(huán)境使用(基礎與驗證
型)
一'實驗要求和目的
1、掌握匯編語言程序設計的基本方法和技能;
2、熟練掌握使用全屏幕編輯程序EDIT編輯匯編語言源程序;
3、熟練掌握宏匯編程序MASM的使用;
4、熟練掌握連接程序LINK的使用。
二'軟硬件環(huán)境
1、硬件環(huán)境:微機CPU486以上,500MB以上硬盤,32M以上內存;
2、軟件環(huán)境:裝有MASM5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應
用程序。
三、實驗涉及的主要知識單元
1、匯編語言源程序的匯編過程
匯編語言源程序的匯編過程是是利用匯編程序(MASM)對已編輯好的源程序文件
(.ASM)進行匯編,將源程序文件中以ASCH碼表示的助記符指令逐條翻譯成機器碼指
令,并完成源程序中的偽指令所指出的各種操作,最后可以建立3個文件:擴展名為.OBJ
的目標文件、擴展名為.LST的列表文件和擴展名為.CRF的交叉索引文件。目標文件是
必須建立的,它包含了程序中所有的機器碼指令和偽指令指出的各種有關信息,但該文件
中的操作數(shù)地址還不是內存的絕對地址,只是一個可浮動的相對地址。列表文件(.LST)
中包含了源程序的全部信息(包括注釋)和匯編后的目標程序,列表文件可以打印輸出,可
供調試檢查用。交叉索引文件(.CRF)是用來了解源程序中各符號的定義和引用情況
的。.LST和.CRF兩個文件不是必須建立的,可有有無,可以通過匯編時的命令加以選擇。
在對源程序文件(ASM文件)匯編時,匯編程序將對ASM文件進行兩遍掃描,若程序
文件中有語法錯誤,則結束匯編,匯編程序將指出源程序中存在的錯誤,這時應返回編輯
環(huán)境修改源程序中的錯誤,再經(jīng)過匯編,直到最后得到無錯誤的目標程序,即OBJ文件。
因此,匯編程序的主要功能可以概括為以下三點:(1)檢查源程序中的語法錯誤,并給出
錯誤信息;(2)產(chǎn)生目標程序文件(OBJ文件),并可給出列表文件(.LST文件);(3)展開宏
指令。
匯編程序是系統(tǒng)提供的用于匯編的系統(tǒng)軟件,目前常用的匯編程序有Microsoft公司
推出的宏匯編程MASM(MACROASSEMBLER)和BORLAND公司推出的TASM(TURBOASSEMBLER)
兩種。Microsoft公司推出有宏匯編程序MASM和小匯編程序ASM兩種,二者的區(qū)別在于:
MASM有宏處理功能,而ASM沒有宏處理功能,因此,MASM比ASM的功能強大,但
MASM需要占據(jù)較大的內存空間,當內存空間較小時(如64KB),只能使用ASM。
2、目標程序的連接過程
匯編后產(chǎn)生的目標程序(OBJ文件)并不是可執(zhí)行程序文件(EXE文件),還不能直接運
行,它必須通過連接程序(LINK)連接成一個可執(zhí)行程序后才能運行。連接程序進行連接
時,其輸入有兩個部分:一是目標文件(.OBJ),目標文件可以是一個也可以是多個,可以
是匯編語言經(jīng)匯編后產(chǎn)生的目標文件,也可以是高級語言(例如C語言)經(jīng)編譯后產(chǎn)生的目
標文件;另一是庫文件CLIB),庫文件是系統(tǒng)中已經(jīng)建立的,主要是為高級語言提供的。
連接后輸出兩個文件,一是擴展名為.EXE的可執(zhí)行文件,另一個是擴展名為.MAP的內
存分配文件,它是連接程序的列表文件,又稱為連接映像(LinkM叩),它給出每個段在存
儲器中的分配情況,該文件可有可無。連接程序給出的“無堆棧段的警告性錯誤”并不影
響程序的運行。所以,到此為止,連接過程已經(jīng)結束,可以在操作系統(tǒng)下執(zhí)行該.EXE程序
了。
3、匯編語言和DOS操作系統(tǒng)的接口
編寫的匯編語言源程序是在DOS環(huán)境下運行時,必須了解匯編語言是如何同DOS操
作系統(tǒng)接口的。
用編輯程序把源程序輸入到機器中,用匯編程序把它轉換為目標程序,用連接程序對
其進行連接和定位時,操作系統(tǒng)為每一個用戶程序建立了一個程序段前綴區(qū)PSP,其長度
為256個字節(jié),主要用于存放所要執(zhí)行程序的有關信息,同時也提供了程序和操作系統(tǒng)的
接口。操作系統(tǒng)在程序段前綴的開始處(偏移地址0000H)安排了一條INT20H軟中斷指
令。INT20H中斷服務程序由DOS提供,執(zhí)行該服務程序后,控制就轉移到DOS,即返回
到DOS管理的狀態(tài)。因此,用戶在組織程序時,必須使程序執(zhí)行完后能去執(zhí)行存放于PSP
開始處的INT20H指令,這樣便返回到DOS,否則就無法繼續(xù)鍵入命令和程序。
DOS在建立了程序段前綴區(qū)PSP之后,將要執(zhí)行的程序從磁盤裝入內存。在定位程序
時,DOS將代碼段置于PSP下方,代碼段之后是數(shù)據(jù)段,最后放置堆棧段。內存分配好之
后,DOS就設置段寄存器DS和ES的值,以使它們指向PSP的開始處,即INT20H的存
放地址,同時將CS設置為PSP后面代碼段的段地址,IP設置為指向代碼段中第一條要執(zhí)
行的指令位置,把SS設置為指向堆棧的段地址,讓SP指向堆棧段的棧底,然后系統(tǒng)開始
執(zhí)行用戶程序。為了保證用戶程序執(zhí)行完后能返回到DOS狀態(tài),可使用如下兩種方法。
(-)標準方法
首先將用戶程序的主程序定義成一個FAR過程,其最后一條指令為RET。然后在代碼
段的主程序(即FAR過程)的開始部分用如下三條指令將PSP中INT20H指令的段地址及偏
移地址壓入堆棧:
PUSHDS;保護PSP段地址
MOVAX,0;保護偏移地址0
PUSHAX
這樣,當程序執(zhí)行到主程序的最后一條指令RET時,由于該過程具有FAR屬性,故
存在堆棧內的兩個字就分別彈出到CS和IP,從而執(zhí)行INT20H指令,使控制返回到DOS
狀態(tài)。返回DOS的標志就是程序運行完后出現(xiàn)一個DOS的標識符,如C:\>?
(二)非標準方法
也可在用戶的程序中不定義過程段,只在代碼段結束之前(即CODEENDS之前)增加
兩條語句:
MOVAH,4CH
INT21H
則程序執(zhí)行完后也會自動返回DOS狀態(tài)。
此外,由于開始執(zhí)行用戶程序時,DS并不設置在用戶的數(shù)據(jù)段的起始處,ES同樣也
不設置在用戶的附加段起始處,因而在程序開始處使用以下方法重新裝填DS和ES的值使
其指向用戶的數(shù)據(jù)段:
MOVAX,段名
MOV段寄存器名,AX;段寄存器名可以是DS、ES、SS之一
四'實驗內容與步驟
1、實驗內容
編寫程序,判斷一個年份是否是閏年.
2、實驗步驟
匯編語言程序設計上機過程如圖1」所示。
圖1.1匯編語言程序上機過程
(-)用編輯程序EDIT建立匯編語言源程序文件(ASM文件)
例如,編寫程序,判斷一個年份是否是閏年的匯編語言源程序,可以在DOS模式下用
編輯程序EDIT.EXE建立匯編語言源程序文件ABC.ASM,注意文件名的擴展名必須
是.ASM。也可以在Windows2000或者在WindowsXP環(huán)境下鼠標單擊“開始”一“運
行”,在“運行”中輸入“CMD”進入DOS模式,運行EDIT軟件,例如:
C>EDITABC.ASM
進入EDIT的程序編輯畫面時,輸入?yún)R編語言源程序如下:
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文件匯編成目標程序文件(OBJ文件)
當源程序建立以后,仍以ABC.ASM程序為例,我們用匯編程序MASM對ABC.ASM
源程序文件進行匯編,以便產(chǎn)生機器碼的目標程序文件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
由此可知,匯編程序調入后,首先顯示版本號,然后出現(xiàn)三個提示行。
第一個提示行為:Objectfilename[ABC.OBJ]:
這是詢問目標程序文件名,方括號內為機器規(guī)定的默認的文件名,通常直接按回車
鍵,表示采用默認的文件名(如上所示),這是我們匯編的主要目的。
第二個提示行為:Sourcelisting[NUL.LST]:
這是詢問是否建立列表文件。若不建立,直接回車;若要建立,可以輸入文件名ABC
再回車,表示要建立名為ABC的列表文件。列表文件中同時列出源程序和機器語言程序清
單,并給出符號表,有利于程序調試。
第三個提示行為:Cross-referencefNUL.CRF]:
這是詢問是否要建立交叉索引文件。若不建立,則直接回車;若要建立,可以輸入文
件名ABC,表示要建立ABC.CRF文件。由于CRF是非文本文件,為了建立交叉索引文
件,還必須調用CREF.EXE程序,即輸入:
OCREFABC
Microsoft(R)Cross-ReferenceUtilityVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.
listing[ABC.REF]:
17Symbols
這時首先顯示版本號,然后出現(xiàn)一個提示行: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
INFON2#32
LABI92103#
LAB297102105#
LAB3104106#
N10#43
STACK22#222729
START30#112
W14#76+86
X360#73
Y6#47
17Symbols
調入?yún)R編程序,當我們回答了上述各提示行的詢問之后,匯編程序就對源程序進行匯
編。若匯編過程中發(fā)現(xiàn)源程序有語法錯誤,則列出有錯誤的語句和錯誤的代碼。錯誤分警
告錯誤(WraningErrors)和嚴重錯誤(SevereErrors)o警告錯誤是指匯編程序認為的一般性錯
誤;嚴重錯誤是指匯編程序認為無法進行正確匯編的錯誤,并給出錯誤的個數(shù)及行號、錯
誤的性質等。這時,就要對錯誤進行分析,找出問題和原因,然后再調用編輯程序加以修
改,修改后重新匯編,直到匯編后無錯誤為止。
(三)用連接程序LINK生成可執(zhí)行程序文件(EXE文件)
經(jīng)匯編后產(chǎn)生的二進制的目標程序文件(OBJ文件)并不是可執(zhí)行程序文件(EXE文件),
必須經(jīng)連接以后,才能成為可執(zhí)行文件。連接程序并不是專為匯編語言程序設計的。如果
一個程序是由若干個模塊組成的,也可通過連接程序LINK把它們連接在一起。這些模塊
可以是匯編程序產(chǎn)生的目標文件,也可以是高級語言編譯程序產(chǎn)生的目標文件。
連接過程如下:
OLINKABC
Microsoft(R)OverlayLinkerVersion3.60
Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.
RunFile[ABC.EXE]:
ListFile[NUL.MAP]:ABC
Libraries[.LIB]:
在連接程序調入后,首先顯示版本號,然后出現(xiàn)三個提示行。
第一個提示行為:RunFile[ABC.EXE]:
這是詢問要產(chǎn)生的可執(zhí)行文件的文件名。一般直接回車采用方括號內規(guī)定的隱含文件
名。
第二個提示行為:ListFile[NUL.MAPJ:
這是詢問是否要建立連接映象文件。若不建立,則直接回車;若要建立,則輸入文件
名再回車。如果要建立該文件,可以輸入文件名ABC。
第三個提示行為:Libraries[.LIB]:
這是詢問是否用到庫文件。若無特殊需要,則直接回車即可。
上述提示行回答后,連接程序開始連接。若連接過程中有錯,則顯示錯誤信息,錯誤
分析清楚后,要重新調入編輯程序進行修改,然后重新匯編,再經(jīng)過連接,直至無錯為
止。連接以后,便產(chǎn)生了可執(zhí)行程序文件(EXE文件)。
(四)程序的執(zhí)行
當我們建立了可執(zhí)行文件ABC.EXE后,就可直接在DOS下執(zhí)行該程序:
OABC
根據(jù)程序提示,輸入一個年份,計算機會輸出是否閏年的結果。
五'實驗要求與提示
1、實驗要求
(1)掌握匯編語言程序設計上機過程;
(2)回答思考問題;
(3)記錄實驗結果。
2、實驗提示
按照圖1.1的上機過程進行實驗。
六、思考與練習以及測評標準
(1)匯編過程中MASMABC和MASMABC.ASM的結果是否一致。
(2)連接過程中LINKABC和LINKABC.OBJ的結果是否一致。
(3)使用Word如何錄入?yún)R編語言源程序。
實驗二Debug的使用(基礎與驗證型)
一'實驗要求和目的
熟練掌握動態(tài)調試程序DEBUG的使用;
二、軟硬件環(huán)境
1、硬件環(huán)境:微機CPU486以上,500MB以上硬盤,32M以上內存;
2、軟件環(huán)境:裝有MASM5.0、Debug、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等應用
程序。
三'實驗涉及的主要知識單元
通過編輯、匯編和連接后的程序是可以執(zhí)行的程序.但是,一個程序特別是比較復雜
的程序不能保證沒有一點錯誤。因此,在投入正式運行前必須進行調試,以檢查程序的正
確性。調試程序Debug就是用來調試匯編語言程序的一種工具。Debug的主要功能有顯示
和修改寄存器及內存單元的內容:按指定地址啟動并運行程序:設置斷點使程序分段運
行,以便檢查程序運行過程中的中間結果或確定程序出錯的位置;反匯編被調試程序,它
將一個可執(zhí)行文件中的指令機器碼反匯編成助記符指令并同時給出指令所在的內存地址;
單條追蹤或多條追蹤被調試程序,它可以逐條指令執(zhí)行或幾條指令執(zhí)行被調試程序,每執(zhí)
行一條(或幾條)指令后,Debug程序將中斷程序的運行并提供有關結果信息;匯編一段程
序,在Debug的匯編命令下可以直接輸入助記符指令,并將其匯編成可運行程序段。此
外,Debug還可以將磁盤指定區(qū)的內容或一個文件裝入到內存或將內存的信息寫到磁盤上
等等。
啟動Debug程序:在DOS狀態(tài)下可以用下面的命令啟動Debug
DEBUG[路徑文件名.
Debug后面的文件名及路徑是指被調試程序的文件名及路徑,Debug后面的文件必須
是程序的可執(zhí)行文件,其擴展名可以是.EXE或.COM。在此命令后,DOS將調試程序
Debug調入內存,Debug接著將被調程序送入內存。比如:DEBUG123.EXE
調試程序Debug的主要命令如下:
(―)顯示內存單元內容的命令D
格式⑴:-D地址
從指定地址開始,顯示128個字節(jié)的內容,每一行的左邊顯示段內偏移地址,接著顯
示16個單元的內容,最右邊區(qū)域則顯示這一行的16個單元所對應的可顯示的字符。若無
可顯示的字符,則用圓點(小數(shù)點)填充。
D命令中的地址可為段內偏移量,也可為段基址和段內偏移量兩部分,中間用冒號隔
開,如1680:0110,即指段基址為1680H,段內偏移量為0110H。Debug中所顯示的數(shù)據(jù)
均為十六進制數(shù),且省去了后面的H標志。
格式(2):-D范圍
將顯示指定地址范圍內的內存單元的內容,起始地址可由段基址及段內偏移量兩個部
分組成,中間用冒號“:”隔開,也可以只指出段內偏移量,而此時的段基址在DS中。
這里所說的范圍包含起始地址和結束地址。
比如一DDS:10001020
將顯示數(shù)據(jù)段偏移地址為1000H到1020H的內容。
(二)修改內存單元內容的命令E
格式(1):-E地址內容表
它的功能是用給定的內容表去代替所指定的內存單元的內容。
例如:
EDS:011041'CLOSEz41
該命令執(zhí)行后,將用列表中的7個字符填入從DS:0110到口5:0116的7個存儲單元
中。
格式(2):E地址
它的功能是可以連續(xù)地逐個修改內存單元的內容。當屏幕上顯示指定單元的地址和內
容之后,可采取下列辦法:
①若指定單元的內容需要修改,則將新的內容的十六進制數(shù)輸入,再按空格鍵,修改
便告完成,然后顯示下一個存儲單元的地址及內容,若需要修改,可進行同樣的操作。若
某一個單元的內容不需要修改,而操作又要進行下去,則可直接按空格鍵。
②若需要顯示前一個單元的地址和內容,則輸入連接號',若要修改,則輸入新的
內容;若顯示前一個單元的地址和內容仍要修改,則可進行同樣的操作;若顯示的內容不
需要修改,則可直接按'鍵,使該操作由高地址向低地址單元連續(xù)不斷地進行。
③按<CR>鍵,結束E命令。
(三)檢查和修改寄存器內容的命令R
格式(D:R
此時將顯示所有寄存器的內容和全部標志位的狀態(tài),以及現(xiàn)行CS:IP所指的機器指
令代碼和反匯編符號。
格式(2):R寄存器名
該格式可用于檢查和修改指定寄存器的內容。若不修改其內容,可按<CR>鍵,若需要
修改其內容,可以輸入1-4個十六進制數(shù),再按<CR>鍵。
格式(3):RF
該格式可用于顯示標志和修改標志位狀態(tài)。
當系統(tǒng)給出標志位狀態(tài)后,可采取下列辦法:
①若不需要修改任一標志位,可按<CR>鍵。
②若需要修改一個或多個標志位,可輸入其相反的值。各標志位之間可以無空格且與
順序無關,修改后按<CR>鍵。
由于標志位狀態(tài)顯示時,是用下列特殊符號表示的,因而修改時,只要輸入規(guī)定的符
號即可。下面是標志名和狀態(tài)符號的對照表:
標志名置位符號復位符號
溢出標志OF(是/否)OVNV
方向標志DF(減/增)DNUP
中斷標志IF(允許/禁止)EIDI
符號標志SF(負/正)NGPL
零標志ZF(是/否)ZRNZ
輔助進位標志AF(是/否)ACNA
奇偶校驗標志PF(偶/奇)PEPO
進位標志CF(是/否)CYNC
只有追蹤標志TF,不能用指令直接修改。
例如:輸入RF命令,系統(tǒng)可能作出如下響應:
OVDNEINGZRACPECY-
若現(xiàn)在要修改奇偶、零、中斷和溢出標志位,可在光標處輸入:
PONZDINV<CR>
(四)運行程序命令G
格式:G[=地址][地址[地址…]]
該命令可以在程序運行中設置斷點。它是Debug程序進行程序調試的主要命令之一。
示例:-g001a則執(zhí)行從當前cs:ip至001a的指令,注意:地址設置必須從指令的第一字
節(jié)設起。
①第一個參數(shù)“=地址”規(guī)定了程序執(zhí)行的起始地址,以CS內容作段地址,等號后面
的地址只需給出地址偏移量。此時,命令G與地址之間的等號不能省去。
如果在G命令執(zhí)行前,已經(jīng)設置了CS值和IP值,則也可以直接用G命令,從指定地
址執(zhí)行程序。
②格式中后面給出的地址是指斷點地址,最多可設置10個斷點。當程序執(zhí)行到一個斷
點時,就停下來,顯示CPU各寄存器的內容和標志位的狀態(tài),以及下一條待執(zhí)行的指令,
被調試程序的所有斷點全部被取消,并返回Debug。
③地址參數(shù)所指的單元,必須包含有有效的8088指令的第一個字節(jié),否則將產(chǎn)生不可
預料的結果。
④堆棧必須至少包含有6個可用字節(jié),否則也將產(chǎn)生不可預料的結果。
⑤若斷點地址只包括地址偏移量,則認為段地址在CS寄存器中。
(五)追蹤命令T
格式⑴:T[=地址]
該命令可以在指令執(zhí)行中進行追蹤,若略去地址,則從CS:IP現(xiàn)行值執(zhí)行。每一次T
命令都執(zhí)行一條指令。
格式(2):T[=地址][值]
此時,它可對多條指令進行追蹤,即在執(zhí)行了由值所指定的若干條指令之后,停止執(zhí)
行并顯示各寄存器的內容和各標志位,還指出下一條待執(zhí)行的指令。
(六)匯編命令A
若在調試目標程序的過程中,要求改寫或增添一段目標程序,則可以用A命令直接在
Debug下實現(xiàn)。
格式:A[地址]
該命令可以從指定地址開始,將輸入的匯編語言語句立即匯編成機器代碼,連續(xù)存放
在內存單元中。在程序輸入完畢后,最后一行不輸入內容,直接按回車鍵,即可返回
DEBUG程序,還可用反匯編命令U對剛輸入的內容進行反匯編,以驗證輸入的程序是否
正確。
使用A命令應遵守以下規(guī)則:
①所有輸入數(shù)值,均為十六進制數(shù)。
②前綴助記符,必須在相關指令的前面輸入,可以在同一行,也可以在不同行輸入。
③段超越助記符為CS:、DS:、ES:、SS:o
④遠調用時的返回指令助記符用RETF。
⑤使用串操作指令時,助記符中必須注明是字節(jié)還是字傳送。
⑥匯編語言能自動匯編短、近和遠的轉移及近和遠的調用,也能由NEAR和FAR前
綴來超越。
例如:
0110:0600JMP602;短轉移
0110:0602JMPNEAR605;近轉移
0110:0605JMPFAR60A;遠轉移
第一條JMP指令中含有一個字節(jié)偏移量。
第二條JMP指令中含有兩個字節(jié)偏移量。
第三條JMP指令中含有兩個字節(jié)的偏移量及兩個字節(jié)的段地址。
⑦當DEBUG不能確定某些操作數(shù)涉及的是字類型存儲單元還是字節(jié)類型的存儲單元
時,在這種情況下,必須用前綴“WORDPTR”或“BYTEPTR”來加以說明。
例如:
NEGBYTEPTR[128]
DECWORD[SI]
⑧當Debug不能確定一個操作數(shù)是立即數(shù)還是存儲單元的地址時,可以把地址放在方
括號中。
⑨兩個最常用的偽指令DB和DW可以在A命令中使用,用來直接把字節(jié)或字的值送
入相應的存儲單元。
例如:
DB2,5,3,4,'THISISANEXAMPLEz
DW6000,2000,7000,'BA'
⑩Debug支持所有形式的寄存器間接尋址命令。
例如:ADDBX,74LBP+3][SI-5]
POP[BX+DI]
(七)反匯編命令U
格式(1):U地址
該命令從指定的地址開始,反匯編32個字節(jié)。若略去指定地址,則以上一個U命令
反匯編的最后一條指令地址的下一條指令地址作為起始地址;若沒有用過U命令,則以由
Debug初始化的段寄存器的值作段地址,以100作為地址偏移量。
格式(2):U范圍這種格式的命令,可以對指定范圍的內存單元進行反匯編,范圍可以
由起始地址、結束地址(只能包含地址偏移量)或起始地址及長度來指定。其命令格式如:
U04BA:1000108或U04BA:0100L7
兩者是等效的。
(A)輸入命令I
格式:I端口地址
該命令從指定端口輸入一個字節(jié)并顯示。
例如:I2E8
CC
它表示所顯示的是從02E8端口輸入的一個字節(jié)為CCo
(九)輸出命令0
格式:0端口地址字節(jié)值
其功能是向指定的端口輸出一個字節(jié)。
例如:02E812
它表示將一個字節(jié)12H送到輸出端口2E8。
(十)命名命令N
格式:N文件標識符[文件標識符]
該命令用給定的兩個文件標識符格式化在CS:5C和CS:6C的兩個文件控制塊中(若在
調用Debug時具有一個文件標識符,則它已格式化在CS:5c的文件控制塊中),文件控制
塊是將要介紹的裝入命令L和寫命令W所需要的。
N命令能把文件標識符和別的參數(shù)放至CS:81開始的參數(shù)保存區(qū)中。在CS:80中保存
輸入的字符個數(shù),寄存器AX保存前兩個文件標識符中的驅動器標志。
例如:
A>DEBUG<CR>
NTEST<CR>
L<CR>
N命令后,用L命令可將TEST調入自己的CS:100開始的存儲區(qū)中。若對正在調試的
程序TEST進行調試時,需要用到其它的文件標識符及其它參數(shù),也可用N命令加以實
現(xiàn)。;
例如:
A>DEBUGTEST<CR>
N文件1文件2<CR>
(H■*一)裝入命令L
格式1:L〈地址》〈驅動器號》〈起始邏輯扇區(qū)〉〈所讀扇區(qū)個數(shù)n>
其中〈地址》的缺省值為CS:100。邏輯扇區(qū)可由物理扇區(qū)號換算得到,以雙面雙密
度盤為例:物理扇區(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ū)號的對應關系為物理扇區(qū)。面。道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號為0—8;物理扇區(qū)1
面。道1扇區(qū)至9扇區(qū),邏輯扇區(qū)號為9—11H;物理扇區(qū)。面1道1扇區(qū)至9扇區(qū),邏輯
扇區(qū)號為12—1AH;……o這樣每道先0面后1面一直排下去。
其中〈驅動器號>為0、1或2,0表示A驅,1表示B驅,2表示硬盤。
功能:將〈驅動器號〉指定的盤上,從〈起始邏輯扇區(qū)》起,共n個邏輯扇區(qū)上的所有字
節(jié)順序讀入指定內存地址開始的一片連續(xù)單元。當L后的參數(shù)缺省時,必須在L之前由N
命令指定(或進入DEBUG時一并指出)所讀驅動器文件名。此時L執(zhí)行后將該文件裝入內
存。
例如:-NEXAMPLE<Enter>
-L<Enter>
將當前驅動器上的EXAMPLE文件裝入CS:100起始的一片內存單元。
格式2:L地址或L
該命令把已在CS:5C中格式化的文件控制塊所指定的文件裝入到指定區(qū)域中。
若省略地址,則裝入到CS:100開始的內存區(qū)域中。
若是帶有擴展名COM或.EXE文件,無論命令中是否指定了地址,一律裝入到CS:100
開始的內存區(qū)域中去。
通常在BX和CX中包含了所讀入文件的字節(jié)數(shù),但對具有擴展名.EXE文件,則BX
和CX中還包含實際程序長度。
(十二)寫命令W
功能:為L/W命令指定待裝入/寫盤文件
格式1:W〈地址>〈盤號》〈起始邏輯扇區(qū),〈所寫邏輯扇區(qū)數(shù)n>
功能:與L命令不同的地方是將內存從〈地址>起始的一片單元內容寫入指定扇區(qū)。只
有W而沒有參數(shù)時,與N命令配合使用將文件寫盤。該命令把由地址所指定的內存區(qū)域
中的數(shù)據(jù)寫入指定的驅動器。若地址中只包含偏移量,則段地址在CS中。
其中,扇區(qū)號決定了寫入起始扇區(qū);區(qū)段數(shù)決定了寫入的區(qū)段個數(shù);扇區(qū)號和區(qū)段數(shù)
均用十六進制數(shù)表示。
格式2:W地址或W
該命令把指定內存區(qū)域中的數(shù)據(jù),寫入到由CS:5c處的文件控制塊所規(guī)定的文件中
去。若省略地址,則內存區(qū)域從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)現(xiàn)有一個雙字加法源程序如下,其中存在錯誤。現(xiàn)假設已匯編、連結生成了可執(zhí)
行文件HB.EXE,存放在d:\MASM目錄下。請使用Debug對其進行調試。
CodeSEGMENT
ASSUMECS:code,DS:code
ORG100H;從10011處開始存放下列指令
Start:MOVAX,code;將口$置成code段的首地址
MOVDS,AX
MOVSI,200H;取第一個數(shù)的首地址
MOVAX,[SI];將第一個數(shù)的低16位取到AX
MOVDl,204H;取第二個數(shù)的首地址
ADDAX,[DI];第一個數(shù)和第二個數(shù)的低16應相加
MOV[SI+8],AX;低16位相加的結果送到20811和209H單元
MOVAX,[SI+2];取第一個數(shù)的高16位送到AX中
ADDAX,[DI+2];兩個數(shù)的高16位相加
MOV[SI+OAH],AX;高16位相加的結果送到20AH,20BH單元
MOVAX,4C00H;使用DOS的4al號功能調用
INT21H;進入功能調用,返回DOS
ORG200H;從20(^處開始存放下列數(shù)據(jù)
DD12345678h,654387A9h,Oh;被加數(shù)、加數(shù)、和
CodeENDS
ENDstart
調試過程:
①進入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中默認的進制是十六進制。
③以單步工作方式開始運行程序
首先用T命令順序執(zhí)行用戶程序的前1兩條指令,將段寄存器DS預置為用戶的數(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ù)段初始內容
-D20020F<Enter>
18A2:020078563412A9874365-0000000000741350xV4...Cet.P
⑤連續(xù)工作方式運行程序至返回DOS前(設斷點),查看運行結果。為此,現(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
可見,要執(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ù),查看運行結果。為此,首先用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,錯誤。說明程序有問題。
⑦再將斷點設在完成低位字加法后,查看運行結果。
-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,正確。說明錯誤可能出在后面
⑧使用T命令從剛才的斷點處向后單步調試,查看運行結果。
-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寄存器的結果為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)觀察寄存器初始狀態(tài)
(3)以單步工作方式開始運行程序
(4)觀察用戶程序數(shù)據(jù)段初始內容
(5)繼續(xù)以單步工作方式運行程序
(6)連續(xù)工作方式運行程序
(7)修改程序和數(shù)據(jù)
(8)運用斷點調試程序
六、思考與練習以及測評標準
(1)如何啟動和退出Debug程序。
(2)整理每個Debug命令使用的方法,實際示例及執(zhí)行結果。
(3)啟動Debug后,要裝入某一個.EXE文件,應通過什么方法實現(xiàn)?
(4)用Debug調試程序時,如何設置斷點?
⑸編寫計算下面函數(shù)值的程序:
\,x>0
y=<0,x=0
-l,x<0
設輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量,使用Debug查看X、Y兩個變量的
數(shù)據(jù)。
⑹分類統(tǒng)計字數(shù)組data中正數(shù)、負數(shù)和零的個數(shù),并分別存入內存字變量
Positive、Negative和Zero中,數(shù)組元素個數(shù)保存在其第一個字中。使用
Debug查看Positive、Negative和Zero三個變量的數(shù)據(jù)。
七'參考程序
;CH1EX1.ASM
編寫計算下面函數(shù)值的程序:
'\,x>Q
y=<0,x=0
-l,x<0
設輸入數(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進行比較
JGEAl;X20轉Al
MOVYr1;X<0時,/fY
JMPEXIT
Al:JGA2;X>0轉A2
MOVY,0;X=0時,0~Y
JMPEXIT
A2:MOVY,1;X>0,l-Y
EXIT:MOVAH,4CH
INT21H
CODEENDS
ENDSTART
Debugchlexl.exe
|cAC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年地圖信息科學考試試題及答案
- 2025年金融專業(yè)基礎知識考試試題及答案
- 疾病認知訓練方案
- 墻繪設計方案匯報
- 讀好書綜合實踐活動
- T/TMAC 018.F-2020技術轉移服務場所衛(wèi)生規(guī)范
- 讀書心得花邊設計技巧
- 水晶文字排版設計
- 醫(yī)療手衛(wèi)生規(guī)范培訓
- 2025年智慧體育項目立項申請報告模范
- 2024年中石油招聘考試真題
- 企業(yè)環(huán)保與健康安全管理體系的構建與實施
- 《抽水蓄能電站樞紐布置格局比選專題報告編制規(guī)程 》征求意見稿
- 廣東省深圳市2025年高三年級第二次調研考試數(shù)學試題(含答案)
- 山東省山東名校考試聯(lián)盟2025年高三4月高考模擬考試物理試卷+答案
- 供應商維保管理制度
- 行政事業(yè)單位內部控制信息系統(tǒng)建設實施方案
- 山東棗莊科技職業(yè)學院棗莊工程技師學院招聘考試真題2024
- 小學網(wǎng)球教學教案網(wǎng)球
- 露天礦安全警示教育
- 制造業(yè)質量控制計劃
評論
0/150
提交評論