匯編與接口偽指令_第1頁
匯編與接口偽指令_第2頁
匯編與接口偽指令_第3頁
匯編與接口偽指令_第4頁
匯編與接口偽指令_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 第四章 偽指令本章學習要點: 首先要認識偽指令,了解偽指令的作用,初步掌握偽指令的使用方法。通過下一章的編程練習逐步熟練掌握偽指令在程序設計中的使用方法。本章主要學習內容有: 1、數據單元定義偽指令 2、段定義偽指令 3、過程定義偽指令 4、匯編語言程序格式 偽指令? 使用編輯程序編寫的原程序文件不能在機器上直接運行,必須將它“翻譯”成計算機能夠識別的二進制代碼,這個“翻譯”過程是由匯編程序(MASM)完成的。它提供了一些“規(guī)則”,我們要尊照這些“規(guī)則”去編寫原程序。 在原程序中除了指令語句以外還有偽指令語句,偽指令語句用來告訴匯編程序在匯編期間需要做的一些工作,如數據定義、分配存儲區(qū)、指示

2、程序結束等等,這些都是通過偽指令語句完成的。 偽指令與機器指令不同的地方在于偽指令本身不產生任何目標代碼,也不象機器指令那樣在機器運行期間由計算機來執(zhí)行,它僅在匯編期間起作用。程序 一、定義數據存儲單元偽指令 這類偽操作的語句格式為: 名字 偽指令 操作數 ;注釋 名字是一個任選項,用符號地址表示,其作用與指令語句前的標號相同,但在它的后面不使用冒號“:”。注釋字段也是可有可無的,它用來說明該偽操作的功能。操作數字段可以是常數,也可以是表達式。 下面舉例說明: 例4.1 操作數是常數 DA_BYTE DB 50H,50;50 32 DA_WORD DW 0A34H,4981H ;34 0A 8

3、1 49 變量名 偽指令 操作數 注釋項程序 例4 .2 操作數是表達式(根據該表達式可以求得一個常數) DA_B DB 3+2,2AH ;05 2A DA_W DW 2BH,6*2 ;2B 00 0C 00例4 .3 操作數為?號,表示可預置任何內容。 DA_B DB ?,? DA_W DW ?,?例4 .4 操作數為字符串 存儲格式(左邊為較低地址單元) STRING1 DB ABCD;41 42 43 44 STRING2 DW AB,CD;42 41 44 43 STRING3 DD AB,CD;42 41 00 00 44 43 00 00注意: STR_ERR1 DW ABCD;非

4、法操作 STR_ERR2 DD ABCD;非法操作 例45 帶DUP的操作數,DUP(Duplication)是定義重復數據操作符。 D_B1 DB 20H DUP(?) D_B2 DB 10H DUP(ABCD) D_W1 DW 5H DUP(4)例46 變量名的引用方法 DA1 DB 0FEH DA2 DW 52ACH TABDB10HDUP(?) MOV AL,DA1 MOV BX,DA2 MOV TABSI,AL 二、符號賦值偽指令 在編制源程序時,常把某些常數、表達式等用一特定符號來表示。這樣,為編寫程序帶來許多方便。為此,就要使用符號定義語句,這種語句有以下兩種。 1、賦值語句 格

5、式: 符號 EQU 表達式 功能:把表達式的值或符號賦給EQU左邊的符號。 表達式有以下三種: (1)常數或數值表達式,例如: COUNT EQU 5 NUM EQU 1354 (2)地址表達式,例如: ADR1 EQU BP+14 (3)變量、標號或指令助記符等,例如: CREG EQU CXCBD EQU DAAL1 EQU SUB_START 賦值語句僅在匯編源程序時,作為替代符號用,不產生目標代碼,也不占有存儲單元。 在同一源程序中,同一符號不能用EQU偽指令重新定義。 例如: NUM EQU 10H NUM EQU 20H ;因符號重新定義而出現語法錯誤 2、等號語句 語句格式: 符

