計算機組成原理與匯編語言程序設(shè)計_第1頁
計算機組成原理與匯編語言程序設(shè)計_第2頁
計算機組成原理與匯編語言程序設(shè)計_第3頁
計算機組成原理與匯編語言程序設(shè)計_第4頁
計算機組成原理與匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩248頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論