重慶交通大學(xué)微型計算機原理實驗指導(dǎo)報告_第1頁
重慶交通大學(xué)微型計算機原理實驗指導(dǎo)報告_第2頁
重慶交通大學(xué)微型計算機原理實驗指導(dǎo)報告_第3頁
重慶交通大學(xué)微型計算機原理實驗指導(dǎo)報告_第4頁
重慶交通大學(xué)微型計算機原理實驗指導(dǎo)報告_第5頁
已閱讀5頁,還剩179頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

〈篇一部分

DIYIBUFEN

匯編語言程序設(shè)計實驗

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

第1章

程序調(diào)試工具DEBUG的使用

i.i實驗?zāi)康?/p>

(1)熟悉DEBUG的常用命令。

(2)掌握DEBUG下運行簡單匯編語言源程序的過程及方法。

(3)掌握DEBUG調(diào)試匯編語言源程序的過程及方法。

1.2預(yù)備知識

在MS-DOS,Windows98、Windows2000、WindowsXP、Vista和Windows7中都提供有程

序調(diào)試工具DEBUG,其文件名是DEBUG.EXE,可以在命令提示符“>”下運行之。在進

入DEBUG的提示符之后,用戶可以通過DEBUG的匯編命令輸入?yún)R編語言源程序,并

將其匯編成機器語言程序加載存儲到指定的地址空間,然后便可運行、調(diào)試輸入的程序。

使用DEBUG運行匯編語言程序簡單方便,但只能編寫僅含一個代碼段的小型程序,這

對學(xué)習(xí)匯編語言的指令,了解、熟悉指令的功能帶來極大的方便。

1.3DEBUG命令

調(diào)試程序DEBUG有如下的功能特點:

(1)在受控環(huán)境中測試程序;(2)裝

入、顯示、修改任何文件;(3)執(zhí)行

DOS程序;(4)完成對磁盤的讀、寫

操作;

(5)建立或匯編匯編語言程序。

1.啟動DEBUG的命令格式

在命令提示符下啟動DEBUG的完整格式如下:

[drive:][path]DEBUG[d:][p][filename][.exe][param...]

其中:

drive:指定DEBUG文件存放的磁盤驅(qū)動器標識符,DEBUG是操作系統(tǒng)的外部命令,

所以必須把它從磁盤讀入內(nèi)存。若未指定,操作系統(tǒng)將使用當(dāng)前默認磁盤驅(qū)動器。

Path:是操作系統(tǒng)查找DEBUG文件的一個子目錄串表示的路徑。若未指定,DOS將使

用當(dāng)前工作目錄。

注意:在Windows98,Windows2000、WindowsXP和Windows7下,操作系統(tǒng)已經(jīng)把

DEBUG.EXE存放的位置作為命令提示符下查找文件的搜索路徑之一,所以直接輸入

“DEBUG”并按回車鍵就可以啟動DEBUG,勿需指出DEBUG.EXE在機器中存儲的位置。

d:是DEBUG將要調(diào)試的文件所在的磁盤驅(qū)動器。

P:是查找DEBUG將要調(diào)試的文件所需的子目錄路徑。若未指定,DOS使用當(dāng)前目

錄。

filename[.exe]:是DEBUG將要調(diào)試的文件名。param:是將被調(diào)試的程序(或文件)

的命令行參數(shù)。

說明:

①啟動DEBUG后,DEBUG完成初始化操作,若沒有指定調(diào)試的文件,則在啟動DEBUG

后:

?段寄存器CS、DS、ES和SS置為DEBUG程序后的第一個段。?指

令指針寄存器IP置為100H(程序段前綴PSP后的第一個語句)。

?堆棧指針SP置為段末或COMMAND.COM(DOS的命令解釋器)暫駐部分的結(jié)束

地址(其中較小的那個地址)。

?其余通用寄存器均置為0,標志寄存器置為下述狀態(tài):

NVUPEIPLNENAPONC

即:程序狀態(tài)字的OF=0、DF=0>IF=kSF=O、ZF=0、AF=0、PF=O、

CF=Oo

②如果DEBUG命令行含有文件名,段寄存器DS和ES指向PSP。寄存器BX|CX

為程序長度,即讀入文件的字節(jié)數(shù)。

2.DEBUG的單字母命令

表1.】DEBUG使用單字符命令表

命令格式命令格式

匯編A[地址]命名N[設(shè)備:][路徑]文件名[.擴展名]

比較C[范圍]輸出0口地址

轉(zhuǎn)出D[范圍]或[地址]繼續(xù)執(zhí)行P『地址][值]

鍵入E地址[表]退出Q

填入F范圍表寄存器R[寄存器]

執(zhí)行G[=地址][地址[地址…]]搜索S范圍表

