微機原理及應(yīng)用CH4 MASM匯編語言基礎(chǔ)_第1頁
微機原理及應(yīng)用CH4 MASM匯編語言基礎(chǔ)_第2頁
微機原理及應(yīng)用CH4 MASM匯編語言基礎(chǔ)_第3頁
微機原理及應(yīng)用CH4 MASM匯編語言基礎(chǔ)_第4頁
微機原理及應(yīng)用CH4 MASM匯編語言基礎(chǔ)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 MASM匯編語言基礎(chǔ)4.1 匯編語言語句種類及其格式4.2 匯編語言數(shù)據(jù)4.3 表達(dá)式與運算符4.4 程序的段結(jié)構(gòu)4.5 其他常用偽指令4.6 匯編語言上機調(diào)試 Intel8086/8088系列微機的匯編程序MASM,是美國Microsoft公司開發(fā)較早的宏匯編程序,它不僅具有ASM的全部功能(支持基本匯編語言),而且增加了指令、結(jié)構(gòu)、記錄等高級宏匯編功能。 語句(Statement)是匯編語言源程序的基本組成單位。一個匯編語言源程序有三種基本語句:指令語句、偽指令語句、宏指令語句。4.1 匯編語言語句種類及其格式 每一條指令語句在匯編時都要產(chǎn)生一個可供機器執(zhí)行的目標(biāo)代碼,這種語句也被

2、稱為可執(zhí)行語句。指令語句的格式如圖4.1所示:圖4.1 指令語句的格式4.1.1 指令語句一條指令語句有如下4個字段:2指令助記符字段這是一條指令中不可缺少的主要成分。它表示這條語句要求CPU完成什么操作。 1標(biāo)號字段這是一個可選字段。標(biāo)號必須以“:”作為結(jié)束符。一個標(biāo)號是一條指令的符號地址,它代表該指令的第一個字節(jié)的地址。 3操作數(shù)字段 按照指令助記符字段要求,指令語句可以有一個操作數(shù)、兩個操作數(shù)或無操作數(shù)。4注釋字段 這是一個可選字段,注釋字段必須以分號“;”為開始,它可以方便程序設(shè)計人員對程序或指令加以注釋,提高程序的的可讀性。4.1.2 偽指令語句 與指令語句不同的是,偽指令本身不產(chǎn)生

3、與之對應(yīng)的目標(biāo)代碼。它是在匯編程序?qū)R編語言源程序匯編期間,由匯編程序處理的操作,它們可以完成如數(shù)據(jù)定義、分配存儲區(qū)、指示程序結(jié)束等功能。 圖4.2 偽指令語句的格式一條偽指令語句也有如下4個字段:1符號名字段 這是一個可選字段。符號名后面不得用冒號“:”,這是它與指令語句突出的一個區(qū)別。2偽指令字段 這是偽指令語句中不可省略的主要成分。它們是偽指令語句要求匯編程序完成的具體操作命令。3操作數(shù)字段 本字段是否需要,需要幾個,需要什么樣的操作數(shù)等都由偽指令字段中偽指令來確定。4注釋字段 這是一個任選字段,它必須以分號為開始,它的作用與指令語句的注釋字段相同。 4.2.1 常量 凡是出現(xiàn)在8086

4、源程序中的固定值(即在匯編期間,它的值已經(jīng)能夠完全確定,在程序運行期間,它的值也不會發(fā)生任何的變化),就稱為常量。 4.2 匯編語言數(shù)據(jù)通常匯編語言能識別的數(shù)據(jù)有:常量、變量和標(biāo)號。1十進制常量:09數(shù)字序列,可以用字母D結(jié)尾,也可沒有結(jié)尾字母。2二進制常量:以字母B結(jié)尾的0和1組成的數(shù)字序列。3八進制常量:以字母O或Q結(jié)尾的07數(shù)字序列。4十六進制常量:以字母H結(jié)尾的09和AF(或af)的數(shù)字字母序列。5字符串常量:用單引號或雙引號括起來的一個或多個字符,這些字符用它的ASCII碼值存儲在內(nèi)存中。變量就是用來表示程序中所用的內(nèi)存操作數(shù)。1定義格式:變量名 類型助記符 操作數(shù),操作數(shù),其中變量