6、號 = 表達式 該語句功能與賦值語句相同。但等號語句允許重新定義。例如: CONT 5 NUM l4H NUM NUM10H CBD DAA CBD ADD 三、段定義偽指令(SEGMENTENDS偽指令) 當程序中需要設置一個段時,就必須首先使用段定義偽指令。它的格式為: 段名SEGMENT 定位類型組合類型類別名 ;本段語句序列(程序或數據) 段名ENDS 例如: STACK1 SEGMENT PARA STACK STACK STACK1 ENDS 每一個段都是以SEGMENT偽指令開始,以ENDS偽指令結束。其中: 1、段名: 由用戶自己選定,通常使用與本段用途相關的名字。如第一數據段

7、DATA1,第二數據段 DATA2,堆棧段STACK,代碼段 CODE等。一個段開始與結尾用的段名應一致 。程序 2、定位類型: 這個定位類型表示對段的起始邊界要求。可有四種選擇:(1)PAGE(頁):表示本段從一個頁的邊界開始。一頁的長度為 256 個字節(jié),所以段起始地址(段基址)的最后八位二進制數一定為 0,即以 00H 結尾的地址。(2) PARA(節(jié)):如果定位類型用戶未選擇,則隱含為 PARA。它表示本段從一個節(jié)的邊界開始,一個節(jié)長度為 16 個字節(jié)。所以段的起始地址(即段基址)最后四位二進制數一定是 0,即以 0H 結尾的地址。 如: 09150H,0AB30H 等。(3) WOR

8、D(字):表示本段從一個偶字節(jié)地址開始。即段起始單元地址的最后一位二進制數一定是以 0,2,4,6,8,A,C,E結尾的地址。(4) BYTE(字節(jié)):表示本段起始單元可從任一地址開始。 3、組合類型: 組合類型指定段與段之間是怎樣連接和定位的,共有六種選擇: (1)NONE:這是隱含選擇。表示本段與其它段無連接關系。在裝入內存時本段有自己的物理段,因而有自己的段基址。 (2)PUBLIC:在滿足定位類型的前提下,本段與同名的段相鄰地連接在一起,形成一個新的邏輯段,公用一個段基址,所有偏移量調整為相對于新邏輯段的起始地址。 (3)COMMON:產生一個復蓋段。在兩個模塊連接時,把本段與其它用C

9、OMMON說明的同名段置成相同的起始地址,共享相同的存儲區(qū)。共享存儲區(qū)的長度由同名中最大的段確定。 (4) STACK:把所有同名的堆棧段連接在一起,形成一個連續(xù)段,且系統(tǒng)自動對 SS 段寄存器和堆棧指針 SP 初始化。建議在用戶程序中堆棧段要用組合類型 “STACK” 說明過,否則需要用戶程序自已初始化 SS 和 SP。 (5)AT表達式:表示本段可定位在表達式所指示的節(jié)邊界上。 如: AT 0930H, 那么本段的段地址為 0930H。 注意:不能用它指定代碼段。(6)MEMORY:表示本段在存儲器中應定位在所有其他段的最高地址。如有多個 MEMORY,則只把第一個遇到的段當作 MEMOR

10、Y 處理,其余的同名段均按 PUBLIC 說明處理。4、類別名 類別名必須用單引號()括起來。在連接時,LINK 程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內。類別名可以是任何字符串組成的名字。但是它不能再作程序中的標號、變量名或其它定義符號。 以上定位類型、組合類型和類別名三個參數項是任選的,可以只選其中一個或兩個參數項,但是不能交換它們之間的順序。各參數項之間用空格分隔。 四、段尋址偽指令 Assume Assume 偽指令用于指示匯編程序,已定義的段與段寄存器之間的對應關系。Assume 偽指令不產生任何目標代碼。 格式: ASSUME 段寄存器名:段名,段寄存器名:段名, 其中段寄存器