十六進制H值值跟蹤T[=地址]或[范圍]

輸入I口地址反匯編U[地址]或[范圍]

裝入L[地址[設(shè)備扇區(qū),扇區(qū)]]寫W[地址[設(shè)備扇區(qū),扇區(qū)]]

移動M范圍地址

DEBUG命令是在DEBUG提示符下,由鍵盤鍵入的。每條命令以單個字母的命令

符開頭,然后是命令的操作參數(shù)。DEBUG命令操作的共同特點有:

(1)DEBUG接受和顯示的數(shù)都用十六進制數(shù)表示,都不用尾標“H”。

(2)命令和參數(shù)都不區(qū)分大、小寫,可以用大寫、小寫或混合方式輸入。

(3)命令和參數(shù)間,可以用定界符分隔(空格、制表符、逗號等)。但是,定界符只是

在兩個相鄰接的16進制數(shù)之間是必需的。因此下面的命令是等效的:

-DCS:100110

-DCS:100,110

-D,CS:100,110

(4)若DEBUG檢查出一個命令的語法錯誤,則DEBUG將用"Error”指出。例如:

-des:100cs:l10

AError

(5)在輸入DEBUG的命令行時,可以用常用的編輯鍵。

(6)可以用Ctrl+Break組合鍵或Ctrl+C組合鍵來中斷一個命令的執(zhí)行,返回到

DEBUG的提示符。

(7)若一個命令產(chǎn)生相當(dāng)多的輸出行時,為了能看清屏幕上的顯示內(nèi)容,可以按Ctrl+S

組合鍵,暫停顯示輸出。

(8)表示地址的參數(shù)通常表示一個內(nèi)存區(qū)域的開始地址和結(jié)束地址,由段地址和偏移地

址兩部分組成。段地址可以用一個段寄存器或4位十六進制數(shù)表示,偏移地址只能用4位

16進制數(shù)表示。段地址和偏移地址之間用冒號作為分隔符。

(9)端口地址只用于輸入輸出命令,是一個兩位的十六進制數(shù)。

(10)參數(shù)中的驅(qū)動器號是指磁盤讀寫操作的驅(qū)動器,0代表驅(qū)動器A,1代表驅(qū)動器

B,2代表驅(qū)動器C,3代表驅(qū)動器D……

3.匯編命令A(yù)(Assemble)

-A[address]

功能:該命令允許鍵入?yún)R編語言語句,并能把它們匯編成機器代碼,相繼地存放在從指

定地址開始的存儲區(qū)中。

說明:

①輸入程序時,以回車結(jié)束一行語句的輸入,同時提示下一行語句的起始地址。如:

^3F:O100

當(dāng)程序輸入結(jié)束時,在提示的地址后面鍵入回車結(jié)束匯編操作,返回DEBUG提示符。②在

DEBUG下鍵入的數(shù)字均看成十六進制數(shù),所以如要鍵入十進制數(shù),則要轉(zhuǎn)換為十六

進制數(shù)后,在鍵入。如100D轉(zhuǎn)換為64H后輸入(仍不能輸入尾

標)。③命令中提供地址的形式有三種:

?段地址:偏移地址^

段寄存器:偏移地址^

偏地址

如果不給出段地址,是用CS的值作為段地址;如果不提供存儲地址,是以CS:0100

作為地址。

4.比較命令C(Compare)

實現(xiàn)內(nèi)存數(shù)據(jù)間的比較,其格式為:

-Crangeaddress

range:是源地址范圍,由〈起始地址》〈終止地址〉指出的一片連續(xù)的內(nèi)存單元,或由(起

始地址>L〈長度)指定的存儲區(qū)域。

addres:目標起始地址。

功能:從range的起始地址單元起,逐個與address以后的單元順序比較,直到源地址

終止為止。遇到有不一致的字節(jié),以〈源區(qū)地址〉〈源區(qū)內(nèi)容》〈目標區(qū)內(nèi)容》〈目標區(qū)地址>

的形式顯示失配單元的內(nèi)容。

例:下面兩條命令是等效的,都將對內(nèi)存中從CS:0100開始的10個字節(jié),與從

CS:1000開始的10個字節(jié)進行比較:

-C01000108,0000

073F:010000CD073F:0000

073F:O10100Z0073F:O001

073F:010Z003E073F:00QZ

O73F:010300A?073F:O003

973F:O10500EA073F:00G5

0?3F:O10600FDO73F:0006

073F:0107GOFF073F:OOO7

0?3F:O1G800AD073F:0OG8

5.顯示存儲單元的命令D(Dump)

-DJaddress]或

-Dfrange]

功能:以兩種形式顯示指定內(nèi)存范圍的內(nèi)容。一種為十六進制形式的內(nèi)容,一種形式為

