匯編語言程序設(shè)計實驗指導(dǎo)書(2025更新)_第1頁
匯編語言程序設(shè)計實驗指導(dǎo)書(2025更新)_第2頁
匯編語言程序設(shè)計實驗指導(dǎo)書(2025更新)_第3頁
匯編語言程序設(shè)計實驗指導(dǎo)書(2025更新)_第4頁
匯編語言程序設(shè)計實驗指導(dǎo)書(2025更新)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計指導(dǎo)書禹定臣黃淮學(xué)院信息工程學(xué)院2025.02目錄TOC\o"1-2"\h\z\u實驗一調(diào)試程序DEBUG及8086指令使用 3實驗?zāi)康? 3內(nèi)容及步驟: 3實驗報告要求: 4附:Debug命令詳解 5實驗二內(nèi)存操作數(shù)及尋址方法 21實驗?zāi)康? 21實驗內(nèi)容和步驟: 21實驗報告要求: 23實驗三數(shù)據(jù)串傳送和查表程序 23實驗?zāi)康? 23實驗內(nèi)容及步驟: 23實驗報告要求: 25實驗四屏幕字符顯示程序 26實驗?zāi)康? 26實驗內(nèi)容及步驟: 26實驗報告要求: 27實驗五二進制數(shù)顯示成十六進制數(shù)的屏幕字符顯示程序 28實驗?zāi)康? 28實驗內(nèi)容及步驟: 28實驗報告要求: 29實驗六查表指令及子程序嵌套實驗 29實驗?zāi)康? 29實驗內(nèi)容及步驟: 29實驗報告要求: 32實驗七8255接口電路實驗 33實驗要求: 33實驗?zāi)康模?33實驗說明: 33實驗電路: 33實驗程序: 34

實驗一調(diào)試程序DEBUG及8086指令使用實驗?zāi)康?通過實驗掌握下列知識:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG3、DEBUG命令:A,D,E,G,Q,R,T,U,F(xiàn),H。4、BCD碼,ASCII碼及用16進制數(shù)表示二進制碼的方法。5、8086寄存器:AX,BX,CX,DX,F,IP。內(nèi)容及步驟:一、DEBUG命令使用:1、打DEBUG進入DEBUG控制,顯示提示苻'_'。2、用命令F10010F'A'將'A'的ASCII碼填入內(nèi)存。3、用命令D10010F觀察內(nèi)存中的16進制碼及屏幕右邊的ASCII字符。4、用命令F11011F41重復(fù)上二項實驗,觀察結(jié)果并比較。5、用命令E100303132……3F將30H-3FH寫入地址為100開始的內(nèi)存單元中,再用D命令觀察結(jié)果,看鍵入的16進制數(shù)是什么字符的ASCII碼?6、用H命令檢查下列各組16進制數(shù)加減結(jié)果并和你的手算結(jié)果比較:(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758,347FH7、用R命令檢查各寄存器內(nèi)容,特別注意AX,BX,CX,DX,IP及標志位中ZF,CF和AF的內(nèi)容。8、用R命令將AX,BX內(nèi)容改寫為1050H及23A8H。二、8086/8088常用指令練習(xí)1、傳送指令1)用A命令在內(nèi)存100H處鍵入下列內(nèi)容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令檢查鍵入的程序并記錄,特別注意左邊的機器碼。3)用T命令逐條運行這些指令,每運行一行檢查并記錄有關(guān)寄存器及IP的變化情況。并注意標志位有無變化。2、加減法指令:1)用A命令在內(nèi)存100H處鍵入下列內(nèi)容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX2)用U命令檢查鍵入的程序及對應(yīng)的機器碼。3)用T命令逐條運行這些指令,檢查并記錄有關(guān)寄存器及ZF情況。思考:這次運行還是打入T,行不行?怎么辦?用R命令檢查一下IP的內(nèi)容。注意T命令與IP的關(guān)系。3、帶進位加減法:1)用A命令在內(nèi)存200H處鍵入下列內(nèi)容,并用U命令檢查:MOV AH,12MOV AL,84MOV CH,56MOV CL,78ADD AL,CLADC AH,CHMOV DH,A7MOV DL,58SUB DL,7FSBB DH,342)用T命令逐條運行這些指令,檢查并記錄有寄存器及CF內(nèi)容。3)上面這段程序若改用16位操作指令達到同樣結(jié)果,怎么改?試修改并運行之。4、BCD碼加減法1)內(nèi)容:MOV AL,58ADD AL,25DAA2)要求:用A命令鍵入,U命令檢查,T命令逐條運行并記錄有關(guān)寄存器及AF內(nèi)容。實驗報告要求:1、16進制數(shù)加減法手算結(jié)果及實驗結(jié)果2、8086/8088常用指令練習(xí)部分的逐條運行記錄,思考結(jié)果及自編程序運行記錄(列出自編程序)。附:Debug命令詳解1、Debug:A(匯編)直接將

8086/8087/8088

記憶碼合并到內(nèi)存。該命令從匯編語言語句創(chuàng)建可執(zhí)行的機器碼。所有數(shù)值都是十六進制格式,必須按一到四個字符輸入這些數(shù)值。在引用的操作代碼(操作碼)前指定前綴記憶碼。a[address]參數(shù)address指定鍵入?yún)R編語言指令的位置。對

address

使用十六進制值,并鍵入不以“h”字符結(jié)尾的每個值。如果不指定地址,a

將在它上次停止處開始匯編范例a