11、名是指四個段寄存器 CS,SS,DS,ES 中的一個,段名是指用 SEGMENTENDS 偽指令語句中定義的段名。段寄存器名與段名之間必須用冒號 “:”。例如: ASSUME CS:CODE,DS:DATA,SS:STACK 程序 五、過程定義偽指令(PROCENDP) 在程序設計中,我們常常把具有一定功能的程序段設計成一個子程序。MASM 宏匯編程序用“過程”(PROCEDUR)來構造子程序。過程定義偽指令格式如下: 過程名 PROC(NEAR FAR) RET 過程名 ENDP 其中,過程名不能省略,且過程的開始(PROC)和結束(ENDP)應使用同一個過程名,它是該子程序的程序名,也是過

12、程調用指令 CALL 的目標操作數。它類同一個標號的作用,也有段,偏移量和類型這三個屬性。過程的類型有 NEAR 和 FAR兩種屬性。在定義過程時,如沒有選擇類型,則隱含為 NEAR。程序 六、定位偽指令(ORG)和當前位置計數器($) 在匯編程序時,為了指示下一個數據或指令在相應段中的偏移量,匯編程序使用了一個當前位置計數器,用于記載匯編時的當前偏移量。符號“$”就是代表當前位置計數器的現行值。 格式為: ORG 表達式 其作用是把表達式的值賦位給當前位置計數器,即ORG語句后的指令或數據以表達式給定的值作起始偏移量。其中表達式的值是以 65536 為模的正數。例如: DATA SEGMEN

13、T ORG 30H BUF DW 12H,34H ;變量 BUF 在 段內的偏移量為 30 H COUT EQU ( $BUF)/2 ;利用偏移量求差得到數據的個數 DATA ENDS 4. 2 匯編語言程序格式 匯編語言源程序中的每個語句可以由四項組成,格式如下: 標識符 操作項 操作數項 ;注釋項 其中:標識符項是一個符號,是可選項。操作項是一個操作碼的助記符,它可以是指令、偽操作或宏指令名。操作數項可由一個或多個表達式組成,它提供執(zhí)行該操作所需要的數據信息。注釋項用來說明程序或語句的功能,注釋項必須以分號 “;” 開始。 例如: AA : ADD AX,BX ;加法運算 標識符 操作項

14、操作數項 注釋項 一、標識符 標識符可以是標號,也可以是變量名,它們都用來表示本語句的符號地址。 標識符的組成規(guī)則如下: 字符個數為:131個;第一個字符必須是字母、 ?、 或 _ ; 從第二個字符開始,可以是數字、字母、?、 或 _ ; 不能使用系統(tǒng)專用保留字,保留字主要有:寄存器名(如:AX,CS)指令助記符(如:MOV,ADD)偽指令(如: SEGMENT,DB)表達式中的運算符(如: GE,EQ)屬性操作符(如: PTR,FAR) 1、標號: 標號在代碼段中定義,后面跟冒號 “ : ” ,它可以是符號地址或過程名。標號常用作轉移指令或 CALL 指令的操作數,用以表示轉向地址。 標號有

15、三種屬性:段、偏移及類型。 段屬性:定義標號的段起始地址,此值必須在一個段寄存器中,而標號的段則總是在 CS 寄存器中。 偏移屬性:標號的偏移地址是16位元符號數,它代表從段起始地址到定義標號的位置之間的字節(jié)數。 類型屬性:用來指出該標號是在本段內引用還是在其它段中引用的。如在段內引用的,則稱為 NEAR,指針長度為 2 字節(jié);如在段外引用,則稱為 FAR,指針長度為4字節(jié)。 2、變量:變量在除代碼段以外的其它段中定義,后面不跟冒號。 如: VAR DW 12H,34H 變量多用于操作數字段,它有段、偏移量及類型三種屬性。 段屬性: 定義變量的段起始地址,此值必須放在一個段寄存器中。 偏移屬性