相應(yīng)字節(jié)的ACII碼,對非字符字節(jié)以代替。

例如,按指定范圍顯示存儲單元內(nèi)容的方法為:

PdlOQlZO

O73F:01000000000000000000-0000000000000000

G?3F:0110000000GOGO000000-000000003400ZE074...

P73F:01Z00O.

其中0100至0120是DEBUG顯示的單元內(nèi)容。左邊用十六進制表示每個字節(jié),右邊用ASCII

字符表示每個字節(jié),表示非字符字節(jié)。這里沒有指定段地址,D命令自動顯示DS段的內(nèi)

容。如果只指定首地址,則顯示從首地址開始的80個字節(jié)的內(nèi)容。如果完全沒有指定地址,

則顯示上一個D命令的最后一個單元的內(nèi)容。

6.修改存儲單元內(nèi)容的命令E(Enter)

輸入命令E,有兩種格式如下:

第一種格式可以用給定的內(nèi)容表來替代指定范圍的存儲單元內(nèi)容。命令格式為:

-Eaddress[list]

其中l(wèi)ist為用空格作為分隔符的字節(jié)數(shù)據(jù)表。

功能:將[list]的內(nèi)容寫入address為起始地址的一片存儲單元。例如:

-EDS:100

0?3F:01O000.

其中F3,X,Y,Z和8D各占一個字節(jié),該命令可以用這五個字節(jié)來替代存儲單元

DS:0100-0104的原先的內(nèi)容。

第二種格式則是采用逐個單元相繼修改的方法。命令格式為:

-Eaddress

功能:顯示address指定的存儲單元內(nèi)容,等待用戶輸入更新值,輸入修改值后按空格

后,又顯示下一單元的內(nèi)容,并等待用戶輸入新值……這樣可以連續(xù)修改多個連續(xù)存儲單元的

值,回車結(jié)束該命令的執(zhí)行。例如:

-ECS:10O

073F:010OGO.

如果需要把該單元的內(nèi)容修改為78,則可以直接鍵入78,再按空格鍵可接著顯示下一

個單元的內(nèi)容,這樣可以不斷修改相繼單元的內(nèi)容,直到Enter鍵結(jié)束該命令為止。

7.填寫內(nèi)存單元命令F(Fill)

-Frangelist

功能:將list中的內(nèi)容逐字節(jié)填入指定的地址范圍,list中的內(nèi)容使用完后會自動重復(fù)使

用。

例如,-F4BA:0100L5F3'XYZ'8D

使04BA:0100-0104單元包含指定的五個字節(jié)的內(nèi)容。如果list中的字節(jié)數(shù)超過指定的

范圍,則忽略超過的項;如果list的字節(jié)數(shù)小于指定范圍,則重復(fù)使用list填入,直到填滿

指定的所有單元為止。

8.執(zhí)行程序命令G(Go)

-G[=address1][address2[address3...]]

例如:

-G01000108

AX=0000BX=00O0CX=0000DX=0000SP=0OFDBP=0O0OSI=0OO0DI=OO00

?S=073FES=073FSS=073FCS=073FIP=@100NUUPEIPLNZNAP0NC

O73F:O10O00O0ADD[BX+SI],ALDS:0OOO=CD

功能:從指定地址開始運行程序。其中,addressl指定了運行的起始地址,如不指定則

從當(dāng)前的CS:IP開始運行,后面的地址均為斷點地址。當(dāng)指令執(zhí)行到斷點時,就停止執(zhí)行并

顯示當(dāng)前所有寄存器及標志位的內(nèi)容和下一條將要執(zhí)行的指令。若不指定斷點,則運行到程

序正常結(jié)束為止。

注意:若程序不能正常結(jié)束則可導(dǎo)致退出DEBUG狀態(tài),返回命令提示符,甚至死機。

9.十六進制算術(shù)運算指令H(Hex)

完成兩個十六進制數(shù)的加、減運算,格式為:

-Hvaluelvalue2

第1章程序調(diào)試工具DEBUG的使用?

功能:求十六進制數(shù)valuel和value2的和與差,并顯示結(jié)

果。例:

-haf

-haf

9019FFFB

顯示的第一個數(shù)為和,第二個數(shù)為差。

10.端口輸入命令I(lǐng)(Input)

顯示指定輸入接口中輸入的數(shù)據(jù)。其格式為:

-Iport

功能:將指定端口port輸入的數(shù)據(jù)顯示在屏幕上。

11.裝入命令L(Load)

裝入命令把磁盤上指定扇區(qū)范圍的內(nèi)容裝入存儲器從指定地址開始的區(qū)域中?其格式為:

-L[address][drive][firstsector][number]

功能:把drive上,從firstsector起,共number個邏輯扇區(qū)上的所有字節(jié),順序讀入指定

