




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
云南大學(xué)軟件學(xué)院本科生課程實驗指導(dǎo)書
計算機俎鼠原理與匯編語言福海核計
王逍
云南大學(xué)軟件學(xué)院
第一章DEBUG的使用
一、DEBUG概述
DEBUG是在DOS狀態(tài)下面供程序員使用的程序調(diào)試工
具,它可以用來檢查內(nèi)存中任何地址中的內(nèi)容以及修改特
定地址中的內(nèi)容。DEBUG還可以用于逐指令執(zhí)行某個程
序,追蹤程序的執(zhí)行過程,比較一條指令執(zhí)行前后數(shù)值變
化情況,讀寫文件與磁盤扇區(qū)。此外,DEBUG還可以用于
讀寫端口中的數(shù)值。
在DEBUG狀態(tài)下,所有數(shù)據(jù)都作為字節(jié)序列,可以用
DEBUG把任何類型的文件讀入內(nèi)存中。DEBUG能夠處理
的數(shù)據(jù)為兩種:十六進制數(shù)和ASCII碼,使用兩位數(shù)表示十
六進制數(shù)據(jù)(0?9,A~F)。在DEBUG中涉及內(nèi)存中的數(shù)據(jù)
口寸,要指定數(shù)據(jù)所在的內(nèi)存單元的地址,地址的輸入格式
是:[段地址]:[位移]。如果沒有輸入地址,DEBUG將假定
為當(dāng)前內(nèi)存段,從位于地址100H的字節(jié)開始。前100H字節(jié)
保留給程序段前綴使用(稱PSP結(jié)構(gòu),包含程序執(zhí)行的各種
信息),該區(qū)域用于建立DOS與程序之間的聯(lián)系。在DEBUG
中,使用四位十六進制數(shù)表示地址(0-9,A?F)。
DEBUG輸入數(shù)據(jù)時有兩種方法:提示方法和非提示方
法。在提示方法下,輸入要求輸入數(shù)據(jù)的命令,后跟保存
數(shù)據(jù)的地址。執(zhí)行后可以看到該地址中已有的內(nèi)容及一個
冒號提示符。此時可以在提示符下輸入一個新的值或者按
下回車鍵或CTRL+C回到“一”提示符。在非提示方法下,
輸入保持?jǐn)?shù)據(jù)的內(nèi)存地址以及要輸入的數(shù)據(jù)。
DEBUG的啟動:
進入DOS狀態(tài)下,鍵入DEBUG],按ENTER鍵,如:
C:\>DEBUG1,則屏幕顯示:
符號“一”是進入DEBUG的提示符,在該提示符下可鍵入
任意DEBUG命令。
DEBUG的退出:
在DEBUG的提示符后輸入Q命令,按ENTER鍵,則退出
DEBUG返回DOS。
DEBUG的使用:
在DEBUG的提示符后輸入DEBUG命令,按ENTER鍵。
二、DEBUG命令詳解
★A命令
格式:A[地址]
功能:將指令直接匯編成機器碼輸入到內(nèi)存中。
參數(shù)說明:[地址]指定存放鍵入?yún)R編語言指令的內(nèi)存單元的
位置。
A命令使用
說明:用于小段程序的匯編及修改目標(biāo)程序,所有輸入的
數(shù)字均默認(rèn)為十六進制,并且不需要以“h”字符結(jié)尾。用
戶裝入內(nèi)存的匯編語句是連續(xù)存放的,若沒有指定地址,
并且前面沒有使用匯編命令,該語句被匯編到CS:0100區(qū)
域,則在它上次停止處開始匯編。
注意:
1.直接在A命令下輸入跳轉(zhuǎn)指令時,跳轉(zhuǎn)指令后應(yīng)跟跳轉(zhuǎn)
到的語句所在內(nèi)存單元的地址,不能跟標(biāo)號;使用跳轉(zhuǎn)
指令時,可以指定跳轉(zhuǎn)指令的屬性:near,far。near前
綴可以縮寫為neo如下例所示:
-a0100:0100
0100:0100jmp102
0100:0102jmpnear105
0100:0105jmpfar10a
2.匯編語言指令所涉及到的操作數(shù)可以是字操作數(shù)也可
以是字節(jié)操作數(shù),在語句不能判別操作數(shù)的類型時,可
以使用前綴wordptr或者前綴byteptr指定操作數(shù)
g的類型。縮寫分別是:wo和by。如下列所示:
-a0100:0100
0100:0100decwordptr[100]
0100:0102decwoptr[100]
0100:0105decbyteptr[100]
2.在DEBUG下,應(yīng)注意區(qū)分立即操作數(shù)和內(nèi)存地址的操作
數(shù),使用包括在中括號([])中的操作數(shù)表示內(nèi)存地
址。
3.在DEBUG下,能夠使用的偽指令僅有DB和DW兩個,分
別用于定義字節(jié)和字操作數(shù),此時定義的操作數(shù)被存放
在該定義指令所在的內(nèi)存空間中。如下列所示(注意內(nèi)
存空間的變換,why?):
-a0100:0100
0100:0100DB'ABCDEFG'
0100:0107
★C命令
格式:C[源地址范圍][目的地址]
功能:比較兩內(nèi)存區(qū)域中的內(nèi)容是否相同。若不同則按字
節(jié)顯示其地址和內(nèi)容,若相同則不顯示任何內(nèi)容。
參數(shù)說明:[源地址范圍]指定要比較的內(nèi)存第一個區(qū)域的起
始和結(jié)束地址,或起始地址和長度。[目的地址]指定要比
較的第二個內(nèi)存區(qū)域的起始地址。
C命令使用
說明:如果[源地址范圍]和[目的地址]中內(nèi)存單元的數(shù)據(jù)
相同,Debug將不顯示任何內(nèi)容而直接返回到Debug提示
符。如果有差異,Debug將按如下格式顯示:
[源地址]源地址中內(nèi)容目的地址中內(nèi)容[目的
地址]
如下列所示:
-CCS:100105DS:300;(假定CS=0AF6;DS=1000)
0AF6:010088001000:0300
0AF6:0101CO001000:0301
0AF6:010289001000:0302
0AF6:0103D8001000:0303
0AF6:010465001000:0304
0AF6:010566001000:0305
★D命令
格式:D[地址]或D[起始地址][目的地址]
功能:以內(nèi)存映象方式顯示內(nèi)存中的數(shù)據(jù)。
參數(shù)說明:指定要顯示內(nèi)容的內(nèi)存單元的起始地址和結(jié)束
地址,或起始地址和長度。如果不指定[地址],Debug將
從以前d命令中所指定的地址范圍的末尾開始顯示128
個字節(jié)的內(nèi)容;第一次從DS:100處開始顯示。
D命令使用
說明:當(dāng)使用d命令時,Debug分兩個部分顯示內(nèi)存單元
內(nèi)容:左邊顯示內(nèi)存單元中存放的十六進制數(shù);右邊顯示
左邊的十六進制所表示的ASCII字符,所有不可打印字符用
句號(.)表示。每行顯示16個字節(jié)的內(nèi)容,在第八和第九個
字節(jié)之間有一個連字符。
從鍵盤鍵入下面命令:
-dcs:10010f
Debug按以下格式顯示地址范圍中的內(nèi)容(假定CS=0AF6):
0AF6:010077616E677869616F-696A6BFF0E0001
FFwangxiaoijk
鍵入以下命令,Debug將從CS:100開始顯示20h個字節(jié)
的內(nèi)容:
-dcs:100120
鍵入以下命令,Debug將顯示范圍從DS段的100h到
H5h中所有字節(jié)的內(nèi)容:
-d100115
注意:在D命令中若不指定段寄存器,默認(rèn)規(guī)定為DS。
★E命令
格式:E[地址][字節(jié)串]或E[地址]
功能:從指定的地址開始修改內(nèi)存值。
參數(shù)說明:[地址]指定存放[字節(jié)串]第一個內(nèi)存的位置,
[字節(jié)串]是要放入內(nèi)存單元中的數(shù)據(jù)。
E命令使用
說明:當(dāng)使用E命令時,有兩種使用格式:
1、用E命令中包含的字節(jié)串替換從指定的地址開始的
多個字節(jié)的內(nèi)容;
2、E命令后不跟字節(jié)串,則允許按順序方式顯示和修改
內(nèi)存值,按下空格鍵顯示下一字節(jié)內(nèi)容,若想修改,直
接輸入相應(yīng)值;按下減號鍵顯示上一字節(jié)內(nèi)容,若想修
改,直接輸入相應(yīng)值。
3、停止執(zhí)行e命令。按ENTER鍵。在任何字節(jié)位置
都可以按ENTERo
注意:
1.若地址部分只輸入偏移量,則E命令認(rèn)為段包括在
DS寄存器中。
2.[字節(jié)串]的值可以是十六進制字節(jié)或字符串。使用空
格、逗號或制表符來分隔值。必須將字符串包括在單
或雙引號中。
3.使用E命令后,內(nèi)存單元中原來的數(shù)據(jù)將丟失,或者
說被新輸入的數(shù)據(jù)覆蓋。
從鍵盤鍵入下面命令:
-E100
Debug按下面的格式顯示第一個字節(jié)的內(nèi)容(假定
DS=0AF6):
0AF6:0100EB.
要將該值更改為61,請在插入點鍵入(使用符號〃一〃表示)
61,如下所示:
0AF6:0100AB.61_
此時,若按下空格鍵,將顯示下一個內(nèi)存單元中的內(nèi)容:
0AF6:0100AB.61EF._
此時,又可以在插入點鍵入新的內(nèi)容,改寫當(dāng)前顯示的內(nèi)存
內(nèi)容,若不需要改寫當(dāng)前內(nèi)存單元的內(nèi)容,可以直接按下空
格鍵,將顯示下一個內(nèi)存單元的內(nèi)容,如此,一直到按
ENTER停止e命令并返回到Debug提示符下。
若使用減號鍵,操作和按下空格鍵一樣,區(qū)別在于將顯示
上一個內(nèi)存單元的內(nèi)容。
注意:使用該種方法,只能鍵入16進制數(shù),不能鍵入字符
串。
從鍵盤鍵入下面命令:
-EDS:100EF'ABC'41
則執(zhí)行上面的命令后,從DS:100內(nèi)存單元開始的5個連續(xù)的
字節(jié)中的內(nèi)容將被數(shù)據(jù)0EFH,字符“A”“B”“C”的ASCII
碼和數(shù)據(jù)41H替換。
★F命令
格式:F[地址范圍][字節(jié)或字節(jié)串]
功能:將要填寫的字節(jié)或字節(jié)串填入由地址范圍指定的存
儲器中。
參數(shù)說明:[地址范圍]指定要填充內(nèi)存區(qū)域的起始和結(jié)束地
址,或起始地址和長度。[字節(jié)或字節(jié)串]指定要輸入的數(shù)
據(jù),可以由十六進制數(shù)或引號包括起來的字符串組成。
F命令使用
說明:如果[地址范圍]包含的字節(jié)數(shù)比[字節(jié)或字節(jié)串]中
的數(shù)值大,Debug將對[字節(jié)或字節(jié)串]中提供的值反復(fù)使
用,直到[地址范圍]中的所有字節(jié)全部填充。如果在[地址
范圍]中的任何內(nèi)存單元損壞或不存在,Debug將顯示錯誤
消息并停止f命令。如果[字節(jié)或字節(jié)串]包含的數(shù)值多
于[地址范圍]中的字節(jié)數(shù),Debug將忽略[字節(jié)或字節(jié)串]
中額外的值。
從鍵盤鍵入下面的命令:
-F1000:100105'ABCDEFG,
指令執(zhí)行后,DEBUG使用'ABCDEF,填充1000:100到1000:
105內(nèi)存單元。
從鍵盤鍵入下面的命令:
1000:1001504045515244
指令執(zhí)行后,DEBUG反復(fù)使用40,45,51,52,44填充從
1000:100到1000:150的內(nèi)存單元,直到50h個字節(jié)全部
填滿為止。
★G命令
格式:G[=起始地址][[斷點]……]
功能:執(zhí)行正在調(diào)試的程序,當(dāng)達(dá)到斷點時停止執(zhí)行,并
且顯示寄存器標(biāo)志和下一條要執(zhí)行的命令。
參數(shù)說明:匚起始地址]指定當(dāng)前在內(nèi)存中要開始執(zhí)行的指
令所在的內(nèi)存單元的地址。如果不指定上起始地址],DEBUG
將從CS:IP寄存器中的當(dāng)前地址開始執(zhí)行程序。[[斷
點].…]指定可以設(shè)置為g命令的部分的1到10
個臨時斷點。
G命令使用
說明:G命令中的=不能省略,可以只給出偏移地址,默認(rèn)
段地址為當(dāng)前的CS;若省略=,則該地址就成為G命令中
的斷點地址。程序?qū)闹付ǖ拈_始地址不停的執(zhí)行程序,
一直到遇到結(jié)束指令為止,并顯示“Programterminated
,,
normallyo斷點地址只對本次G命令有效;下一條G命令若
需要斷點地址,應(yīng)重新進行指定。當(dāng)使用G命令執(zhí)行程序到
斷點地址后,顯示斷點地址處的指令和寄存器的內(nèi)容。
注意:斷點地址應(yīng)為一條指令在內(nèi)存單元中的首字節(jié)地址。
★H命令
格式:H[數(shù)值][數(shù)值]
功能:分別顯示兩個十六進制數(shù)相加的和以及第一個數(shù)減
去第二個數(shù)的差。
參數(shù)說明:[數(shù)值]表示從0到FFFFh范圍內(nèi)的任何十六
進制數(shù)字。
H命令使用
說明:Debug首先將指定的兩個參數(shù)相加,然后用第一個參
數(shù)中減去第二個參數(shù)。并將計算的結(jié)果以4位16進制形式顯
示在下一行中:先顯示計算和,然后顯示計算差。
從鍵盤鍵入下面的命令:
H1234
執(zhí)行后,將在下一行顯示:
0046FFDE
★I命令
格式:I[端口地址]
功能:從指定的端口輸入并顯示(用十六進制)指定端口中的
數(shù)據(jù)(字節(jié))。
參數(shù)說明:[端口地址]指定要讀取數(shù)據(jù)的端口地址。
I命令使用
說明:[端口地址]的分為應(yīng)在0?FFFFH的范圍內(nèi)。
從鍵盤鍵入下面的命令:
IFFFF
執(zhí)行后,將在下一行顯示(假定端口0FFFFH中的內(nèi)容為
FFH):
FF
★L(fēng)命令
格式:L[地址][盤號:][邏輯扇區(qū)號][扇區(qū)數(shù)]
功能:將一個文件或盤的絕對扇區(qū)裝入存儲器。
參數(shù)說明:[地址]指定要在其中加載文件或扇區(qū)內(nèi)容的內(nèi)
存空間的起始位置。[盤號:]指定包含讀取指定扇區(qū)的磁盤
的驅(qū)動器。該值是數(shù)值型,表示為:0=A,1=B,2=C,……
等。[邏輯扇區(qū)號]指定要加載其內(nèi)容的第一個扇區(qū)的十六
進制數(shù)。[扇區(qū)數(shù)]指定要加載其內(nèi)容的連續(xù)扇區(qū)的十六進
制數(shù)。
L命令使用
說明:單個L命令能夠裝入的最大扇區(qū)數(shù)是80H,其中盤
號0,1,2,3……分別代表A,B,C,……;若出現(xiàn)讀盤錯,
顯示錯誤信息。只有加載特定扇區(qū)的內(nèi)容而不是加載
debug命令行或最近的Debugn(名稱)命令中指定的文
件時,才能使用drive、start和number參數(shù)。L命令
使用情況,可以分為下列幾種情況:
1、使用不帶參數(shù)的L命令
當(dāng)使用不帶參數(shù)的L命令時,在debug命令行上指定
的文件將加載到從地址CS:100開始內(nèi)存中。Debug同時
將BX和CX寄存器設(shè)置為加載的字節(jié)數(shù)(CX表示低位,
BX表示高位)。如果不在debug命令行指定文件,所裝入
的文件將是最近使用n命令經(jīng)常指定的文件。
2、使用帶有address參數(shù)的L命令
使用帶address參數(shù)的L命令,Debug將從內(nèi)存位置
address開始加載文件或指定扇區(qū)的內(nèi)容。???
3、使用帶全部參數(shù)的L命令
使用帶所有參數(shù)的L命令,Debug將加載指定磁盤扇區(qū)
的內(nèi)容而不是加載文件。加載特定扇區(qū)的內(nèi)容,指定范圍
內(nèi)的每個扇區(qū)均從drive讀取。Debug從start開始加
載,直到在number中指定的扇區(qū)數(shù)中的內(nèi)容全部被加載。
從鍵盤鍵入如下命令(假定文件abc.exe存在當(dāng)前目錄之
下):
Nwangxiao.exe
L
則把文件wangxiao.exe加載到CS:100開始的內(nèi)存單元中。
若要將文件加載到1000:100開始內(nèi)存單元中,鍵入:
L1000:100
補充說明:L如果被調(diào)試程序擴展名是EXE,則需要重新定
位,CS:IP根據(jù)被調(diào)試程序確定。通常,我們在主程序第
一條指令是程序開始執(zhí)行的位置,所以訐=0。
★M命令
格式:M[地址范圍][起始地址]
功能:把地址范圍內(nèi)的存儲器單元的內(nèi)容移到起始地址的
指定地址中
參數(shù)說明:[地址范圍]指定要復(fù)制內(nèi)容的內(nèi)存區(qū)域的起始
和結(jié)束地址,或起始地址和長度。[起始地址]指定要將
range內(nèi)容復(fù)制到該位置的起始地址。
M命令使用
說明:傳送期間,源數(shù)據(jù)區(qū)和目標(biāo)數(shù)據(jù)區(qū)可以部分重疊;
傳送后源區(qū)數(shù)據(jù)保持不變,目的區(qū)的數(shù)據(jù)將使用源區(qū)中的
數(shù)據(jù)進行改寫。
從鍵盤鍵入如下命令:
-MCS:100150DS:500
執(zhí)行該指令,Debug首先將CS:15O地址中的內(nèi)容復(fù)制到
地址DS:550中,然后將CS:14F地址中的內(nèi)容復(fù)制到
CS:54F中,如此操作直至將CS:100地址中的內(nèi)容復(fù)制到
地址DS:500中。
★N命令
格式:N[盤號:][路徑][文件名][擴展名]
功能:定義DEBUG使用的文件。
參數(shù)說明:[盤號:][路徑][文件名][擴展名]指定文件所在
的盤符,路徑,文件名和擴展名。
N命令使用
說明:可同時定義兩個操作文件,并將形成的文件控制塊
相應(yīng)的設(shè)置在內(nèi)存CS:5c和CS:6c上,供以后的L和W命令
操作之用。
N命令的兩個用途:
1、可以使用N為后面的L(加載)或W(寫入)命令指
定所使用的文件。
2、可以使用N命令指定正在被調(diào)試文件的命令行參數(shù)
和開關(guān)。
如下所示:
假定在Debug中正在調(diào)試的程序wangxiao.como若想為
wangxiao.com指定兩個參數(shù)并運行此程序。可以鍵入如下
的命令:
—Nparam1,param2
-G
從鍵盤鍵入如下的命令序列:
-Nwang.exe
-L
-Nxiaol.datxiao2.dat
-G
則第一個N命令將wang.exe指定為后接的L(加載)命
令的文件,該命令將wang.exe加載到內(nèi)存。第二個N命
令指定wang.exe將使用的參數(shù)。最后G命令將使用參數(shù)
xiaol.dat和xiao2.dat運彳亍wang.exe文件。此功能如同
在DOS命令行中鍵入了wang.exexiaol.datxiao2.dato
注意:不要在N命令的第二種形式后再次使用L命令,否
則N命令的第二種形式中指定的參數(shù)將不起作用。此外,
如果在N命令的第二種形式后使用W(寫入)命令,將使
用名稱xiao2.dat保存正在調(diào)試的文件wang.exe。
每次使用N命令,都將影響下面的四個內(nèi)存區(qū)域:
內(nèi)存位置內(nèi)容
CS:5C文件1的文件控制數(shù)據(jù)塊(FCB)
CS:6C文件2的文件控制數(shù)據(jù)塊(FCB)
CS:80N命令行的長度(以字符表示)
CS:81N命令行字符的開頭
N命令指定的第一個文件名被放在CS:5C的FCB中。如
果指定第二個文件名,第二個文件文將放置到CS:6C的
FCB中。N命令行上鍵入的字符數(shù)(除第一個字符N之外)
存儲在位置CS:80oN命令行上的實際字符(再次,除了字
母N之外)存儲在以CS:81開頭的位置。
★O命令
格式:O[端口地址][數(shù)據(jù)]
功能:發(fā)送數(shù)據(jù)(字節(jié))到指定的輸出端口。
參數(shù)說明:[端口地址]指定要寫入數(shù)據(jù)的端口地址,[數(shù)據(jù)]
指定要向[端口地址]中寫入的字節(jié)值。
0命令使用
說明:[端口地址]的分為應(yīng)在0?FFFFH的范圍內(nèi),[數(shù)據(jù)]
應(yīng)為字節(jié)數(shù)據(jù)。
從鍵盤鍵入下面的命令;
-073FF
指令執(zhí)行后,端口73H中的數(shù)據(jù)為OFFH。
★P命令
格式:P[=地址][數(shù)據(jù)]
功能:執(zhí)行一個子程序調(diào)用指令,循環(huán)指令,中斷指令或
一個重復(fù)字符串指令,停止在下一條指令上。
參數(shù)說明:匚地址]指定第一條要執(zhí)行指令的位置。如果
不指定地址,則默認(rèn)地址是在CS:IP寄存器中指定的當(dāng)前
地址,[數(shù)據(jù)]指定在將控制返回給Debug之前要執(zhí)行的
指令數(shù),默認(rèn)值為lo
P命令使用
說明:使用P命令執(zhí)行程序,該程序不間斷運行,直到循環(huán)、
重復(fù)字符串指令、軟件中斷或者完成了指定地址的子例程
為止,或者直到執(zhí)行了指定數(shù)量的機器指令為止。若被執(zhí)
行的指令不是循環(huán)、重復(fù)的字符串指令、軟件中斷或子程
序,貝UP命令與T(跟蹤)命令的作用相同。
考慮程序在地址CS:168F處有一個call指令。要運行完
call目標(biāo)位置的子程序然后將控制返回Debug,從鍵盤鍵
入下面命令:
P=168F
執(zhí)行指令后,按如下格式顯示結(jié)果:
AX=OOOOBX=OOOOCX=OOOODX=OOOOSP=OOOOBP=OOOO
S>00001)1=0000
DS=0AF6ES=0AF6SS=0AF6CS=0AF6IP=1692NVUPEIPL
NZACP0NC
0AF6:1692BA2601MOVAX,0126
★Q命令
格式:Q
功能:退出DEBUG返叵IDOS。
參數(shù)說明:無參數(shù)。
Q命令使用
-Q
執(zhí)行該命令后,結(jié)束DEBUG,返回DOS
★R命令
格式:R[寄存器]
功能:1.顯示單個寄存器的內(nèi)容,并提供修改功能。2.顯
示所有寄存器內(nèi)容,再加上字母標(biāo)志位狀態(tài)以及要執(zhí)行的
下一條指令。3.顯示8個標(biāo)志位狀態(tài),并提供修改功能。
參數(shù)說明:[寄存器]指定要顯示其內(nèi)容的寄存器名。
R命令使用
說明:可以使用的寄存器名有:AX、BX、CX、DX、SP、BP、
SI、DI、DS、ES、SS、CS、IP、PC及F。鍵入R命令不跟
任何可用的寄存器名,則將顯示所有的寄存器的內(nèi)容以及
CS:IP指向的存儲單元中的內(nèi)容;若鍵入R命令指定了寄
存器名稱,將以十六進制數(shù)形式顯示該寄存器中的內(nèi)容,
下一行顯示冒號提示符,在冒號提示符后面可以為寄存器
鍵入新的數(shù)據(jù)。若不需要修改寄存器的數(shù)據(jù),直接按ENTER
鍵返回Debug提示符。如果鍵入f字符代替寄存器名,
Debug將每個標(biāo)記的當(dāng)前設(shè)置顯示為兩字母代碼,然后顯
示Debug提示符。要更改標(biāo)志的設(shè)置,請從下表中鍵入適
當(dāng)?shù)膬勺帜复a;若不需要修改,直接ENTER鍵返回Debug
提示符。可以修改全部或部分標(biāo)志位,可以按任何順序鍵
入新的標(biāo)志值。不需要在這些值之間留出空格。任何沒有
指定新值的標(biāo)志保持不變。在DEBUG下,標(biāo)志位表示如下:
標(biāo)志名標(biāo)志為1標(biāo)志為0
OFOVNV
DFDNUP
IFEIDI
SFNGPL
ZFZRNZ
AFACNA
PFPEPO
CFCYNC
注意:若輸入的寄存器名不在上面的有效寄存器名之內(nèi),
將顯示:
bferror
R命令后只能跟一個有效的寄存器名。修改標(biāo)志位如果指
定沒有在前面的表中列出的標(biāo)志代碼,將顯示:
bferror
若為一個標(biāo)志位指定了多個值,Debug將顯示以下消息:
dferror
要只查看標(biāo)志的狀態(tài),鍵入以下命令:
-RF
將按如下格式顯示:
NVUPDINGNZACPENC-_
此時可以按任意順序鍵入一個或多個有效的標(biāo)志值,其中
可以有或沒有空格,如下所示:
NVUPDINGNZACPENC-PLEICY
執(zhí)行指令后,將使用新的標(biāo)志位數(shù)值代替舊值。
要查看當(dāng)前所有寄存器的取值、所有標(biāo)志位的內(nèi)容和CS:IP
指向的內(nèi)存單元指令,鍵入以下命令:
—R
如果當(dāng)前位置是CS:1692,顯示外觀將類似于以下內(nèi)容:
AX=OOOOBX=OOOOCX=OOOODX=OOOOSP=OOOOBP=OOOO
SI=0000DI=0000
DS=0AF6ES=0AF6SS=0AF6CS=0AF6IP=1692NVUPEIPL
NZACPONC
0AF6:1692BA2601MOVAX,0126
從鍵盤上鍵入如下命令:
-RCX
執(zhí)行后,將顯示:
CX0000
在冒號后可以位CX鍵入新值,若不需要改變,直接按
ENTERo
★S命令
格式:S[地址范圍][字符串]
功能:在指定的地址范圍內(nèi)查找給定的字符串。
參數(shù)說明:[地址范圍]指定要搜索范圍的開始和結(jié)束地址。
[字符串]指定要搜索的字節(jié)值或字符串。字符串應(yīng)包括在
引號中。
s命令使用
說明:若在給定的分為內(nèi)要搜索字節(jié)出現(xiàn)多次,將顯示出
所有地址。隱含地址為DS段值。
假定從范圍DS:100到DS:110查找是否包含61,鍵入下
面命令:
-S10011061
執(zhí)行程序后,顯示:
0AF6:010A
0AF6:010F
若要在范圍CS:100到CS:200內(nèi)搜索字符串“wangxiao”,
鍵入下面的命令:
-sCS:100CS:200'wangxiao'
★T命令
格式:T[=地址][指令條數(shù)]
功能:逐條跟蹤程序的執(zhí)行,每條指令執(zhí)行后都將顯示各
寄存器的內(nèi)容。
參數(shù)說明:[=地址]指定第一條要執(zhí)行指令的位置。如果
不指定地址,則默認(rèn)地址是在CS:IP寄存器中指定的當(dāng)前
地址,[指令條數(shù)]指定在將控制返回給Debug之前要執(zhí)
行的指令數(shù),默認(rèn)值為lo
T命令使用
說明:通常采用跟蹤一條指令,但用戶也可以用指令條數(shù)
設(shè)定一次跟蹤多條指令,每執(zhí)行一條指令之后,顯示所有
寄存器的內(nèi)容和標(biāo)志狀態(tài)以及下一條指令在內(nèi)存中的保存
情況。T命令若不跟[=地址]參數(shù),則從當(dāng)前CS:IP處開始執(zhí)
行,第一次鍵入的T命令從CS:100處開始執(zhí)行程序。T命令
默認(rèn)段寄存器是是CS。參考P命令。
鍵入下面得到命令:
-T
若是第一次執(zhí)行,則顯示:
AX=0000BX=0000CX=OOOODX=OOOOSP=FFEEBP=OOOO
SI=0000DI=0000
DS=0AF6ES=0AF6SS=0AF6CS=0AF6IP=0103NVUPEIPL
NZACPONC
0AF6:0103BA2601MOVAX,0126
若要從CS:200處開始執(zhí)行程序,則鍵入下面的命令:
T=CS:200
★U命令
格式:U[起始地址]或者[地址范圍]
功能:將內(nèi)存中的內(nèi)容轉(zhuǎn)換為匯編語句。
參數(shù)說明:[起始地址]或者[地址范圍]指定要反匯編代碼的
起始地址和結(jié)束地址,或起始地址和長度。
U命令使用
說明:U命令中如果沒有使用參數(shù),第一次使用,則U命令從
CS:IP開始對20h個字節(jié)內(nèi)容進行反匯編;若不是第一次使
用,則從前面U命令所顯示地址后的第一個地址開始開始對
20h個字節(jié)內(nèi)容進行反匯編。
若要從CS:100開始反匯編8(10h)字節(jié),鍵入下面命令:
-UCS:100108
程序執(zhí)行后,顯示下面的結(jié)果:
0AF6:010021725FAND[BP+SI+5F],SI
0AF6:0103C606E3991AMOVBYTEPTR[99E3],1A
0AF6:0108C3RET
★W命令
格式:W[地址][盤符:][起始扇區(qū)][扇區(qū)數(shù)]
功能:將內(nèi)存中的數(shù)據(jù)寫入磁盤中。
參數(shù)說明:[地址]指定要寫到磁盤文件的文件或部分文件的
起始內(nèi)存地址。如果不指定address,Debug程序?qū)?/p>
CS:100開始。[盤符:]指定包含目標(biāo)盤的驅(qū)動器。該值是
數(shù)值型:0=41=8,2=(:,等等。[起始扇區(qū)]指定要寫入
第一個扇區(qū)的十六進制數(shù)。[扇區(qū)數(shù)]指定要寫入的扇區(qū)數(shù)。
W命令使用
說明:在使用不帶參數(shù)的W命令之前,BX和CX中應(yīng)包
含要寫入文件的字節(jié)數(shù),BX為高位,CX為低位,寫入的
文件為最近N命令命名的文件。不能用W命令寫入.exe
或.hex文件。
從鍵盤鍵入下面的命令:
-NABC.DAT
一W
則執(zhí)行上面的命令后,把當(dāng)前CS:100指向的內(nèi)存開始的數(shù)
據(jù)寫入到ABC.DAT文件中,寫入字節(jié)大小有BX和CX中
大小規(guī)定。
假定要將起始地址為DS:200的內(nèi)存內(nèi)容寫入到驅(qū)動器A
的磁盤中。需要將數(shù)據(jù)從磁盤的邏輯扇區(qū)號10H開始并持
續(xù)10H個扇區(qū)。則鍵入下面命令:
-WDS:20001010
★XA命令
格式:XA[頁面數(shù)]
功能:分配擴展內(nèi)存的指定頁面數(shù)
參數(shù)說明:[頁面數(shù)]指定要分配的擴展內(nèi)存的16KB頁數(shù)。
XA命令使用
說明:要使用擴展內(nèi)存,必須安裝符合4.0版的
Lotus/Intel/Microsoft擴展內(nèi)存規(guī)范(LIMEMS)的擴展內(nèi)
存設(shè)備驅(qū)動程序。如果指定的頁面數(shù)可用,則將顯示消息
表明所創(chuàng)建的句柄的十六進制數(shù);否則顯示相關(guān)的錯誤消
息。
要分配擴展內(nèi)存的8個頁面,鍵入下面命令:
-XA8
執(zhí)行指令后,若執(zhí)行成功,顯示下面消息:
Handlecreated=0003
若失敗,則可能顯示:
EMSnotinstalled
★XD命令
格式:XD[釋放的句柄]
功能:釋放指向擴展內(nèi)存的句柄。
參數(shù)說明:[釋放的句柄]指定要釋放的句柄。
XD命令使用
說明:見XA命令說明
若要釋放句柄0003,鍵入下面命令:
-XD0003
執(zhí)行指令后,若執(zhí)行成功,顯示下面消息:
Handle0003deallocated
若失敗,則可能顯示:
EMSnotinstalled
★XS命令使用
說明:見XA命令說明
★XM命令
格式:XM[要映射擴展內(nèi)存的邏輯頁面號][映射到的物理
頁面號][句柄]
功能:將屬于指定句柄的擴展內(nèi)存邏輯頁映射到擴展內(nèi)存
的物理頁。
參數(shù)說明:[要映射擴展內(nèi)存的邏輯頁面號]指定要映射到
物理頁的擴展內(nèi)存的邏輯頁面號。[映射到的物理頁面號]
指定將映射到的物理頁面號。[句柄]指定句柄。
XM命令使用
說明:見XA命令說明
若要將句柄0003的邏輯頁3映射到物理頁4,鍵入下面
命令:
-XM340003
執(zhí)行指令后,若執(zhí)行成功,顯示下面消息:
Logicalpage03mappedtophysicalpage04
★XS命令
格式:XS
功能:顯示有關(guān)擴展內(nèi)存狀態(tài)的信息。
參數(shù)說明:無參數(shù)
三、DEBUG的有關(guān)說明
(1)在DEBUG狀態(tài)下,所有輸入的數(shù)值都不能帶有
后綴區(qū)分進制,輸入的數(shù)值都為16進制數(shù);
(2)命令可大寫或小寫,DEBUG命令對大小不敏感;
(3)日以用vCtrb?+vBreak>鍵來停止一個命令的執(zhí)行返
回DEBUG狀態(tài)
(4)每個命令只有在回車后才有效;
(5)按<Ctrl>+<NumeLock>鍵可暫停移動顯示,按任
一鍵繼續(xù);
(6)在DEBUG狀態(tài)下面,輸入?可以得至I」所有DEBUG
命令的使用說明;
四、例題講解
1.在匯編中若想對某一程序進行調(diào)試,可以使用debug進
行單步T命令跟蹤,但當(dāng)遇到調(diào)用int21H中斷輸入指
令時,如何進行輸入以便繼續(xù)跟蹤調(diào)試程序?
解:遇到int21h之類,用p即可完成中斷的功能而不進
入中斷內(nèi)部。單步調(diào)試多用p,除非你對某個子程感到懷疑
或有興趣了,才用t命令進去看看,對int類的指令也一樣.
2.執(zhí)行debug-a后,如果有一行輸入錯誤,如何更改這一行?
解:
假如在Debug下進行如下輸入:
-a
2129:01OOmovax,200
2129:0103movbx,200
2129:0106movex,200
2129:0109
此時,發(fā)現(xiàn)movbx,200一句錯誤,應(yīng)為movbx,20,可以敲
回車返回狀態(tài),然后輸入:
-a103
2129:0103movbx,20
如果多或者少若干行,不必重新輸入,可以用M命令移動
后面的程序來去掉或者增加程序空間。
3.在Debug下,如何顯示BIOS的日期。
解:
-DFFFF:0006L8〈按回車,
在作者的電腦上這里顯示為"2/23/02."
作者的電腦顯示如下:
FFFF:OOOO322F-32332F3030
002/23/02.
相信你的電腦里也是用這種格式顯示的。這里顯示出來的
是使用者BIOS的日期,有興趣的話可以重新開機看看,
注意開機時的顯示。
4.在你的電腦的COMMAND.COM文件里搜尋"IBM"這幾
個字符。
解:
注意,文件COMMAND.COM在各個電腦的存放位置可能
不一樣。
以下是作者做的:
C:\WINDOWS\system32>debug
-n
-1
-sOlffff'IBM'
-sOlffff'COMMAND'
0B3A:005D
0B3A:0082
0B3A:06C2
0B3A:07E5
0B3A:080D
0B3A:20E0
0B3A:210A
0B3A:22B8
OB3A:22E1
0B3A:234B
0B3A:23C7
0B3A:9E25
汪忠:
(1)搜尋是要區(qū)分大小寫的。
⑵可以看到上面是沒有找至的,可以試一試
"PATH","COMSPEC","COMMAND",已經(jīng)找到了
COMMAND,o
(3)這種方法用在查找加密資料和已被刪除的資料等方面時
是十分有用的。
5.在DEBUG下編寫程序,在計算機屏幕上輸
出“ABC”
解:如下
C:\DOCUME-l\WANGXI-l>debug
-a
0AF4:0100movdl,41
0AF4:0102movah,02
0AF4:0104int21
0AF4:0106movdl,42
0AF4:0108int21
0AF4:010Amovdl,43
0AF4:010Cint21
0AF4:010Eint20
0AF4:0110
AX=0000BX=0000CX=0000DX=0000SP=FFEE
BP=OOOOSI=0000DI=0000
DS=0AF4ES=0AF4SS=0AF4CS=0AF4IP=0100
NVUPEIPLNZNAPONC
0AF4:0100B241MOVDL,41
-rbx
BX0000
-rex
ex0000
:10
-nc:\masm\
-w
Writing00010bytes
-q
C:\DOCUME-l\WANGXI-l>
''isnotrecognizedasaninternalorexternal
command,
operableprogramorbatchfile.
C:\DOCUME-1\WANGXI-1>cd\
C:\>cdmasm
C:\masm>
ABC
C:\masm>
思考:BX和CX中的數(shù)值為何分別設(shè)置為0和10呢?
6.在Debug卜查看程序的內(nèi)容并運行之。
解:
C:\masm>debug
-n
-1
-u
0B3A:0100B241MOVDL,41
0B3A:0102B402MOVAH,02
0B3A:0104CD21INT21
0B3A:0106B242MOVDL,42
0B3A:0108CD21INT21
0B3A:010AB243MOVDL,43
0B3A:010CCD21INT21
0B3A:010ECD20INT20
-r
AX=OOOOBX=OOOOCX=0010DX=0000SP=FFFE
BP=OOOOSI=OOOODI=OOOO
DS=0B3AES=0B3ASS=0B3ACS=0B3AIP=0100
NVUPEIPLNZNAPONC
0B3A:0100B241MOVDL,41
-g
ABC
Programterminatednormally
五、練習(xí)
1.反復(fù)練習(xí)DEBUG的命令,熟練掌握只各命令的使用方
法。
2.用鍵盤,將DS:100H起八個內(nèi)存地址單元置AAH,
將DS:200H起八個內(nèi)存單元置FFH。
3.用鍵盤,將AX,BX,CX,DX及DS,ES清0。
4.用A命令輸入以下的程序,用單步命令T跟蹤執(zhí)行程
序,并觀察每一步的寄存器內(nèi)容和標(biāo)志位的變化情況,并
填寫地址分配和目標(biāo)代碼。
地址分配目標(biāo)代碼源程序
____________MOV
AL,2
____________PUSHBX
____________MOV
BL,AL
____________DECAL
____________DECAL
____________DECAL
____________INCAL
____________INCAL
POPBX
INT20H
5.通過以上程序的調(diào)試和觀察,試用匯編指令編一個簡單
的程序,將AAH,BBH,CCH,DDH分別送AH,BH,
CH,DH寄存器,用A命令輸入,用T命令單步執(zhí)行,觀
察每一步的結(jié)果是否與預(yù)計結(jié)果相同。
6.對以下源程序進行調(diào)試,記錄下每一條指令的目標(biāo)代
碼,相應(yīng)寄存器變化情況和程序的最終執(zhí)行結(jié)果。
源程序:MOVAL,30H
MOVBL,26H
ADDAL,BL
PUSHAX
POPDX
MOVAH,02H
INT21H
INT20H
7.文件寫盤操作:
(1)將實驗4中的源程序用A命令寫入CS:100起始的
?片內(nèi)存,再用U命令進行反匯編,可以看出這段程序所
占的內(nèi)存長度。
(2)用R命令使BX,CX中包含該文件的字節(jié)數(shù),其中
BX為高位,CX為低位。
(3)—N盤名:文件名.擴展名
-W
則將該文件寫入指定磁盤中。若要檢查文件是否確實
寫入,可用下面的讀盤操作。
8.文件讀盤操作:
—N盤名:文件名.擴展名
-L
將文件讀入CS:200起始的一片內(nèi)存,再用U命令進行反
匯編顯示檢查。
9.用命令U查看8086/8088CPU在開機后執(zhí)行的第一條指
令。
10.用H命令檢查下列各組16進制數(shù)加減結(jié)果并和你的手
算結(jié)果比較:
(1)34H,22H(2)56H,78H(3)A5,79H
(4)1284H,5678H(5)A758,347FH
第二章80X86指令系統(tǒng)
2.1數(shù)據(jù)傳送指令的使用
一、數(shù)據(jù)傳送指令概述
負(fù)責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器、存儲單元以
及I/O端口,或從內(nèi)存單元、I/O端口中讀取數(shù)據(jù)。可以分
為下面幾類:
1.通用傳送指令:MOV,PUSH,POP,XCHG,XLAT
2.輸入輸出指令指令:IN,OUT
3.目的地址傳送指令:LEA,LDS,LES
4.標(biāo)志位傳送指令:LAHF,SAHF,PUSHF,POPF
注意:除SAHF和POPF指令外,所有指令對標(biāo)志寄存器
沒有影響。
二、數(shù)據(jù)傳送指令詳解
1.通用傳送指令(除了XCHG以外)是唯一允許以段寄
存器為操作數(shù)指令。用于在內(nèi)存單元、寄存器、立即數(shù)之
間進行數(shù)據(jù)傳送。
★MOV傳送指令
格式:MOVdest,src
功能:把一個字節(jié)(B)或一個字(W)由源操作數(shù)src傳送
至目的操作數(shù)desto
說明:
(1)不能直接在兩個內(nèi)存單元之間進行數(shù)據(jù)傳遞;
MOVMEM2,MEM1;錯
MOVAX,MEM1;對
MOVMEM2,AX
(2)立即數(shù)不能直接送入段寄存器中;
MOVDS,2000;錯
MOVAX,2000;對
MOVDS,AX
(3)不能直接在段寄存器之間的傳送數(shù)據(jù);
MOVES,DS;錯
MOVAX,DS;對
MOVES,AX
(4)CS和IP不能作為目標(biāo)操作數(shù),可以作為源操作數(shù);
MOVCS,AX;錯
MOVAX,CS;對
MOVIP,AX;錯
MOVAX,IP;錯
★PUSH入棧指令
格式:PUSHsrc
功能:把一個字從源操作數(shù)src壓入由SP指向堆棧頂部。
同時SP=SP—2。
說明:
(1)PUSH入棧指令可以使用的源操作數(shù)src有:寄存器
(通用寄存器,地址指針,變址寄存器,段寄存器,
存儲器。
PUSHCS;可以,但是實際不要使用
PUSHIP;錯
(2)PUSH的操作數(shù)必須為一個字。字的低字節(jié)壓入堆棧
的低地址,高字節(jié)壓入堆棧的高地址中;
PUSHAX;把寄存器AL和AH中內(nèi)容分別放
在SP和SP+1指向的堆棧空間中。
★POP出棧指令
格式:POPdest
功能:把當(dāng)前SP所指向堆棧頂部的一個字彈出送入指定的
目的操作數(shù),同時SP=SP+2。
說明:
(1)POP出棧指令可以使用的目的操作數(shù)dest有:寄存
器(通用寄存器,地址指針,變址寄存器,段寄存
器CS除外),存儲器。
POPCS;可以,但是實際不要使用
POPIP;錯
(2)POP的操作數(shù)必須為一個字。堆棧彈出的低地址內(nèi)
容放入操作數(shù)的低字節(jié),高地址內(nèi)容放入操作數(shù)高字
節(jié)中;
POPAX和SP+1指向的堆棧空間中內(nèi)容彈出
放到寄存器AL和AH中。
★XCHG交換指令
格式:XCHGdest,src
功能:把一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)進行
交換。
說明:
(1)寄存器之間、寄存器和存儲器之間進行交換,不能
在兩個存儲器之間進行交換,兩個操作數(shù)中必須有一
個為寄存器操作數(shù);
XCHGBL,DL;對
XCHGAX,SI;對
XCHGCOUNT[DI],AX;對
(2)段寄存器不能作為一個操作數(shù);
XCHG[BX],[DI];錯
XCHGDS,AX;錯
★XLAT換碼指令
格式:XLATstr_table或XLAT
功能:把DS:(BX+AL)內(nèi)存單元中的內(nèi)容取出送入AL寄
存器中。
說明:
(1)XLAT指令使用方法:
?先建立一個字節(jié)表格;
?表格第一個字節(jié)偏移地址存入str_table送入BX寄存
器;
?需要轉(zhuǎn)換代碼的序號(相對于表格首地址位移量)
存入AL;(表中第一個元素的序號為0)
?執(zhí)行XLAT指令后,表中指定序號的元素存于AL
中。(AL)為轉(zhuǎn)換的代碼。
(2)默認(rèn)寄存器:
?BX:存放表格第一個字節(jié)偏移地址
?AL:使用XLAT指令前,存放相對于表格首字節(jié)
的位移偏移量;使用XLAT指令后,存放表格中指
定的字節(jié)的內(nèi)容;
(3)內(nèi)存的數(shù)據(jù)段中有一十六進制數(shù)字的ASCII碼表。首
地址為:Hex_table,欲查出元素W的ASCII碼;
MOVBX,OFFSETHex_table
MOVAL,OAH
XLATHex_table
程序運行后,AL寄存器中的內(nèi)容為41H。
2.輸入輸出指令用于在寄存器和外設(shè)端口之間進行數(shù)據(jù)
交換,無論接受還是發(fā)送數(shù)據(jù),必須通過累加器AX(字)
或AL(字節(jié)),又稱累加器專用傳送指令。輸入輸出指令有
兩種使用格式:長格式和短格式。若需要訪問的端口號小
于256,則端口號可以以立即數(shù)形式寫在指令中,此格式
稱為長格式;若需要訪問的端口號大于等于256,則端口
號應(yīng)先放在DX寄存器中,此格式稱為短格式。
★IN輸入指令
格式:INAL,data8;端口地址8位,輸入一
個字節(jié)
INAX,data8;端口地址8位,輸入一
個字
INAL,DX;端口地址16位,輸入一
個字節(jié)
INAX,DX;端口地址16位,輸入一
個字
功能:用于CPU從外設(shè)端口接受數(shù)據(jù)。
說明:
(1)一個端口號只能存放一個字節(jié)數(shù)據(jù);一個字?jǐn)?shù)據(jù)應(yīng)
存放在2個端口中,高地址端口存放高位字節(jié),底
地址端口存放低為位字節(jié);
(2)把(29H)(28H)端口中數(shù)據(jù)(字?jǐn)?shù)據(jù),29H中是高8
位)送入字變量(DATA_WORD)中。
INAX,28H
MOVDATA_WORD,AX
★OUT輸出指令
格式:OUTdata8,AL;端口地址8位,輸出一個字
節(jié)
OUTdata8,AX;端口地址8位,輸出一個字
OUTDX,AL;端口地址16位,輸出一個字
節(jié)
OUTDX,AX;端口地址16位,輸出一
個字
功能:用于CPU向外設(shè)端口發(fā)送數(shù)據(jù)。
說明:
(1)參見IN指令說明;
(2)把(AX)中的字?jǐn)?shù)據(jù)送入05H和06H端口中。
OUT5,AL
3.目的地址傳送指令用于獲取操作數(shù)的地址信息
★L(fēng)EA
格式:LEAregl6,meml6
功能:把指令中指定的存儲器操作數(shù)有效地址裝入指定的
寄存器。
說明:
(1)LEA指令中的目標(biāo)寄存器必須是16位的通用寄存
器,源操作數(shù)必須是一個存儲器。
(2)LEA指令與MOV的區(qū)別:
LEABX,BUFFER;把BUFFER指向內(nèi)
存單元的有效地址送BX寄存器
MOVBX,BUFFER;把BUFFER指向內(nèi)
存單元中的內(nèi)容送BX寄存器
LEA指令與MOV等價
LEABX,BUFFER;把BUFFER指向內(nèi)
存單元的有效地址送BX寄存器
MOVBX,OFFSETBUFFER;同上
★L(fēng)DS
格式:LDSreg16,mem32
功能:將指令指定mem32內(nèi)存單元中的前兩個單元內(nèi)容
(16位偏移量)裝入指令指定通用寄存器regl6,把后兩個
單元內(nèi)容(段地址)裝入到DS段寄存器。
說明:
(1)LDS默認(rèn)規(guī)定把mem32指向的后兩個內(nèi)存單元中的
內(nèi)容放入DS寄存器中。Regl6一般使用SI寄存器。
★L(fēng)ES
格式:LESreg16,mem32
功能:將指令指定mem32內(nèi)存單元中的前兩個單元內(nèi)容(16
位偏移量)裝入指令指定通用寄存器regl6,把后兩個單元
內(nèi)容(段地址)裝入到ES段寄存器。
說明:
(1)LES默認(rèn)規(guī)定把mem32指向的后兩個內(nèi)存單元中的
內(nèi)容放入ES寄存器中。Regl6一—般使用DI寄存器。
4.標(biāo)志傳送指令用于完成和標(biāo)志寄存器相關(guān)的操作,采用
了隱含寄存器(AH、PSW)規(guī)定操作數(shù)方式,LAHF、PUSHF
不影響標(biāo)志位,SAHF.POPF由裝入的值確定標(biāo)志位的值,即
影響標(biāo)志位。
★L(fēng)AHF
格式:LAHF
功能:標(biāo)志寄存器低八位低8位送入AH寄存器中。
說明:
(1)默認(rèn)規(guī)定了AH寄存器和標(biāo)志寄存器PSW的低8位;
★SAHF
格式:SAHF
功能:寄存器AH中內(nèi)容送入標(biāo)志寄存器低八位。
說明:
(1)默認(rèn)規(guī)定了AH寄存器和標(biāo)志寄存器PSW的低8位;
★PUSHF
格式:PUSHF
功能:把標(biāo)志寄存器PSW中內(nèi)容放入堆棧,同時SP=SP
+2。
說明:
(1)默認(rèn)規(guī)定了標(biāo)志寄存器和和當(dāng)前堆棧棧頂空間;
★POPF
格式:POPF
功能:把當(dāng)前堆棧棧頂?shù)膬?nèi)容彈出送入標(biāo)志寄存器PSW
中,同時SP=SP—2。
說明:
(1)默認(rèn)規(guī)定了標(biāo)志寄存器和和當(dāng)前堆棧棧頂空間;
三、數(shù)據(jù)傳送指令的有關(guān)說明
1.MOV指令的源操作數(shù)和目的操作數(shù)必須同時為字節(jié)或
字操作數(shù);若指令中給出的兩個操作數(shù)一個為立即數(shù)操作
數(shù),另一個為內(nèi)存操作數(shù),則不能確定內(nèi)存操作數(shù)為字節(jié)
操作數(shù)還是字操作數(shù),必須使用PTR偽指令進行說明;若
指令中有一個操作數(shù)為寄存器操作數(shù),則由寄存器規(guī)定操
作數(shù)是字節(jié)還是字操作數(shù);例如:
MOVNEM1,AX;
把AX寄存器中字?jǐn)?shù)據(jù)傳送到地址為NEM1字內(nèi)存單元
中,高字節(jié)AH中內(nèi)容傳送到地址為NEM1+1內(nèi)存單元
中,低字節(jié)AL中的內(nèi)容傳送到地址NEM1內(nèi)存單元中;
從指令中可以看出,在內(nèi)存中存放一個字?jǐn)?shù)據(jù)需要兩個
內(nèi)存單元;內(nèi)存單元中字?jǐn)?shù)據(jù)的地址使用低字節(jié)的地址
表示;
MOVNEM1,12H
把12H傳送到地址為NEM1的內(nèi)存單元。上面的指令
是錯誤的,原因是NEM1可以表示內(nèi)存單元中一個字節(jié)
數(shù)據(jù)的地址或者是一個字?jǐn)?shù)據(jù)的地址,那么12H到底應(yīng)
該傳送到字內(nèi)存單元中還是字內(nèi)存單元中呢?不能由
12H的大小而斷定上面的語句是字節(jié)傳送指令。正確語
句應(yīng)該表示如下:
MOVWORDPTRNEM1,12H
把12H傳送到字內(nèi)存單元NEM1中
MOVBYTEPTRNEM1,12H
把12H傳送到字節(jié)內(nèi)存單元NEM1中
2.PUSH、POP指令只需要一個操作數(shù),必須為字操作數(shù);
另一個默認(rèn)的操作數(shù)是SS:SP所指向的字內(nèi)存單元操作
數(shù)。POPF和PUSHF指令的操作數(shù)也必須為字操作,而且
默認(rèn)為標(biāo)志寄存器PSW和SS:SP所指向字內(nèi)存單元;
SAHF和LAHF指令的操作數(shù)必須為字節(jié)操作數(shù),而且默
認(rèn)為AH寄存器和PSW寄存器的低8位。
3.LEA、LDS和LES是用來取源操作數(shù)的地址的指令,則
目的操作數(shù)必須為16位的通用寄存器;
四、例題講解
1.使用數(shù)據(jù)傳送指令,把標(biāo)志寄存器中的OF標(biāo)志清0其
余位保持不變;
PUSHF;把PSW中的內(nèi)容傳送到堆棧中
POPAX;把PSW的內(nèi)容從堆棧中彈出,傳送
到AX寄存器中
ANDAX,0F7FFH;把AX中第11位置0,其余位保
持不變
PUSHAX;把AX中內(nèi)容壓入堆棧
POPF;把堆棧中內(nèi)容彈出到PSW中
思考:采用SAHF和LAHF能否實現(xiàn)上面的功能,為什
么?
2.下列ASCII碼字符串(包括空格符)依次存放在起始地
址為xwang的內(nèi)存單元中:
xwangdb'wangxiaosoftwarecollege,
使用XLAT指令,從ASCII碼字符串中取第0個和第5個
字符的ASCII碼傳送到DX寄存器中。
MOVBX,OFFSETxwang
MOVAL,OH
XLAT
MOVAH,AL
MOVAL,5H
XLAT
MOVDX,AX
思考:若不采用XLAT指令,如何實現(xiàn)上面的功能?
3.在當(dāng)前數(shù)據(jù)段偏移地址為2000H開始的4個內(nèi)存單元
中,存放著某個內(nèi)存空間的地址指針,高字存放段地址指
針,低字存放偏移地址指針,試把該地址指針指向的內(nèi)存
空間的內(nèi)容讀出放入AX寄存器中。
MOVSI,2000H
MOVAX,[SI]
MOVBX,AX
MOVAX,[SI+2]
MOVDS,AX
MOVAX,[BX]
五、練習(xí)
1.傳送指令
1)用A命令在內(nèi)存100H處鍵入下列內(nèi)容:
MOVAX,1234
MOVBX,5678
XCHGAX,BX
MOVAH,35
MOVAL,48
MOVDX,75AB
XCHGAX,DX
2)用U命令檢查鍵入的程序并記錄,特別注意左邊的機器
碼。
3)用T命令逐條運行這些指令,每運行一行檢查并記錄有
關(guān)寄存器及IP的變化情況。并注意標(biāo)志位有無變化。
2.改變標(biāo)志寄存器psw中tf標(biāo)志的狀態(tài)(0——1或
1——0),其余位保持不變。
3.設(shè)DS二當(dāng)前段地址,BX=0300H,SI=0(X)2H,潮DEBUG
的命令將存儲器偏移地址300H?304H連續(xù)單元順序裝入
OAH,OBH,OCH,ODH,0EH。在DEBUG狀態(tài)下使用A
命令送入下面程序,并用單步T命令執(zhí)行的方法,分析每
條指令源地址的形成過程?當(dāng)數(shù)據(jù)傳送每完成一次,試分
析AX寄存器中的內(nèi)容是什么?
程序清單如下:
MOVAX,BX
MOVAX,0304H
MOVAX,[0304H]
MOVAX,[BX]
MOVAX,OOOlfBX]
MOVAX,[BX][SI]
HLT
4.使用標(biāo)志位傳送指令,編程序段將標(biāo)志位寄存器的低八
位的值存入內(nèi)存單元DS:1000H中或堆棧中,然后將標(biāo)志
位寄存器的低八位置位為10101010c
5.使用xlat命令,完成小寫字母a~z的ascii碼的轉(zhuǎn)換。
6.將bx寄存器中的16位二進制數(shù)分為4組,每組4位分
別壓入堆棧進行保護。
7.數(shù)組xwang定義如下:
xwangdb1,2,3,4,5,6,7,8,0
zerodb?
(1)把內(nèi)容為0的內(nèi)存單元的偏移地址和段地址分別
送入AX和ES寄存器中;
(2)若SI寄存器指向數(shù)組xwan
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025安全標(biāo)準(zhǔn)化安全培訓(xùn)考試試題下載
- 2024-2025新版車間安全培訓(xùn)考試試題A卷附答案
- 2025年企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試試題附參考答案(典型題)
- 2025年管理人員安全培訓(xùn)考試試題附參考答案【能力提升】
- 2025-2030年中國LED顯示屏市場發(fā)展形勢與產(chǎn)業(yè)投資風(fēng)險研究報告
- 2025班組三級安全培訓(xùn)考試試題及參考答案(典型題)
- 2025年公司及項目部安全培訓(xùn)考試試題帶答案(培優(yōu)B卷)
- 2025公司項目負(fù)責(zé)人安全培訓(xùn)考試試題附參考答案【培優(yōu)】
- 2025年新入職工職前安全培訓(xùn)考試試題答案真題匯編
- 2025至2031年中國白18k珍珠吊墜行業(yè)投資前景及策略咨詢研究報告
- JJF 1272-2011阻容法露點濕度計校準(zhǔn)規(guī)范
- 基于模糊控制的移動機器人的外文翻譯
- 魯迅《藥》課本劇劇本
- 二年級下冊科學(xué)教案 第三單元1.《春夏秋冬》 大象版
- 低壓電工安全培訓(xùn)課件-
- 充電樁的施工方案
- 遠(yuǎn)古苗族的-附麗于古歌和刺繡
- TSG-R0005-2022《移動式壓力容器安全技術(shù)監(jiān)察規(guī)程》(2022版)
- 【推薦】大華“智慧消防”物聯(lián)網(wǎng)綜合管理解決方案
- 2022年CASEAR2簡易操作手冊
- 中國墓葬文化(專業(yè)應(yīng)用)
評論
0/150
提交評論