16、:變量的偏移地址是16位無符號數,它代表從段的起始 地址到定義變量的位置之間的字節(jié)數。 類型屬性:變量的類型屬性定義該變量所保留的字節(jié)數。 如:BYTE、WORD、 DWORD 注意:在程序中同樣的標號或變量的定義只允許出現一次,否則匯編程序會指示出錯。 二、操作項 操作項可以是指令、偽操作或宏指令的助記符。對于指令,匯編程序將其翻譯為機器語言。對于偽操作,匯編程序將根據偽指令要求的功能進行處理。三、操作數項 操作數項由一個或多個表達式組成,多個操作數項之間一般用逗號分開。對于指令,操作做項一般給出操作數地址,操作數可能有一個、二個或一個也沒有。對于偽操作則給出它們所要求的參數。 操作數項可以

17、是常數、寄存器、標號、變量或由表達式組成。表達式是由常數、標號、變量與一些操作符的組合,有數字表達式和地址表達式兩種。在匯編期間,匯編程序按照一定的優(yōu)先規(guī)則對表達式進行計算后可得到一個數值或一個地址。下面我們介紹一些常用的操作符。 1、算術操作符 算術操作符有(正)、 (負)、 、 、* 、/ 、MOD、SHR、SHL等。其中 MOD 是指除法運算后得到的余數。如 197 的商是 2,余數為 5,因此 19 MOD 7 的值是 5(余數)。 例:數組 ARRAY 定義如下,寫出把數組長度(字數)存入 CX 寄存器的指令。 ARRAY DW 1,2,3,4,5,6,7 COUN DW ? MOV

18、 CX,(COUN ARRAY)/ 2經匯編程序匯編后的 MOV 指令變?yōu)椋?MOV CX,7 2、邏輯操作符 邏輯操作符有 AND、OR、XOR 和 NOT 四種,邏輯操作符是按位進行操作的。 例如: MOV DX,55H AND 0FEH 匯編后: MOV DX,54H 該指令在匯編時由匯編程序對指令中的表達式進行“與”運算得到一個常數,而在程序運行時,該指令的操作則是把表達式的計算結果保存到 DX 寄存器中。 3、關系操作符 它有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)六種。 關系操作符的兩個操作數必須都是數字或是同一段內的兩個存儲器

19、地址。計算的結果應為邏輯值:結果為真,用 0FFFFH 表示;結果為假,用 0 表示。例如: MOV BX,(PORT_VAL LT 5)AND 20)OR(PORT_VAL GE 5)AND 30) 當 PORT_VAL5 時,匯編結果為: MOV BX,20 當 PORT_VAL 5 時,匯編結果為: MOV BX,30 4、 數值回送操作符 它有 TYPE、LENGTH、SIZE、OFFSET、SEG 5 種。這些操作符把一些特征或存儲器地址的一部分作為數值目送。下面分別說明各個操作符的功能。 (1)TYPE 格式為: TYPE 變量/標號 如果是變量,則匯編程序將回送該變量用字節(jié)數表示

20、的類型:DB為1,DW為2,DD為4,DQ為 8, DT為 10。 如果是標號,則匯編程序將回送代表該標號類型的數值: NEAR為1, FAR 為2。 例如: ARRAY DW 1,2,3 ADD SI,TYPE ARRAY ;注意:編程技巧 匯編后的加法指令為:ADD SI,2 (2)LENGTH 格式為: LENGTH 變量 在變量中使用 DUP 時,匯編程序回送分配給該變量的單元數。而對于其它情況則回送1。 例如: DA_1 DW 100 DUP(0) MOV CX,LENGTH DA_1 匯編后的 MOV 指令為: MOV CX,100 又如: ARRAY DW 1,2,3 MOV C