的內(nèi)存address的一片連續(xù)單元。當(dāng)L后的參數(shù)缺省時,必須在L之前由N命令指定(或進

入DEBUG時一并指定)所讀盤的文件名,L執(zhí)行后將文件裝入內(nèi)存CS:0100開始的存儲區(qū)中。

說明:

①address為內(nèi)存地址,缺省值為CS:0100o

②drive為驅(qū)動器號,0表示驅(qū)動器A,1表示驅(qū)動器B,2表示驅(qū)動器C,3表示驅(qū)

器D……③firstsector為讀取磁盤邏輯扇區(qū)的起始號,其取值為從0開始的正整數(shù)。

?number是讀取磁盤的邏輯扇區(qū)數(shù)。

12.內(nèi)存數(shù)據(jù)移動命令M(Move)

格式:

-Mrangeaddress

其中源地址和目標地址都只輸入偏移量,段寄存器為DS。

功能:把range中的數(shù)據(jù)移動到目標地址address開始的一片連續(xù)的存儲區(qū)。

13.命名命令N(Name)

-Nfilespecs[fllespecs]

功能:把兩個文件標識符格式化在CS:5CH和CS:6CH的兩個文件控制塊中,以便在

其后用L或W命令把文件裝入內(nèi)存或存入磁盤。filespecs的格式可以是:

[d:][path]filename[.ext]

例如:

-Nmyprog.dat

-L

可把文件myprog.dat裝入存儲器。

14.端口輸出命令0(Output)

向指定的輸出接口輸出數(shù)據(jù)。其格式為:

-Oportbyte

功能:把字節(jié)數(shù)據(jù)byte從指定端口port輸出。

15.逐行跟蹤程序命令P(Proceed)

-P[=address][number]

功能:功能同下面介紹的命令To不同的是,當(dāng)P命令執(zhí)行的是CALL或INTn指令

時,將一次執(zhí)行完整個子程序或中斷處理程序,通過寄存器返回執(zhí)行的結(jié)果。

16.退出DEBUG命令Q(Quit)

-Q

例如:

功能:退出DEBUG,返回命令提示符。本命令無存盤功能,如需存盤應(yīng)先使用W命

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

該命令有三種不同的格式:

(1)顯示CPU內(nèi)所有寄存器內(nèi)容和標志位狀態(tài),其格式為:

-R

其中標志位狀態(tài)的含義可見表1.2o

表1.2標志位含義

標志名標志為1標志為0

OF溢出(是/否)OVNV

DF方向(減量/增量)DNUP

IF中斷(允許/關(guān)閉)E1DI

SF符號(負/正)NGPL

ZF零(是/否)ZRNZ

AF輔助進位(是/否)ACNA

PF奇偶(偶/奇)PEPO

CF進位(是/否)CYNC

hX=0O0OBX=0OGOCX=0GO0DX=OOG0SP=00FDBP=O0O0SI=0000DI=OG00

B)S=073FES=073FSS=073FCS=073FIP=01OOMUUPEIPLNZNAP0NC