命令支持所有形式的間接注冊命令,如下例所示:

addbx,34[bp+2].[si-1]

pop[bp+di]

push[si])

還支持所有操作碼同義詞,如下例所示:

loopz100

loope100

ja200

jnbe200

對于

8087

操作碼,必須指定

wait

fwait

前綴,如下例所示:

fwaitfaddst,st(3);thislineassembles

;anfwaitprefix

說明

使用記憶碼

段的替代記憶碼為

cs:、ds:、es:

ss:。遠程返回的記憶碼是

retf。字符串處理的記憶碼必須明確聲明字符串大小。例如,使用

movsw

可以移動

16

位的字串,使用

mov***(文字因故被系統(tǒng)屏蔽)***(文字因故被系統(tǒng)屏蔽)

可以移動

8

位字節(jié)串。

匯編跳轉(zhuǎn)和調(diào)用

匯編程序根據(jù)字節(jié)替換自動將短、近和遠的跳轉(zhuǎn)及調(diào)用匯編到目標地址。通過使用near

far

前綴可以替代這樣的跳轉(zhuǎn)或調(diào)用,如下例所示:

-a0100:0500

0100:0500jmp502;a2-byteshortjump

0100:0502jmpnear505;a3-bytenearjump

0100:0505jmpfar50a;a5-bytefarjump

可以將

near

前綴縮寫為

ne。

區(qū)分字和字節(jié)內(nèi)存位置

當某個操作數(shù)可以引用某個字內(nèi)存位置或者字節(jié)內(nèi)存位置時,必須用前綴

wordptr

或者前綴

byteptr

指定數(shù)據(jù)類型??山邮艿目s寫分別是

wo

by。以下范例顯示兩種格式:

decwo[si]

negbyteptr[128]

指定操作數(shù)

Debug

使用包括在中括號

([])

的操作數(shù)引用內(nèi)存地址的習(xí)慣用法。這是因為另一方面Debug

不能區(qū)分立即操作數(shù)和內(nèi)存地址的操作數(shù)。以下范例顯示兩種格式:

movax,21;loadAXwith21h

movax,[21];loadAXwiththe

;contentsof

;memorylocation21h

使用偽指令

使用

a

命令提供兩個常用的偽指令:db

操作碼,將字節(jié)值直接匯編到內(nèi)存,dw

操作碼,將字值直接匯編到內(nèi)存。以下是兩個偽指令的范例:

db1,2,3,4,"THISISANEXAMPLE"

dbTHISISAQUOTATIONMARK:"

db"THISISAQUOTATIONMARK:"

dw1000,2000,3000,"BACH"2、Debug(轉(zhuǎn)儲)

顯示一定范圍內(nèi)存地址的內(nèi)容。

d[range]

參數(shù)

range

指定要顯示其內(nèi)容的內(nèi)存區(qū)域的起始和結(jié)束地址,或起始地址和長度。有關(guān)有效的range

值的信息,請單擊“相關(guān)主題”列表中的“Debug

說明”。如果不指定range,Debug

程序?qū)囊郧?/p>

d

命令中所指定的地址范圍的末尾開始顯示

128

個字節(jié)的內(nèi)容。

有關(guān)顯示寄存器內(nèi)容的信息,請單擊“相關(guān)主題”列表中的

DebugR(寄存器)。

范例

假定鍵入以下命令:

dcs:10010f

Debug

按以下格式顯示范圍中的內(nèi)容:

04BA:0100544F4D0053415759-4552000000000000TOM.SAWYER

如果在沒有參數(shù)的情況下鍵入

d

命令,Debug

按以前范例中所描述的內(nèi)容來編排顯示格式。顯示的每行以比前一行的地址大

16

個字節(jié)(如果是顯示

40

列的屏幕,則為

8

個字節(jié))的地址開頭。

對于后面鍵入的每個不帶參數(shù)的

d

命令,Debug

將緊接在最后顯示的命令后立即顯示字節(jié)內(nèi)容。

如果鍵入以下命令,Debug

將從

CS:100

開始顯示

20h

個字節(jié)的內(nèi)容:

dcs:100l20

如果鍵入以下命令,Debug

將顯示范圍從

CS

段的

100h

115h

中所有字節(jié)的內(nèi)容:

dcs:100115

說明

當使用

d

命令時,Debug

以兩個部分顯示內(nèi)存內(nèi)容:十六進制部分(每個字節(jié)的值都用十六進制格式表示)和

ASCII

碼部分(每個字節(jié)的值都用

ASCII

碼字符表示)。每個非打印字符在顯示的

ASCII

部分由句號

(.)

表示。每個顯示行顯示

16

字節(jié)的內(nèi)容,第

8

字節(jié)和第

9

字節(jié)之間有一個連字符。每個顯示行從

16

字節(jié)的邊界上開始。

3、Debug:E(鍵入)

將數(shù)據(jù)輸入到內(nèi)存中指定的地址。

可以按十六進制或

ASCII

格式鍵入數(shù)據(jù)。以前存儲在指定位置的任何數(shù)據(jù)全部丟失。

eaddress

參數(shù)

address

指定輸入數(shù)據(jù)的第一個內(nèi)存位置。

list

指定要輸入到內(nèi)存的連續(xù)字節(jié)中的數(shù)據(jù)。

有關(guān)集成記憶碼的信息,請單擊“相關(guān)主題”列表中的

DebugA(匯編)。

