




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件工程師面試題庫精 編
- 小學(xué)文言文講解
- 新北師大版小學(xué)數(shù)學(xué)六年級下冊總復(fù)習(xí)圖形的認識
- 學(xué)生資產(chǎn)評估匯報
- 團建活動游戲策劃與實施方案
- 學(xué)術(shù)期刊出版?zhèn)惱韱栴}分析
- 細胞生物核糖體
- 項目進度狀態(tài)匯報
- 特崗教育技術(shù)學(xué)
- 鄉(xiāng)村建設(shè)年度匯報
- 2025年急診急救試題(附答案)
- 貴州航空產(chǎn)業(yè)城集團股份有限公司旗下子公司貴州安立航空材料有限公司招聘筆試題庫2025
- 2025年醫(yī)師節(jié)臨床知識競賽題庫
- 2025年校長職級考試題及答案
- 2024興平市輔警招聘考試真題
- 2025年保育員初級考試試題試題(含答案)(完整版)
- 2024年江蘇鎮(zhèn)江市科學(xué)技術(shù)局遴選事業(yè)單位人員2人筆試高頻難、易錯點備考題庫及參考答案詳解1套
- 成都市二手房買賣合同房屋交易稅費繳納及減免協(xié)議
- 電力工程管理培訓(xùn)課件
- 經(jīng)食道心臟超聲技術(shù)規(guī)范
- 四川省達州市達川區(qū)2024-2025學(xué)年八年級下學(xué)期6月期末考試英語試題(含筆試答案無聽力答案、原文及音頻)
評論
0/150
提交評論