5、名字段是可有可無的,它用于指示內(nèi)存操作數(shù)的地址(符號地址);操作數(shù)字段用于指示內(nèi)存操作數(shù),匯編程序?qū)⒍x的內(nèi)存操作數(shù),按其類型分配內(nèi)存。4.2.2 變量常用的有以下幾種:DB偽指令用來定義字節(jié),其后的每個操作數(shù)都占有一個字節(jié)。DW偽指令用來定義字,其后的每個操作數(shù)都占有一個字(低位字節(jié)存放在低地址,高位字節(jié)存放在高地址)。DD偽指令用來定義雙字,其后的每個操作數(shù)都占有兩個字。DQ偽指令用來定義四個字,其后的每個操作數(shù)都占有四個字。(1)段屬性SEG 它表示變量存放在哪一個邏輯段中。(2)偏移量屬性O(shè)FFSET 表示變量在邏輯段中離段起始點的字節(jié)距離。(3)類型屬性TYPE表示變量占用存儲單元的

6、字節(jié)數(shù),它由類型助記符DB、DW、DD、DQ來規(guī)定。2變量的三個屬性它們通常有以下幾種情況:(1)數(shù)值表達(dá)式:表示內(nèi)存操作數(shù)的初始值,其值應(yīng)在其定義的類型范圍內(nèi)。如:xx DB1,1 yy DW 216,1(2)表達(dá)式:不帶引號的?表示可預(yù)置任何內(nèi)容。3預(yù)置初值 對于DB偽指令,為字符串中每個字符分配一個字節(jié)單元。字符串必須是引號括起來的不超過255個字符。(3)字符串表達(dá)式對于DW偽指令,可以給兩個字符組成的字符串分配兩個字節(jié)的存儲單元,而且這兩個字符的ASCII碼的存儲順序是前一個字符在高字節(jié),后一字符在低字節(jié)。每一個數(shù)據(jù)項只能是12個字符。 對于DD偽指令,僅可給兩個字符組成的字符串分配

7、4個字節(jié)的單元,且這兩個ASCII碼是存儲在兩個低字節(jié)(存儲順序與DW偽指令相同)中,兩個高字節(jié)均存放00H。 (4)帶DUP表達(dá)式:DUP是定義重復(fù)數(shù)據(jù)操作符,在操作數(shù)部分的格式為: 重復(fù)次數(shù) DUP(重復(fù)的內(nèi)容)(1)在指令語句中,如果要對某存儲單元進行存取操作,就可直接引用它的變量名。(2)在偽指令語句中:定義變量時引用了另一個變量,則這個變量的內(nèi)容均是被引用變量的邏輯地址。如用DW,則僅有偏移量,如用DD則前兩個字節(jié)存放偏移量,后兩個字節(jié)存放段地址;注意不能用DB引用變量名。4變量的使用 2標(biāo)號的三個屬性: (1)段屬性:表示這條指令的目標(biāo)代碼在哪個邏輯段中。 (2)偏移量屬性:表示這

8、條指令目標(biāo)代碼的首字節(jié)在段內(nèi)離段起始點的字節(jié)距離。 (3)距離屬性(或類型屬性)。 4.2.3 標(biāo)號(Label)1定義: 標(biāo)號是一條指令目標(biāo)代碼的符號地址,它常作為轉(zhuǎn)移指令或調(diào)用指令的操作數(shù)。4.3.1 算術(shù)運算符 算術(shù)運算符有(加)、(減)、(乘)、/(整除)、MOD(求余),參加運算的數(shù)和運算結(jié)果均是整數(shù)。 4.3.2 邏輯運算符 邏輯運算符有4個:AND(與)、OR(或)、NOT(非)和XOR(異或),參加運算的數(shù)和運算的結(jié)果均是整數(shù),邏輯運算是按位進行的。4.3 表達(dá)式與運算符 這6個關(guān)系運算符分別是:GT(大于)、GE(大于等于)、LT(小于)、LE(小于等于)、EQ(等于)、和N

9、E(不等于)。它們用于比較兩個表達(dá)式,表達(dá)式一定是常數(shù)或同段內(nèi)的變量。若是常數(shù),按無符號數(shù)比較;若是變量則比較它們的偏移量。比較的結(jié)果為以真,表示為全1;結(jié)果為假,表示為全0。4.3.3 關(guān)系運算符1SEG格式:SEG 變量名或標(biāo)號 當(dāng)運算符SEG加在一個變量名或標(biāo)號前面時,匯編程序回送的運算結(jié)果是這個變量或標(biāo)號所在的段的段基址。4.3.4 數(shù)值返回運算符 數(shù)值返回運算符有5個,分別是:SEG、OFFSET、TYPE、LENGTH和SIZE。這種運算符的對象必須是存儲器操作數(shù),即變量名或標(biāo)號,通過運算后返回的是一個數(shù)值。3TYPE 格式:TYPE 變量名或標(biāo)號 如果是變量,則匯編程序?qū)⒒厮驮撟?/p>