有關(guān)顯示內(nèi)存部分內(nèi)容的信息,請單擊“相關(guān)主題”列表中的

DebugD

(轉(zhuǎn)儲)。

++

范例

假定鍵入以下命令:

ecs:100

Debug

按下面的格式顯示第一個字節(jié)的內(nèi)容:

04BA:0100EB.

要將該值更改為

41,請在插入點鍵入

41,如下所示:

04BA:0100EB.41_

可以用一個

e

命令鍵入連續(xù)的字節(jié)值。在鍵入新值后按

SPACEBAR(空格鍵),而不是按

ENTER

鍵。Debug

顯示下一個值。在此范例中,如果按三次

SPACEBAR(空格鍵),Debug

將顯示下面的值:

04BA:0100EB.4110.00.BC._

要將十六進制值

BC

更改為

42,請在插入點鍵入

42,如下所示:

04BA:0100EB.4110.00.BC.42_

假定決定值

10

應(yīng)該是

6F。要糾正該值,請按

HYPHEN

鍵兩次以返回到地址

0101(值10)。Debug

顯示以下內(nèi)容:

04BA:0100EB.4110.00.BC.42-

04BA:010200.-

04BA:010110._

在插入點鍵入

6f

更改值,如下所示:

04BA:010110.6f_

ENTER

停止

e

命令并返回到

Debug

提示符下。

以下是字符串項的范例:

eds:100"Thisisthetextexample"

該字符串將從

DS:100

開始填充

24

個字節(jié)。

++

說明

使用

address

參數(shù)

如果在沒有指定可選的

list

參數(shù)的值情況下指定

address

的值,Debug

將顯示地址和內(nèi)容,在下一行重復(fù)地址,并等待您的輸入。此時,您可以執(zhí)行下列操作之一:

·

替換字節(jié)值。為此,請在當前值后鍵入新值。如果您鍵入的值不是有效的十六進制值,或該值包含兩個以上的數(shù)字,則

Debug

不會回顯無效或額外的字符。

·

進入下一個字節(jié)。為此,請按

SPACEBAR(空格鍵)。要更改該字節(jié)中的值,請在當前值后鍵入新值。如果按

SPACEBAR(空格鍵)時,移動超過了

8

位界限,Debug

程序?qū)@示新的一行并在行首顯示新地址。

·

返回到前一個字節(jié)。為此,請按

HYPHEN

(-)??梢苑磸?fù)按

HYPHEN

(-)

向后移動超過多個字節(jié)。在按

HYPHEN

時,Debug

開始新行并顯示當前地址和字節(jié)值。

·

停止執(zhí)行

e

命令。為此,請按

ENTER

鍵。在任何字節(jié)位置都可以按

ENTER。

使用

list

參數(shù)

如果指定

list

參數(shù)的值,隨后的

e

命令將使用列表中的值替換現(xiàn)有的字節(jié)值。如果發(fā)生錯誤,將不更改任何字節(jié)值。

List

值可以是十六進制字節(jié)或字符串。使用空格、逗號或制表符來分隔值。必須將字符串包括在單或雙引號中。

++++

4、Debug:F(填充)使用指定的值填充指定內(nèi)存區(qū)域中的地址。

可以指定十六進制或

ASCII

格式表示的數(shù)據(jù)。任何以前存儲在指定位置的數(shù)據(jù)將會丟失。

frangelist

參數(shù)

range

指定要填充內(nèi)存區(qū)域的起始和結(jié)束地址,或起始地址和長度。關(guān)于有效的

range

值的信息,請單擊“相關(guān)主題”列表中的“Debug

說明”。

list

指定要輸入的數(shù)據(jù)。List

可以由十六進制數(shù)或引號包括起來的字符串組成。

++

范例

假定鍵入以下命令:

f04ba:100l1004245525441

作為響應(yīng),Debug

使用指定的值填充從

04BA:100

04BA:1FF

的內(nèi)存位置。Debug

重復(fù)這五個值直到

100h

個字節(jié)全部填滿為止。

++

說明

使用

range

參數(shù)

如果

range

包含的字節(jié)數(shù)比

list

中的數(shù)值大,Debug

將在

list

中反復(fù)指派值,直到range

中的所有字節(jié)全部填充。

如果在

range

中的任何內(nèi)存損壞或不存在,Debug

將顯示錯誤消息并停止

f

命令。

使用

list

參數(shù)

如果

list

包含的數(shù)值多于

range

中的字節(jié)數(shù),Debug

將忽略

list

中額外的值。5、Debug:G(轉(zhuǎn)向)運行當前在內(nèi)存中的程序。

g[=address][breakpoints]

參數(shù)

=address

指定當前在內(nèi)存中要開始執(zhí)行的程序地址。如果不指定

address,Windows2000

將從CS:IP

寄存器中的當前地址開始執(zhí)行程序。

breakpoints

指定可以設(shè)置為

g

命令的部分的

1

10

個臨時斷點。

有關(guān)執(zhí)行循環(huán)、重復(fù)的字符串指令、軟件中斷或子程序的信息,請單擊“相關(guān)主題”列表中的

DebugP(執(zhí)行)。

有關(guān)執(zhí)行指令的信息,請單擊“相關(guān)主題”列表中的

DebugT(跟蹤)。

范例

假定鍵入以下命令:

gcs:7550

Windows2000

運行當前內(nèi)存中的程序,直到執(zhí)行到

CS

段中的斷點地址

7550

為止。Debug