21、X,LENGTH ARRAY 匯編后的 MOV 指令為:MOV CX,1 (3)SIZE 格式為: SIZE 變量 匯編程序回送用 DUP 偽指令分配給該變量的字節(jié)數。此值是 LENGTH 值和 TYPE 值的乘積。 例: DA_1 DW 10 DUP(0) MOV CX,SIZE DA_1 匯編后的 MOV 指令為: MOV CX,20 (類型為2,長度為10) 例: ARRAY DW 1,2,3 MOV CX,SIZE ARRAY 匯編后的 MOV 指令為:MOV CX,2 (類型為2,長度為1) (4)OFFSET 格式為: OFFSET 變量/標號 功能: 匯編程序將回送變量或標號的偏

22、移地址值。 例如: MOV BX,OFFSET BUF ; BUF是變量名 MOV BX,OFFSET SUB_P ; SUB_P 是子程序名 等價于: LEA BX, BUF LEA BX,SUB_P (5)SEG 格式為: SEG 變量/標號 功能: 匯編程序回送變量或標號的段地址值。 例如:如果 DATA_SEG 是從存儲器的 05000H(物理)地址開始的一個數據段的段名,BUF 是該段中的一個變量名,則: MOV BX,SEG BUF 匯編后為: MOV BX,500H;500H 是段地址 又如: MOV BX,SEG SUB_P 是將子程序的段地址送BX。 5、屬性操作符 它有 P

23、TR、段操作符、SHORT、THIS、HIGH 和 LOW 6種。 (1)PTR 格式為: 類型 PTR 地址表達式 PTR用來建立一個符號地址,但它本身并不分配存儲器,只是用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型。格式中的類型字段表示所賦予的新的類型屬性,而表達式字段則是被取代類型的符號地址。 例如: BUF DW 1234H,5678H LEA SI,BUF MOV AL,BYTE PTRSI類型可有 BYTE、WORD、DWORD、NEAR 和 FAR 幾種。 (2)段操作符 段操作符用來表示一個標量、變量或地址表達式的段屬性。 例如,MOV AX,ES:BX+SI

24、(3)SHORT 用來修飾JMP指令中轉向地址的屬性,指出轉向地址是在下一條指令地址的 127 個字節(jié)范圍之內。 例如: JMP SHORT TA TA:MOV AX,2 (4)THIS 格式為: THIS 類型/屬性 它可以象 PTR 一樣建立一個指定類型( BYTE、WORD 或 DWORD)的操作數或指定距離(NEAR 或 FAR)的地址操作數。該操作數的段地址和偏移地址與下一個存儲單元地址相同。例如: FIRST_TYPE EQU THIS BYTE WORD_TABLE DW 100 DUP(?) 此時 FIRST_BYTE 的偏移地址值和 WORD_TABLE 完全相同,但它是字節(jié)

25、類型的,而 WORD_ TABLE 則是字類型的。 (5)HIGH 和 LOW 稱為字節(jié)分離操作符,它接收一個數或地址表達式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。例如: CONST EQU 1234H MOV AH,HIGH CONST 匯編程序將把 MOV 指令匯編成: MOV AH,12H 操作符的優(yōu)先級別從高到低排列如下:1()、 、 中的項,然后是 LENGTH、SIZE、WIDTH、 MASK2 (結構變量后面的運算符)。3 PTR,OFFSET,SEG,TYPE,THIS 及段操作符4 HIGH 和 LOW5 乘法和除法:, MOD, SHL, SHR6 加法和減法:,7 關系操作: EQ, NE, LT, LE, GT, GE8 邏輯:NOT9 邏輯:AND10邏輯:OR,XOR11SHORT 四、 注釋項 注釋項用來說明一段程序或一條或幾條指令的功能,它是可有可無的。但是,對于匯編語言程序來說,注釋項的作用是很明顯的,它可以使程序易于被讀懂,因此編制匯編語言程序必須寫好

溫馨提示

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

最新文檔

評論

0/150

提交評論