10、量的以字節(jié)數(shù)表示的類型:DB為1,DW為2,DD為4,DQ為8。如果是標(biāo)號,則匯編程序?qū)⒒厮痛碓摌?biāo)號類型的數(shù)值:NEAR為1,F(xiàn)AR為2。2OFFSET格式:OFFSET 變量名或標(biāo)號 當(dāng)運算符OFFSET加在一個變量名或標(biāo)號前面時,匯編程序回送的運算結(jié)果是這個變量或標(biāo)號所在的段的偏移量。5SIZE格式:SIZE 變量名 運算符SIZE加在變量的前面,匯編程序回送的值等于LENGTH和TYPE兩個運算符返回值的乘積。4LENGTH 格式:LENGTH 變量名 如果變量是用重復(fù)數(shù)據(jù)操作符DUP說明的,匯編程序?qū)⒒厮屯鈱覦UP給定的值;如果變量沒有用DUP說明,則返回的值總是1。 這種運算符是對

11、變量、標(biāo)號或某存儲器的類型屬性進行修改指定,它主要有PTR、段跨越前綴、SHORT、HIGH和LOW等5種。4.3.5 屬性修改運算符1PTR 格式:類型 PTR 地址表達(dá)式 其中,地址表達(dá)式是指要修改類型屬性的標(biāo)號或存儲器操作數(shù)。如果它是標(biāo)號,則與之對應(yīng)的類型有:NEAR、FAR;如果它是存儲器操作數(shù),則與之對應(yīng)的類型有:BYTE、WORD、DWORD。 2段跨越前綴 它是在存儲器操作數(shù)之前加上段寄存器名和冒號用于強行指定此存儲器操作數(shù)相對哪個段寄存器,共有4種:DS:、CS:、SS:和ES: 3SHORT 用來修飾JMP指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的128127字節(jié)

12、范圍之內(nèi)。4HIGH/LOW格式:HIGH常數(shù)或地址表達(dá)式 LOW常數(shù)或地址表達(dá)式 這兩個運算符稱為字節(jié)分離操作符,它接收一個常數(shù)或地址表達(dá)式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。其中地址表達(dá)式必須具有常量值,HIGH/LOW運算符用于分離出段地址或偏移量的高字節(jié)/低字節(jié)。由高到低,從左往右地對優(yōu)先級別相同的運算符進行計算。 表4.1 算符的優(yōu)先級別關(guān)系表 格式:段名SEGMENT 段名ENDS 4.4 程序的段結(jié)構(gòu)4.4.1 段定義偽指令 一個完整的匯編源程序中可以定義多個段,但同時起作用的最多只有4個。每一個段都是由偽指令SEGMENT開始,由ENDS結(jié)束,SEGMENT和ENDS必

13、須成對出現(xiàn),并且在SEGMENT和ENDS的前面都必須有同一個段名;SEGMENT和ENDS語句之間可以的省略號部分,對于代碼段來說,主要是指令,也可以有偽指令;對于數(shù)據(jù)段、附加段和堆棧段來說,一般是存儲單元的定義、分配等偽操作。4.4.2 段尋址偽指令定義段與段寄存器的關(guān)系,這可用ASSUME這個段尋址偽指令來實現(xiàn),其格式如下:ASSUME段寄存器名:段名,段寄存器:段名, 其中段寄存器名為CS、DS、ES、SS中的一個;段名則必須是由SEGMENT定義過的段名;段寄存器名和段名之間必須有冒號“:”。 ASSUME偽操作的作用指示匯編程序指令中用到的標(biāo)號、過程及變量所在的段。在代碼段中,可以