將顯示寄存器的內(nèi)容和標志的狀態(tài)并結(jié)束

g

命令。

以下命令設(shè)置兩個斷點:

gcs:7550,cs:8000

如果在

Debug

遇到斷點之后再次鍵入

g

命令,將從在斷點之后的指令開始執(zhí)行,而不是在通常的開始地址執(zhí)行。

++

說明

使用

address

參數(shù)

必須在

address

參數(shù)之前使用等號

(=)

以區(qū)分開始地址

(address)

和斷點地址(breakpoints)。

指定斷點

程序在它遇到的第一個斷點處停止,而不論您在

breakpoint

列表的什么位置鍵入斷點。Debug

在每個斷點處用中斷代碼代替原始指令。

當程序到達斷點時,Debug

將所有斷點地址恢復(fù)到它們的最初指令并顯示所有寄存器的內(nèi)容、所有標記的狀態(tài)以及最后執(zhí)行指令的解碼形式。Debug

顯示的信息與使用

Debugr(寄存器)命令并指定斷點時所顯示的信息相同。

如果不在斷點處停止程序,Debug

程序?qū)⒉皇褂迷贾噶钐鎿Q中斷代碼。

設(shè)置斷點的限制

可以只在包含

8086

操作代碼(操作碼)的第一個字節(jié)的地址上設(shè)置斷點。如果設(shè)置了

10

個以上的斷點,Debug

將顯示以下信息:

bperror

對用戶堆棧指針的要求

用戶堆棧指針必須有效且必須有

6

個字節(jié)可用于

g

命令。該命令使用

iret

指令跳轉(zhuǎn)到正在被測試的程序。Debug

設(shè)置用戶堆棧指針并將用戶標志、代碼段寄存器和指令指針壓入用戶堆棧。(如果用戶堆棧無效或太小,操作系統(tǒng)可能會失敗。)Debug

在指定的斷點處設(shè)置中斷代碼

(0CCh)。

重新啟動程序

不要在

Windows2000

顯示以下消息后嘗試重新啟動程序;

Programterminatednormally

要正確地運行程序,必須通過使用

Debugn(名稱)和

l(加載)命令重新加載該程序。

++++

6、Debug:H(十六進制)對指定的兩個參數(shù)執(zhí)行十六進制運算。

hvalue1value2

參數(shù)

value1

代表從

0

FFFFh

范圍內(nèi)的任何十六進制數(shù)字。

value2

代表從

0

FFFFh

范圍內(nèi)第二個十六進制數(shù)字。

++

范例

假定鍵入以下命令:

h19f10a

Debug

執(zhí)行運算并顯示以下結(jié)果。

02A90095

++

說明

Debug

首先將指定的兩個參數(shù)相加,然后從第一個參數(shù)中減去第二個參數(shù)。這些計算的結(jié)果顯示在一行中:先計算和,然后計算差。

++++

7、Debug:M(移動)

將一個內(nèi)存塊中的內(nèi)容復(fù)制到另一個內(nèi)存塊中。

mrangeaddress

參數(shù)

range

指定要復(fù)制內(nèi)容的內(nèi)存區(qū)域的起始和結(jié)束地址,或起始地址和長度。

address

指定要將

range

內(nèi)容復(fù)制到該位置的起始地址。

++

范例

假定鍵入以下命令:

mcs:100110cs:500

Debug

首先將

CS:110

地址中的內(nèi)容復(fù)制到地址

CS:510

中,然后將

CS:10F

地址中的內(nèi)容復(fù)制到

CS:50F

中,如此操作直至將

CS:100

地址中的內(nèi)容復(fù)制到地址

CS:500

中。要查看結(jié)果,請使用

Debugd(轉(zhuǎn)儲)命令,并使用

m

命令指定目標地址。

++

說明

復(fù)制操作對現(xiàn)有數(shù)據(jù)的影響

如果新數(shù)據(jù)沒有寫入正在被復(fù)制的數(shù)據(jù)塊中的地址,則源數(shù)據(jù)將保持不變。但是,如果目標塊已經(jīng)包含數(shù)據(jù)(就象它在覆蓋副本操作中一樣),則將改寫該數(shù)據(jù)。(覆蓋復(fù)制操作是指那些目標數(shù)據(jù)塊部分內(nèi)容覆蓋原數(shù)據(jù)塊部分內(nèi)容的操作。)

執(zhí)行覆蓋復(fù)制操作

m

命令執(zhí)行目標地址的覆蓋復(fù)制操作,而不丟失數(shù)據(jù)。將改寫的地址內(nèi)容首先復(fù)制。因此,如果將較高位地址的數(shù)據(jù)復(fù)制到較低位地址,則復(fù)制操作從原塊的最低位地址開始并向最高位地址進行。反之,如果要將數(shù)據(jù)從低地址復(fù)制到高地址,復(fù)制操作從原塊的最高地址開始,向最低地址進行。

++++

8、Debug:Q(退出)

停止

Debug

會話,不保存當前測試的文件。

當您鍵入

q

以后,控制返回到

Windows2000

的命令提示符。

q

參數(shù)

該命令不帶參數(shù)。

有關(guān)保存文件的信息,請單擊“相關(guān)主題”列表中的

DebugW(寫入)。

++++

9、Debug:R(寄存器)

顯示或改變一個或多個

CPU

寄存器的內(nèi)容。

r[register-name]

參數(shù)

如果在沒有參數(shù)的情況下使用,則

r