P?3F:010O0000ADD[BX+SU,ALDS:GO0O=CD

(2)顯示和修改某個寄存器內(nèi)容,其格式為:

-Rregistername

例如,鍵入

-rax

系統(tǒng)將響應(yīng)如下:

IX0000

即AX寄存器的當(dāng)前內(nèi)容為0000,如不修改則按Enter鍵,否則鍵入欲修改的內(nèi)容如:

-rbx

則把BX寄存器的當(dāng)前內(nèi)容修改為059F。

Frbx

ffiX0000

(3)顯示和修改標志位狀態(tài),命令格式為:

-RF

系統(tǒng)將響應(yīng),如:

卜RF

MUUPEIPLMZNAP0MC-A

此時如不修改其內(nèi)容可按Enter鍵,否則建入欲修改的內(nèi)容,如:

OVDNEINGZRACPECY-PONZDINV

即可,鍵入的順序是任意的。

17.搜尋指定數(shù)據(jù)命令S(Search)

格式:

-Srangelist

功能:在內(nèi)存指定范圍內(nèi)搜索list中的數(shù)據(jù),找到后顯示元素所在地址。

例:

-scs:0100LA37

0B25:0106

表示在[0B25:0106]處找到了一個“7”。

18.逐指令跟蹤程序命令T(Trace)

跟蹤命令T有兩種格式:

(1)逐條指令跟蹤

-T[=address]

例如:-T()100部分顯示如下

AX=0000BX二0000CX=OO00DX=OGOOSP=OOFFBP二0GO0SI=O000DI=0000

DS=073FES=0000SS=073FCS=073FIP=030ONUUPEINGNZNAP0NC

0?3F:03O00000ADD[BX*SU,ALDS:0OO0=CD

功能:從指定地址起執(zhí)行一條指令后停下來,顯示所有寄存器內(nèi)空及標志位的值。如未指

定則從當(dāng)前的CS:IP開始執(zhí)行。

(2)多條指令跟蹤

-T[=address][value]

功能:從指定地址address起執(zhí)行value條指令后停下來。若不給出地址address,則執(zhí)

行CS:IP指定的指令;若沒有提供要執(zhí)行的指令條數(shù),則只執(zhí)行一條指令。

注意:

①若T命令執(zhí)行的是CALL或INTn指令時,將跟蹤到子程序或中斷服務(wù)程序內(nèi)部,

逐條執(zhí)行指令。

②在開始跟蹤執(zhí)行程序的第一條指令時,必須給出程序第一條指令的地址,若繼續(xù)執(zhí)行后

繼指令只需要簡單的輸入命令To

19.反匯編命令U(Unassemble)

反匯編是指對內(nèi)存指定區(qū)域的內(nèi)容,以匯編語句形式顯示,同時顯示地址用相應(yīng)的機器

碼。反匯編命令U有兩種格式。

(1)從指定地址開始,反匯編32個字節(jié),其格式為:

-U[address]

例如:

00QaDDCxsL

00WaDDCxsL

00ADDCxsL

00aDDCxsL

00cDDCxsL

00修aDDExsL

CL

00士aDDxs

DCxL

00正aDs

00aDDCxsL

0NaDDCxsL

-1工

DDCxL

01das

06aDDCxsL

0工eaDDCxsL

0LDDCxsL

1cg

0CknHA

0Lcs,

1E;

0FE

-u100J.

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

如果地址被省略則從上一個U命令的最后一條指令的下一個單元開始顯示32個字節(jié)。

(2)對指定范圍內(nèi)的存儲單元進行反匯編,格式為:

-U[range]

例如:

-U10O10CI

O73F:01000000ADD[BX+SI],AL

073F:O10Z0000ADD[BX+SH,AL

073F:01O40000ADD[BX+SU,AL

073F:O1060000ADD[BX+SH,AL

073F:01G80000ADD[BX+SH,AL

073F:01QA0000ADD[BX+SD,AL

073F:O10C0000ADD[BX+SU,AL

說明:在進行反匯編操作時,一定要確認指令的起始地址后在操作,否則將得不到正確

的結(jié)果。連續(xù)進行反匯編操作時.,可以省略地址,DEBUG自動以上-U命令操作結(jié)束后的

下一地址為反匯編的起始地址。

20.寫命令W(Write)

寫命令W有兩種功能:

(1)把數(shù)據(jù)寫入磁盤的指定扇區(qū)。其格式為:

-W[address][drive][firstsector][number]

功能:把內(nèi)存中,從地址address開始的連續(xù)區(qū)域的數(shù),寫入驅(qū)動器drive指定的磁盤

中,寫入磁盤的第一個扇區(qū)為firstsector,扇區(qū)數(shù)為numbero

(2)把數(shù)據(jù)寫入指定的文件中。其格式為:

-W[address]

功能:此命令把指定的存儲區(qū)中的數(shù)據(jù)寫入由CS:5CH處的文件控制塊所指定的文件

中。如未指定地址則數(shù)據(jù)從CS10100開始。要寫入文件的字節(jié)數(shù)應(yīng)先放入BX和CX中。

1.4示例

【例1.1]DEBUG下運行如下程序。

MOVDL,IH;字符3的ASCII碼送DL

MOVAH,;使用DOS的2號功能調(diào)用

INT21H;進入功能調(diào)用,輸出‘3'

?io?

第1章程序調(diào)試工具DEBUG的使用?

INT20H;BIOS中斷服務(wù)程序,正常結(jié)束。

該程序運行結(jié)果是在顯示器上輸出一個字符“3”。如果要輸出其他字符,請改變程序中

'33H'為相應(yīng)字符的ASCII碼。

運行步驟:

(1)進入DEBUG

在命令提示符下,鍵入DEBUG<Enter>,即

C:\>DEBUG<Enter>

屏幕顯示:-是進入DEBUG的提示符,在該提示符下可鍵入任意DEBUG命

令?,F(xiàn)在用A命令輸

入程序如下:

(2)輸入程序并匯編

-alOO<Enter>

0B25:0100movdl,33<Enter>

0B25:0102movah,2<Enter>

0B25:0104int21<Enter>

0B25:0106int20<Enter>

0B25:0108<Enter>

至此程序己輸入完,匯編成機器指令,順序存放于CS段100H起始的8個存儲單元。如

果在匯編后想看一下機器指令是什么樣子的話,方法之一是可以用反匯編命令U作如

下操作:

(3)反匯編

-ulOO108<Enter>

0B25:0100B233MOVDL,33

0B25:0102B402MOVAH,02

0B25:0104CD21INT21

0B25:0106CD20INT20

右邊是匯編指令,中間是該匯編指令的機器碼,左邊是存放該條指令的內(nèi)存單元地

址。(4)運行程序

-G<Enter>

3

Programterminatednormally

(5)寫COM文件

-RBX<Enter>

BX0000

:<Enter>

?RCX<Enter>

?11?

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

CX0000:A

<Enter>

-NC:\TEMP\EXCOM.COM<Enter>

-W<Enter>

Writing0000Abytes

其中(BX)*10000H+(CX)用于指定所寫的字節(jié)數(shù),(BX)為該數(shù)的高16位,(CX)

為該數(shù)的低16位。因此,上面的過程實際上是要將0AH個字節(jié)寫入文件

EXCOM.COM,該文件保存在C盤的TEMP子目錄下。

(6)輸入機器指令程序

-E200B233B402CD21CD20<Enter>

(7)顯示內(nèi)存

-D200208<Enter>

169C:0200B233B402CD21CD20-61.3...!..a

(8)執(zhí)行機器指令程序

-G=200<Enter>

3

Programterminatednormally

(9)退出DEBUG返回DOS,執(zhí)行EXCOM.COM文件

-Q

(10)在命令提示符下執(zhí)行程序

C:\TEMP>EXCOM<Enter>

3

C:\TEMP>

【例1.2]進入DEBUG,用A命令輸入字節(jié)數(shù)據(jù)加法程序,用R命令顯示狀態(tài),并

用T命令單條執(zhí)行。

(1)進入并用A命令寫入?yún)R編源程序

C:\DOS>DEBUG

<Enter>-A<Enter>

1392:0100MOVAH,3<Enter>

1392:0102MOVAL,2<Enter>

1392:0104ADDAL,AH<Enter>

1392:0106INT20<Enter>

1392:0108<Enter>

(2)用R命令顯示寄存器狀態(tài)

?12?

第1章程序調(diào)試工具DEBUG的使用?

-R<Enter>

AX=0000BX=0000CX=0000DX=0000SP=OOOOBP=OOOOSI=OOOODI=OOOO

DS=1392ES=1392SS=1392CS=1392IP=0100NVUPEIPLNZNAPO

NC

1392:0100B403MOVAH,03

(3)用G命令執(zhí)行,但看不到計算結(jié)果

-G<Enter>

Programterminatednormally

(4)用T命令單條執(zhí)行,可以看到中間結(jié)果

-T

AX=0300BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0102NVUPEIPLNZNAPONC

1392:0102B002MOVAL,02

-T

AX=0302BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0104NVUPEIPLNZNAPONC

1392:010400E0ADDAL,AH

(5)再執(zhí)行T命令,可以看到最終結(jié)果

(AL)=5

-T

AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0106NVUPEIPLNZNAPONC

1392:0106CD02INT20

-T

AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=011CIP=1094NVUPDIPLNZNAPONC

011C:109490NOP

(6)退出

-Q<Enter>

C:\>

1.5實驗題

【實驗1.1]在DEBUG下運行下述程序,查看執(zhí)行結(jié)果,并將其作為可執(zhí)行文件存入

C盤。

MOVAX,OFEH;被乘數(shù)OFEH送AX

?13?

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

MOVCL,2

SHLAX,CL;被乘數(shù)乘以4,結(jié)果送AXMOVBX,

AX;被乘數(shù)乘以4的結(jié)果送BX保留

MOVCL,2

SHLAX,CL;被乘數(shù)乘以16,結(jié)果送AXADDAX,

BX;被乘數(shù)乘以20,結(jié)果在AX中

MOV[300H],AX;將積存入DS段第300H-301H號內(nèi)存單元

MOVAH,4CH;將功能號4cH送AH

INT21H;執(zhí)行DOS的4CH號功能調(diào)用,結(jié)束程序返回DOS。

該程序運行結(jié)果是將0FEH乘以14H,結(jié)果放在DS段第300H-301H號內(nèi)存單元

中。(1)進入DEBUG,顯示300H至301H號內(nèi)存單元內(nèi)容

C:\>DEBUG<Enter>

-D300301<Enter>

1392:03000000

(2)用A命令裝入程序段并匯編

-A<Enter>

1392:0100MOVAX,OFE<Enter>

1392:0102MOVCL,2<Enter>

1392:0104SHLAX,CL<Enter>

1392:0106MOVBX,AX<Enter>

1392:0108MOVCL,2<Enter>

1392:010ASHLAX,CL<Enter>

I392:0l0CADDAX,BX<Enter>

1392:010EMOV[300],AX<Enter>

1392:0111MOVAH,4C<Enter>

1392:01BINT21<Enter>1392:0116

<Enter>

(3)用T命令執(zhí)行到斷點處(程序正常結(jié)束前)停止

-T=100,8<Enter>

AX=13D8BX=3F80CX=0000DX=0000SP=OOOOBP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0111NVUPDIPLNZNAPONC

1392:0111B44CMOVAH,4C

(4)用D命令顯示300H至301H的內(nèi)容(最終結(jié)果)

-D300301<Enter>

1392:0300D813..

(5)用R命令指定寫盤文件長度

第1章程序調(diào)試工具DEBUG的使用?

-RBX<Enter>

BX3F80

:0<Enter>

-RCX<Enter>

CX0000

:16<Enter>

(6)用N命令命名寫盤文件

-NC:\TEMP\YWZCHF.COM<Enter>

(7)用W命令寫盤

-W<Enter>Writing

00016bytes

(8)用Q命令退出DEBUG環(huán)境,返回命令提示符

-Q<Enter>

C:\>

(9)在DOS環(huán)境運行

YWZCHF.COMC:\TEMP>YWZCHF

<Enter>C:\TEMP>(10)將

YWZCHF.COM裝入內(nèi)存運行

C:\TEMP>DEBUG<Enter>

-NC:\TEMP\YWZCHF.COM

<Enter>-L<Enter>

-T=100,8<Enter>

AX=13D8BX=3F80CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0111NVUPDIPLNZNAPONC

1392:0111B44CMOVAH,4C

-D300301<Enter>

1392:0300D813

(11)用Q命令退出DEBUG環(huán)境,返回DOS

-Q<Enter>

C:\>

【實驗1.2]在DEBUG環(huán)境下,送入一個加法源程序并匯編成可執(zhí)行代碼;將其作為可執(zhí)行

文件JIAFA.COM存儲到C盤;在DOS命令行執(zhí)行可執(zhí)行文件JIAFA.COM;進入DEBUG,

將可執(zhí)行文件JIAFA.COM裝入內(nèi)存CS:100H處運行,并用T命令查看運算結(jié)果。

C:\TEMP>debug

<Enter>-A<Enter>

169C:0100MOVAX,8A6D<Enter>

169C:0103ADDAX,0382<Enter>

?15?

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

169C:0106MOV[0200],AX<Enter>

169C:O1O9MOVAH,4C<Enter>

169C:010BINT21<Enter>

169C:O1OD<Enter>

-RBX<Enter>

BX0000

:<Enter>

-RCX<Enter>

CX0000

:D<Enter>

-NC:\TEMP\JIAFA.COM<Enter>

-W<Enter>

-Q<Enter>

C:\TEMP>

C:\TEMP>DEBUG<Enter>

-NAJIAFA.COM

<Enter>-L<Enter>

-G<Enter>

Programterminated

normally-T=100,3<Enter>

AX=8DEFBX=0000CX=0000DX=0000SP=OOOOBP=OOOOSI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0109NVUPDIPLNZNAPONC

1392:0111B44CMOVAH,4C

-D200201<Enter>

169C:0200EF8D

-Q<Enter>

C:\TEMP>

,16?

第2章匯編語言源程序的上機過程?

第2章

匯編語言源程序的上機過程

2.1實驗?zāi)康?/p>

(1)熟悉匯編語言源程序上機的一般過程和方法。

(2)掌握宏匯編程序MASM5.1和鏈接程序L1NK3.6的使用方

法。(3)了解DEBUG調(diào)試匯編語言源程序的過程及方法。

預(yù)備知識

匯編語言源程序上機實驗的操作一般分為以下四個步驟進行。

1.編輯源程序

利用文本編輯工具(如命令提示符下的EDIT、WINDOWS下的記事本等),生成一個

匯編語言源程序的純文本文件.ASM。在匯編語言源程序中,一行只能寫一條語句,以回車結(jié)

束。例如:

;源程序名:HELLO.ASM;

功能:顯示一個字符串

datasegment

mesagedb"Howdoyoudo.",Odh,Oah,24h

dataends

codesegment

assumecs:code,ds:data

start:movax,data

movds,axlea

dx,mesage

movah,09h

int21h

movah,4ch

int21h

codeends

?17?

?微型計算機原理及應(yīng)用實驗指導(dǎo)?

endstart

在命令提示符下,起動EDIT編輯上述匯編語言源程序的格式為:

C:\temp>edithello.asm

編輯存盤后,便可以在當(dāng)前目錄下生成一個源程序文件hello.asmo

2.匯編源程序

利用匯編器(如MASM5.1、MASM6.il或TASM)對源程序進行匯編,生成目標代碼

文件.OBJ。匯編器按匯編語言的語法檢查源程序,如果源程序中有語法錯誤的行,就不能生

成目標代碼文件。在此種情況下,就要回到第一步,重新編輯源程序,修改語法錯誤的行。

當(dāng)發(fā)現(xiàn)源程序中的某些行含可疑成分或不確定因素時,匯編器會給出警告信息,但仍按缺省

處理辦法生成目標代碼文件。這種情況下,可以重新編輯源程序,消除可疑成分或不確定因

素。

總之,只有匯編器沒有報任何出錯信息和警告信息,生成目標代碼文件,才能結(jié)束編輯

源程序和匯編源程序這兩步的工作。

如果匯編程序MASM.EXE,與源程序文件都存放在當(dāng)前目錄下,上述源程序進行匯編

的格式為:

C:\temp\masmhello.asm

Microsoft(R)MacroAssemblerVersion5.10

Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.

Objectfilename[hello.OBJ]:<Enter>

Sourcelisting[NUL.LST]:<Enter>

Cross-reference[NUL.CRF]:<Enter>

48910+446461Bytessymbolspacefree

0WarningErrors

0SevereErrors

查看當(dāng)前目錄,就可以見到生成的目標代碼文件hello.objo

3.鏈接目標程序

利用鏈接器(如LINK和TLINK)鏈接目標代碼程序和庫函數(shù)代碼生成可執(zhí)行程序文

件.EXE。鏈接器對一個單模塊的連接不會發(fā)生鏈接錯誤,總可以順利地生成可執(zhí)行程序文

件。當(dāng)多個模塊鏈接,或者與庫中的函數(shù)連接時,如果在目標代碼文件或者庫中找不到所需

要的連接信息,鏈接器就會發(fā)出錯誤提示信息,而不生成可執(zhí)行程序文件。這就需要修改源

程序,使得匯編器生成的目標代碼文件含有連接器需要的信息。這樣的修改主要是對偽指令

和匯編語言操作符的修改,或者是對名字符號的修改。這時,又要回到第一步編輯源程序,

重新操作第二步匯編源程序。

如果鏈接程序LINK.EXE,與目標代碼文件hello.obj都存放在當(dāng)前目錄下,上述程序

進行鏈接的格式為:

C:\temp>linkhello.obj<Enter>

Microsoft(R)OverlayLinkerVersion3.60

第2章匯編語言源程序的上機過程?

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

RunFile[HELLO.EXE]:<Enter>

ListFile[NUL.MAP]:<Enter>

Libraries[.LIB]:<Enter>

LINK:warningL4021:nostacksegment

查看當(dāng)前目錄,就可以見到鏈接生成的可執(zhí)行程序文件hello.exe?最后一行的信息是

LINK給出的警告信息,表示沒有堆棧段。該警告信息不影響可執(zhí)行程序文件的生成,生成

的可執(zhí)行程序使用缺省的堆棧(操作系統(tǒng)提供的程序堆棧)。利用動態(tài)調(diào)試工具可以看到缺

省堆棧的位置。

4.調(diào)試可執(zhí)行程序

查執(zhí)行程序文件生成后,就可以在提示符下執(zhí)行該程序。上述程序執(zhí)行的格式是:

C:\temp>hello<Enter>

Howdoyoudo.

如果程序執(zhí)行情況與預(yù)期不同,或執(zhí)行時操作系統(tǒng)報告出錯信息,就要通過調(diào)試工具

(如DEBUG、TDEBUG等)進行動態(tài)調(diào)試,查找程序的問題。查到問題后,又重新回到第

一步,重新開始,修改源程序中的問題。

關(guān)于匯編器和調(diào)試工具的使用,我們在下面將作較詳細的介紹。

2.3示例

【例】設(shè)X和Y均為16位無符號數(shù),寫一個求表達式16X+Y值的程序。

由于表達式中的X和Y是16位數(shù),表達式的結(jié)果可能要超出16位,所以定義兩個

字變量用于保存X和Y,另外用一個32位的雙字變量來保存計算結(jié)果。

(1)利用文本編輯器完成以下程序的編輯。

;源程序名test2.asm

dsegsegment

xxxdw1234h;設(shè)X為1234H

yyydw5678h;設(shè)Y為5678H

zzzdd?;雙字變量,用于保存結(jié)果

dsegends

csegsegment'CODE,;指定代碼段的類別名,以便用MASM6.11匯編

assumecs:cseg,ds:dseg

start:movax,dseg;DS-數(shù)據(jù)段段地址

movds,ax

movax,xxx;AX-X

xordx,dx

movex,16

mulex;DX|AX-X*16

addax,yyy;DX|AX-DX|AX+Y

adcdx,0

movwordptrzzz,ax;zzz—DX|AX

movwordptrzzz+2,dx

movah,4ch;結(jié)束程序,返回操作系統(tǒng)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論