14、隨時用ASSUME偽指令修改“段寄存器名:段名”的聯(lián)系。2SS的裝入裝入的辦法有兩個: (1)在段定義偽指令的組合類型中選擇“STACK”參數(shù),且在段尋址偽指令(ASSUME)中,把堆棧用的這一個段指派給段寄存器SS。 (2)可用類似DS,ES的裝入辦法。4.4.3 段寄存器的裝入1DS和ES的裝入 在程序中,引用段名就是以立即數(shù)形式獲取該段的段基址,所以一個段的段基址要經(jīng)過通用寄存器傳送給DS,ES。 用DS、ES的裝入的辦法,那么為裝入CS、IP的新值需要執(zhí)行幾條指令。 對CS、IP的裝入通常是:按照END結(jié)束偽指令指定的地址裝入CS、IP。任何一個源程序都是以END偽指令來結(jié)束。格式:E

15、ND 起始地址 起始地址可以是一個標(biāo)號或表達(dá)式;END偽指令的作用是指示源程序到此結(jié)束和指定程序運行時的起始地址。3CS的裝入1.等值語句格式:符號 EQU表達(dá)式 其中EQU是等值偽指令,把表達(dá)式的值或符號賦給EQU左邊的符號,表達(dá)式可以是:常量表達(dá)式地址表達(dá)式變量、標(biāo)號或指令助記符4.5 其它常用偽指令4.5.1 符號定義語句 等值語句僅在匯編源程序時,作為替代符號用,不產(chǎn)生任何的目標(biāo)代碼,也不占有存儲單元。 在同一源程序中,同一符號在EQU語句未解除之前不能用EQU偽指令重新定義。 已經(jīng)用EQU定義的符號,若以后不再用了就可以用PURGE語句來解除。PURGE語句的格式如下:PURGE符號

16、1,符號2,符號n注意事項: 2、等號語句格式:符號=表達(dá)式 此語句的功能與EQU等值語句類似,其最大的特點是能對符號進行重定義。 4.5.2 程序開始和結(jié)束偽指令1.開始偽指令NAME的格式:NAME module_name匯編程序?qū)⒁越o出的module_name作為模塊的名字。如果程序中沒有NAME偽指令,則可使用TITLE偽指令,其格式:TITLE text2.程序結(jié)束偽指令表示源程序結(jié)束的偽指令的格式: END 起始標(biāo)號4.5.3 定位偽指令(ORG)和當(dāng)前位置計數(shù)器($)符號“$”代表當(dāng)前位置計數(shù)器的現(xiàn)行值。定位偽指令的ORG的格式:ORG 表達(dá)式它表示把表達(dá)式的值賦給當(dāng)前位置計數(shù)器

17、:ORG語句后的指令或數(shù)據(jù)以表達(dá)式給定的值作起始偏移量。 在程序設(shè)計中,通常把具有一定功能的程序段設(shè)計成一個子程序。過程定義偽指令格式如下:過程名 PROC (NEAR/FAR) RET過程名 ENDP4.5.4 過程定義偽指令 過程名不能省,且過程的開始PROC和結(jié)束ENDP應(yīng)使用同一個過程名;它就是過程調(diào)用指令CALL的目標(biāo)操作數(shù)。它類同于標(biāo)號的的作用,同樣具有三個屬性。當(dāng)沒有定義它的距離屬性,隱含為NEAR。任何一個過程,一定含有返回指令RET,它可以在過程中任何位置,不一定非要放在最后。若一個過程有多個出口,它可能有多個返回指令。但一個過程執(zhí)行的最后一條指令必定是RET。4.6 匯編語

18、言上機調(diào)試1.編輯 調(diào)用編輯程序EDIT.EXE,WS.EXE等,用鍵盤敲入源程序,退出編輯系統(tǒng)時,保存編輯完成的文件,且擴展名為.ASM。 2.匯編 匯編就是用宏匯編程序MASM.EXE把匯編語言源程序翻譯(匯編)成機器語言的目標(biāo)程序。宏匯編程序主要有以下功能:檢查源程序中語法錯誤,給出錯誤信息;展開宏指令;生目標(biāo)程序(.OBJ),列表文件(.LST)和交叉引用文件(.CRF)。 如果警告錯誤和嚴(yán)重錯誤總數(shù)都等于零,那么這次源程序的匯編獲得通過,可以進行連接。否則,返回編輯程序,修改源程序,然后再次進行匯編,直到源程序匯編正確無誤。 如果匯編時,無須產(chǎn)生列表文件和交叉引用文件,則在啟動宏匯編