命令顯示所有寄存器的內(nèi)容以及寄存器存儲區(qū)域中的標志。

register-name

指定要顯示其內(nèi)容的寄存器名。

有關(guān)顯示內(nèi)存部分內(nèi)容的信息,請單擊“相關(guān)主題”列表中的

DebugD(轉(zhuǎn)儲)。

有關(guān)反匯編字節(jié)的信息,請單擊“相關(guān)主題”列表中的

DebugU(反匯編)。

++

范例

要查看所有寄存器的內(nèi)容、所有標記的狀態(tài)和當前位置的指令解碼表,請鍵入以下命令:

r

如果當前位置是

CS:11A,顯示外觀將類似于以下內(nèi)容:

AX=0E00BX=00FFCX=0007DX=01FFSP=039DBP=0000SI=005CDI=0000

DS=04BAES=04BASS=04BACS=O4BAIP=011ANVUPDINGNZACPENC

04BA:011ACD21INT21

要只查看標志的狀態(tài),請鍵入以下命令:

rf

Debug

按以下格式顯示信息:

NVUPDINGNZACPENC-_

現(xiàn)在,您可以按任意順序鍵入一個或多個有效的標志值,其中可以有或沒有空格,如下所示:

nvupdingnzacpenc-pleicy

Debug

結(jié)束

r

命令并顯示

Debug

提示符。要查看更改,請鍵入

r

rf

命令。Debug

將顯示以下內(nèi)容:

NVUPEIPLNZACPECY-_

ENTER

返回到

Debug

提示符。

++

說明

使用

r

命令

如果指定了寄存器名稱,Windows2000

將顯示以十六進制標記表示的寄存器的

16

位值,并將冒號顯示為提示符。如果要更改包含在寄存器中的值,除非鍵入新值并按

ENTER鍵;否則,請按

ENTER

鍵返回

Debug

提示符。

有效寄存器名

以下是

register-name

的有效值:ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc

f。ip

pc

都引用指令指針。

如果指定寄存器名稱,而不是從前面的列表中指定,Windows2000

將顯示以下消息:

brerror

使用

f

字符而不是寄存器名

如果鍵入

f

字符代替寄存器名,Debug

將每個標記的當前設(shè)置顯示為兩字母代碼,然后顯示

Debug

提示符。要更改標志的設(shè)置,請從下表中鍵入適當?shù)膬勺帜复a:

標志名

設(shè)置

清除

溢出

ovnv

方向

dn(減)

up(增)

中斷

ei(啟用)

di(禁用)

正負

ng(負)

pl(正)

zrnz

輔助進位

acna

奇偶校驗

pe(偶校驗)

po(奇校驗)

進位

cync

可以按任何順序鍵入新的標志值。不需要在這些值之間留出空格。要停止

r

命令,請按

ENTER

鍵。任何沒有指定新值的標志保持不變。

r

命令顯示的郵件

如果為標記指定了多個值,Debug

將顯示以下消息:

dferror

如果指定沒有在前面的表中列出的標志代碼,Debug

將顯示以下消息:

bferror

在這兩種情況下,Debug

將忽略所有在無效項目之后指定的設(shè)置。

Debug

的默認設(shè)置

在啟動

Debug

時,會將段寄存器設(shè)置到空閑內(nèi)存的低端,指令指針設(shè)置為

0100h,清除所有標志,并且將其余寄存器設(shè)置為零,除了被設(shè)置為

FFEEh

sp

之外。

++++

10、Debug:T(跟蹤)

執(zhí)行一條指令,并顯示所有注冊的內(nèi)容、所有標志的狀態(tài)和所執(zhí)行指令的解碼形式。

t[=address][number]

參數(shù)

=address

指定

Debug

啟動跟蹤指令的地址。如果省略

address

參數(shù),跟蹤將從程序的

CS:IP

寄存器所指定的地址開始。有關(guān)

address

參數(shù)有效值的信息,請單擊“相關(guān)主題”列表中的Debug。

number

指定要跟蹤的指令數(shù)。該值必須是十六進制數(shù)。默認值為

1。

有關(guān)執(zhí)行循環(huán)、重復(fù)的字符串指令、軟件中斷或子例程的信息,請單擊“相關(guān)主題”列表中的

DebugP(執(zhí)行)。

有關(guān)執(zhí)行當前內(nèi)存中程序的信息,請單擊“相關(guān)主題”列表中的

DebugG(轉(zhuǎn)向)。

++

范例

要執(zhí)行一個指令(CS:IP

指向的指令),然后顯示寄存器的內(nèi)容、標志的狀態(tài)以及指令的解碼形式,請鍵入以下命令:

t

如果程序中的指令位于

04BA:011A,Debug

可能顯示下列信息:

AX=0E00BX=00FFCX=0007DX=01FFSP=039DBP=0000SI=005CDI=0000

DS=04BAES=04BASS=04BACS=O4BAIP=011ANVUPDINGNZACPENC

04BA:011ACD21INT21

++

說明

跟蹤只讀內(nèi)存中的指令

t

命令使用

8086

8088

微處理器的硬件跟蹤模式。因此,也可以跟蹤存儲在只讀內(nèi)存

(ROM)

中的指令。

使用地址參數(shù)

必須在

address

參數(shù)之前使用等號

(=)

以便將它與

number

參數(shù)區(qū)分。11、Debug:U(反匯編)

反匯編字節(jié)并顯示相應(yīng)的原語句,其中包括地址和字節(jié)值。反匯編代碼看起來象已匯編文件的列表。

u[range]

參數(shù)

如果在沒有參數(shù)的情況下使用,則

u

命令分解

20h

字節(jié)(默認值),從前面

u

命令所顯示地址后的第一個地址開始。

range

指定要反匯編代碼的起始地址和結(jié)束地址,或起始地址和長度。有關(guān)

range

參數(shù)有效值的信息,請單擊“相關(guān)主題”列表中的

Debug。

有關(guān)集成記憶碼的信息,請單擊“相關(guān)主題”列表中的

DebugA(匯編)。

有關(guān)顯示內(nèi)存部分內(nèi)容的信息,請單擊“相關(guān)主題”列表中的

DebugD(轉(zhuǎn)儲)。

++

范例

要反匯編

16(10h)

字節(jié),從地址

04BA:0100

開始,請鍵入以下命令:

u04ba:100l10

Debug

按以下格式顯示結(jié)果:

04BA:0100206472AND[SI+72],AH

04BA:010369DB69

04BA:01047665JBE016B

04BA:0106207370AND[BP+DI+70],DH

04BA:010965DB65

04BA:010A63DB63

04BA:010B69DB69

04BA:010C66DB66

04BA:010D69DB69

04BA:010E63DB63

04BA:010F61DB61

如果只顯示從

04BA:0100

04BA:0108

特定地址的信息,請鍵入以下命令:

u04ba:01000108

Debug

顯示以下內(nèi)容:

04BA:0100206472AND[SI+72],AH

04BA:010369DB69

04BA:01047665JBE016B

04BA:0106207370AND[BP+DI+70],DH

++++