19、程序時可用分號結(jié)尾,比如:C:MASM TEST; 如果需要后面的列表文件和交叉引用文件,且它們的文件名與源文件名相同,這時啟動宏匯編程序時,可用逗號指明,比如:C:MASM TEST,; 連接程序LINK除產(chǎn)生一個可執(zhí)行文件外,還可產(chǎn)生一個內(nèi)存映象文件(擴展名為.MAP)。LINK連接的一定是擴展名為.OBJ的目標(biāo)程序。在操作系統(tǒng)狀態(tài)下,直接啟動連接程序LINK.EXE。3.連接 源程序經(jīng)過匯編后產(chǎn)生的目標(biāo)程序,必須經(jīng)過連接程序LINK.EXE連接后才能運行。 其中MAP文件(MAP文件列出各段的起點,終點及長度。)是否建立,由操作人員確定。若要,則輸入一文件名,否則直接送一回車鍵。后一個是

20、詢問在連接時是否要用庫文件。對于來自宏匯編語言程序的目標(biāo)程序文件,通常是直接送一回車鍵。與啟動宏匯編程序一樣,可以在啟動連接程序時,用分號結(jié)束后續(xù)詢問。如:C:LINK TEST;若要產(chǎn)生MAP文件,且使用目標(biāo)程序文件名,可用一逗號表示。如:C:LINK TEST,; 若需要連接多模塊的目標(biāo)程序時,可用“+”把它們連接起來。例如連接三個目標(biāo)程序文件P1.OBJ、P2.OBJ、P3.OBJ,其操作如下:C:LINK P1+P2+P3; 這樣產(chǎn)生的一個可執(zhí)行文件是約定取用第一個目標(biāo)程序文件名,當(dāng)然操作人員也可重新用另外的文件名。4.調(diào)試運行在建立好可執(zhí)行文件后,就可以直接從DOS執(zhí)行程序,如下所示

21、:C:TEST.EXEC: 程序運行結(jié)束后返回DOS。如果用戶程序已直接把結(jié)果在終端上顯示出來,那么程序已經(jīng)運行結(jié)束,結(jié)果也已經(jīng)得到了。4.6.2 DEBUG主要命令 DEBUG是為匯編語言設(shè)計的一種高度工具,它通過單步、設(shè)置斷點等方式為匯編語言程序員提供了非常有效的調(diào)試手段。1.DEBUG程序的調(diào)用在DOS的提示符下,可鍵入命令:C:DEBUG D:PATHFILENAME.EXT PARM1 PARM2 其中,文件名是被調(diào)試文件的名字。如用戶鍵入文件,則DEBUG將指定的文件裝入存儲器中,用戶可對其進行調(diào)試。如果未鍵入文件名,則用戶可以用當(dāng)前存儲器的內(nèi)容工作,或者用DEBUG命令N和L把需

22、要的文件裝入存儲器后再進行調(diào)試。命令中的D指定指定驅(qū)動器PATH為路徑,PARM1和PARM2則為運行被調(diào)試文件時所需要的命令參數(shù)。2.DEBUG的主要命令(1)顯示存儲單元的命令D(DUMP),格式為:_Daddress或_Drange例如,D命令的使用情況如下:(2)修改存儲單元內(nèi)容的命令有兩種。輸入命令E(ENTER),有兩種格式如下:第一種格式可以用給定的內(nèi)容表來替代指定范圍的存儲單元內(nèi)容。命令格式為:-E address list例如,-E DS:100 F3XYZ8D第二種格式則是采用逐個單元相繼修改的方法。命令格式為:-E address(3)檢查和修改寄存器內(nèi)容的命令R(reg

23、ister),它有三種格式如下:顯示CPU內(nèi)所有寄存器內(nèi)容和標(biāo)志位狀態(tài),其格式為:-R顯示和修改某個寄存器內(nèi)容,其格式為:-R register name顯示和修改標(biāo)志位狀態(tài),命令格式為:-RF(4)運行命令G,其格式為:-G=address1address2address3 地址1指定了運行的起始地址,如不指定則從當(dāng)前的CS:IP開始運行。后面的地址均為斷點地址,當(dāng)指令執(zhí)行到斷點時,就停止執(zhí)行并顯示當(dāng)前所有寄存器及標(biāo)志位的內(nèi)容,和下一條將要執(zhí)行的指令。(5)跟蹤命令T(Trace),有兩種格式:逐條指令跟蹤-T=address從指定地址起執(zhí)行一條指令后停下來,顯示所有寄存器內(nèi)容及標(biāo)志位的值。如未指定地址則從當(dāng)前的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論