實驗二內(nèi)存操作數(shù)及尋址方法實驗?zāi)康?通過實驗掌握下列知識:1、8086/8088系統(tǒng)中數(shù)據(jù)在內(nèi)存中的存放方式和內(nèi)存操作數(shù)的幾種尋址方式。2、8086/8088指令:INC,DEC,LOOP,INT3,INT20H,寄存器SI,DI。3、8086/8088匯編語言偽操作:BYTEPTR,WORDPTR。4、求累加和程序和多字節(jié)加減法程序。實驗內(nèi)容和步驟:一、內(nèi)存操作數(shù)及各種尋址方式使用:內(nèi)容:MOV AX,1234HMOV [1000H],AXMOV BX,1002HMOV BYTEPTR[BX],20HMOV DL,39HINC BXMOV [BX],DLDEC DLMOV SI,3MOV [BX+SI],DLMOV [BX+SI+1],DLMOV WORDPTR[BX+SI+2],2846H步驟:(也可用emu8086)1)用A命令鍵入上述程序,并用T命令逐條運行。2)每運行一條有關(guān)內(nèi)存操作數(shù)的指令,要用D命令檢查并記錄有關(guān)內(nèi)存單元的內(nèi)容并注明是什么尋址方式。注意D命令顯示結(jié)果中右邊的ASCII字符及雙字節(jié)數(shù)存放法。思考:有關(guān)指令中BYTEPTR及WORDPTR偽操作不加行不行?試一試。二、求累加和程序:程序:MOV BX,1000HMOV CX,10SUB AX,AXLOP:ADD AL,[BX]ADCAH,0INC BXJ: LOOP LOPINT3H;斷點中斷步驟:1)用A命令將程序鍵入到100H開始的內(nèi)存中,在鍵入時記下標號LOP和J的實際地址,在鍵入LOOP指令時LOP用實際地址值代替。2)用命令NAA將此程序命名為文件AA(文件名可任取)。3)用R命令將BX:CX改為程序長度值(即最后一條指令后面的地址減去開始地址)4)用命令W100將此程序存到AA命名的磁盤文件中。5)用命令Q退出DEBUG。6)用命令DEBUGAA再次調(diào)入DEBUG和文件AA,可用U命令檢查調(diào)入程序。若調(diào)入DEBUG時忘了加AA文件名,可用N命令和L命令將文件調(diào)入。7)用E命令在內(nèi)存地址1000H處鍵入16個數(shù)字8)用命令G=100J(J用實際地址代替),使程序運行并停在斷點J上,檢查AX,BX的值是否符合你的預(yù)計值。9)用T命令運行一步,觀察程序方向(IP值)和CX值是否與你的估計一樣,若不一樣,檢查程序是否有錯。10)重復(fù)GJ與T,再檢查AX是否正確。11)用G命令使程序運行到結(jié)束,檢查AX值是否正確。三、多字節(jié)加法程序。程序:MOV DI,1000HMOV CX,8MOV SI,2000HCLCLOP:MOV AL,[SI]ADC [DI],ALINC SIINC DILOOP LOPINT 20H;INT20H為DOS中斷返回,INT3為斷點中斷(用于DEBUG)步驟:1)用命令鍵入此程序2)用E命令在1000H開始處鍵入一個8字節(jié)被加數(shù),在2000H開始處鍵入一個8字節(jié)加數(shù),均為低字節(jié)在前面。3)。用G命令運行此程序,并用D命令檢查其結(jié)果(存放在哪里?),是否正確?4)將INT20H指令改為INT3,有何區(qū)別?若這條指令不加,行不行?試一試。四。自編程序:用16位減法指令編一個32位(4字節(jié))數(shù)減法程序,兩個源數(shù)及結(jié)果存放地址同上題。調(diào)試并做記錄。實驗報告要求:1、各項實驗結(jié)果記錄。2、自編程序原稿及調(diào)試后修正稿,寫出原稿錯在那里。實驗三數(shù)據(jù)串傳送和查表程序?qū)嶒災(zāi)康?通過實驗掌握下列知識:1、堆棧、堆棧指示器SP和堆棧操作指令PUSH、POP。2、段寄存器和物理地址計算。3、查表法和查表指令XLAT。4、數(shù)據(jù)串傳送程序和數(shù)據(jù)串傳送指令MOVS、STOS及重復(fù)前輟REP。5、循環(huán)指令ROL、邏輯與指令A(yù)ND和清方向位指令CLD。6、偽操作指令DB。實驗內(nèi)容及步驟:一、利用查表方法把DX的內(nèi)容(16進制數(shù))轉(zhuǎn)換成ASCII碼:1、用A命令鍵入下列程序:MOV BX,1000HMOV DI,2000HMOV CX,4LOP:PUSH CXMOV CL,4ROL DX,CLPOP CXMOV AL,DLAND AL,0FHXLATCLDSTOSBLOOP LOPINT 20H2、用A命令在1000H處鍵入下列ASCII碼并用D命令檢查之:DB`0123456789ABCDEF'用D命令檢查時注意左邊的ASCII碼值和右邊的字符。3、用R命令給DX送一個四位的16進制數(shù)(例7F8EH)。4、用T命令逐條運行這程序到LOOP指令處,觀察并記錄每次運行結(jié)果,特別是SP和堆棧內(nèi)容(用D命令檢查)5、用G命令將此程序運行到結(jié)束,并用D命令檢查2000H處所轉(zhuǎn)換的結(jié)果??勺⒁馄聊挥疫叺腁SCII字符與DX是否一致。二、數(shù)據(jù)串搬家程序:1、用A命令鍵入下列程序:MOV SI,1000HMOV DI,1500HMOV CX,0FHLOP:MOV AL,[SI]MOV [DI],ALINC SIINC DILOOP LOPINT 20H2、用A命令DB偽指令在1000H鍵入下列字符串:‘IBM_PCCOMPUTER'3、用G命令運行此程序,并用D命令檢查目的地址處的字符與源串是否一致。4、若此程序中的目的地址改為1002H,再運行此程序,看能不能把1000H開始的字符串搬到1002H開始的地方去?修改程序以做到這一點。三、段寄存器概念及字符串傳送指令練習(xí):1、用A命令鍵入下列程序:MOV SI,0MOV DI,0MOV AX,1000HMOV DS,AXMOV AX,1500HMOV ES,AXMOV CX,0FHCLDREP MOVSBINT 20H2、用A命令DB偽指令在1000H:0000H處鍵入字符串'IBM_PCCOMPUTER',并用D命檢查之3、用D命令檢查0F00H:1000H處內(nèi)容,看是否一樣。為什么?4、用G命令運行此程序,檢查目的地址1500H:0000H處內(nèi)容。并記下DS與ES值。5、修改此程序,使ES與DS為同一值,以減少一條指令,而源物理地址和目的物理地址(是多少?)仍和原來一樣。實驗報告要求:1、各項實驗記錄和思考題。2、要求你修改的程序的清單(修改后)和調(diào)試記錄。

實驗四屏幕字符顯示程序?qū)嶒災(zāi)康?通過實驗掌握下列知識:1、8086/8088指令:JMP,ROR,XOR,HLT。2、利用DOS功能調(diào)用INT21H的2號和9號功能進行屏幕顯示的方法。3、直接向RAM(VRAM)送ASCII碼進行屏幕顯示的方法。4、IBM-PC機的ASCII碼表及控制字符。5、命令(.COM)文件及使用方法。6、利用^Break退出程序的方法及局限性。實驗內(nèi)容及步驟:一、利用INT2109H號功能調(diào)用顯示字符串。1、用A命令在100H處鍵入下列程序:MOV AH,9MOV DX,110INT 21INT 202、用A命令在110H處鍵入下列字符串的ASCII碼:DB 'Thisisasample!$'3、用N命令和W命令將此程序(包括數(shù)據(jù)區(qū))存入文件名為AA.COM的磁盤文件中。(存入前BX:CX必須置為文件長度值)。4、用Q命令退出DEBUG。5、在DOS命令下打AA,運行此程序,即在屏幕上顯示'Thisisasample!'字符串,若不出現(xiàn),用DEBUG檢查程序有無錯誤。二、利用INT21H2號功能顯示字符:1、用A命令在100H處鍵入下列程序:XOR DL,DLMOVCX,100LOP:MOV AH,2INT 21INC DLLOOP LOPINT 202、用G命令運行程序,即在屏幕上依次緩慢的顯示256個ASCII字符。仔細觀察每個字符,和IBM-PCASCII碼表對照,看07H-0DH處控制字符顯示結(jié)果與表上有何不同?3、按CTRL+BREAK退出此程序,若一次不行可多做幾次。三、直接向VRAM送ASCII碼顯示字符1、用A命令在100H處鍵入下列程序:MOV AX,B000MOV DS,AXXOR AL,ALXOR BX,BXMOV CX,100LOP:MOV [BX],ALINC BXINC ALPUSH CXMOV CX,8DELY:PUSH CXMOV CX,0J:LOOP JPOP CXLOOP DELYPOP CXLOOP LOPINT 202、用N命令和W命令將此程序存入BB.COM文件中。(一定要先存入!)3、用G命令運行此程序,仔細觀察每一個ASCII碼顯示結(jié)果,并和字符表及上一道程序運行情況進行對照,其控制字符區(qū)(07-0DH)顯示結(jié)果和INT21H2號功能調(diào)用有何不同?四。自編一個程序,要求顯示AX的內(nèi)容,即能顯示AX=xxxx。調(diào)試時AX的內(nèi)容可用R命令賦值,也可用MOV指令賦值。實驗報告要求:1、各項實驗記錄及觀察體會。2、利用INT21H顯示和直接向VRAM送ASCII碼顯示方法在顯示結(jié)果上有什么不同?3、自編程序草稿及調(diào)試結(jié)果。

實驗五二進制數(shù)顯示成十六進制數(shù)的屏幕字符顯示程序?qū)嶒災(zāi)康?通過實驗掌握下列知識:1、8086指令:JG,SHR,MOV,OR,CMP,INC,LEA,INT等。2、利用DOS功能調(diào)用INT21H的9號功能進行屏幕顯示的方法。實驗內(nèi)容及步驟:一、利用INT2109H號功能調(diào)用顯示字符串。1、字符串顯示09H功能說明功能:在屏幕上顯示在存儲器內(nèi)以“$”為結(jié)束符的字符串(“$”不顯示)。入口參數(shù):DS:DX=串首址。例4一個以“$”結(jié)束的字符串已存放在mess為首地址的內(nèi)存緩沖區(qū)中,利用09號功能調(diào)用如下:movah,9movdx,segmess;ds:dx=串地址movds,dxmovdx,offsetmessint21h2、從mess開始處存放下列字符串的ASCII碼:‘Thisisasample!$’寫程序把它顯示出來。3、把上面你寫出的程序存為4、在DOS命令下打AA,運行此程序,即在屏幕上顯示'Thisisasample!'字符串,若不出現(xiàn),用DEBUG檢查程序有無錯誤。二、自編一個程序,要求把NUM單元存放的一個8位二進數(shù),顯示成16進制數(shù),如NUM單元的內(nèi)容為’01001011’,要求能顯示“RESULT=4BH”.程序框架為:DATA SEGMENTNUM DB01001011BBUF DB0DH,0AH,'RESULT='STR DB4DUP(?)DATA ENDSSTACK SEGMENTSTACK DB 200DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21HCODE ENDS END START實驗報告要求:1、各項實驗記錄及觀察體會。2、自編程序草稿及調(diào)試結(jié)果。實驗六查表指令及子程序嵌套實驗實驗?zāi)康?通過實驗掌握下列知識:1、8086/8088指令:MOV,XLAT,LEA,JNE,CALL,RET,PUSH,POP,CMP,INT。2、數(shù)據(jù)段的定義方法。3、XLAT指令的使用方法。4、子程序的嵌套調(diào)用及子程序參數(shù)傳遞的方法。5、利用DOS功能調(diào)用INT21H的4CH號功能返回DOS的方法。6、MASM、LINK、DEBUG、EMU8086等匯編、調(diào)試工具的使用方法。實驗內(nèi)容及步驟:一、調(diào)試以下兩個程序,讀懂程序,尤其是第二個程序,要掌握階乘的算法,最終寫出程序的運行結(jié)果及結(jié)果存放的位置。1、已知某班學(xué)生的英語成績按學(xué)號(從1開始)從小到大的順序排列在TAB表中,要查的學(xué)生的學(xué)號放在變量NO中,查表結(jié)果放在變量ENGLISH中。編寫程序如下:STACK SEGMENTSTACKDB 200DUP(0)STACK ENDSDATA SEGMENTTAB DB80,85,86,71,79,96 DB83,56,32,66,78。84NO DB10ENGLIST DB?DATA ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODEBEGIN: MOV AX,DATA MOV DS,AX LEA BX,TAB MOV AL,NO DEL AL XLAT TAB MOV ENGLISH,AL MOV AH,4CH INT 21HCODE ENDS END BEGIN2、計算5!的程序示例,RESULT是保存階乘的存儲單元。程序如下:STACK SEGMENTSTACK DB200DUP(0)STACK ENDSDATA SEGMENTN DW5RESULT DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,N CALLFACT MOV AX,RESULT MOV AH,4CH INT 21HFACTPROC CMPAX,0 JNE L1 MOV RESULT,1 JMP EXITL1: PUSHAX DEC AX CALLFACT POP AX MOV RESULT MOV RESNLT,AXEXIT: RETFACT ENDPCODE ENDS END START二、讀一讀以下程序,看一看運行結(jié)果。(選作)DATA SEGMENTATRI DB6EH,52H,94H,52H,6EHDATA ENDSSTACK SEGMENTPARASTACK'STACK' DB200DUP(0)STACK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKST: MOV AX,DATA MOV DS,AX MOV AH,0 ;設(shè)置80×25彩色文本方式 MOV AL,3 INT 10H LEA SI,ATRI ;屬性字節(jié)值表首址存SI MOV DI,5 ;顯示5個字符 MOV DX,0A13H ;顯示位置 MOV AH,15 ;取當前頁號 INT 10HLP: MOV AH,2 ;置光標位置 INC DL INT 10HMOV AL,5 ;顯示梅花形字符 MOV BL,[SI] MOV CX,1 MOV AH,9 INT 10H INC SI;指向下一屬性字節(jié) DEC DI ;判顯示完否 JNZ LP ;未完轉(zhuǎn)LP再顯示 MOV

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論