




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第2章章 匯編語言程序中的指令與偽指令匯編語言程序中的指令與偽指令 本本 章章 提提 要要 本章在第一章的基礎上,更深入詳細地說本章在第一章的基礎上,更深入詳細地說 明了明了8086/80888086/8088處理器的匯編語言中的指令和處理器的匯編語言中的指令和 偽指令的格式、成分和使用方法及注意要點。偽指令的格式、成分和使用方法及注意要點。 本章知識的是讀者學習和掌握其它處理器匯編本章知識的是讀者學習和掌握其它處理器匯編 語言的指令和偽指令的基礎,也是學習第三章語言的指令和偽指令的基礎,也是學習第三章 編程的基礎,非常重要。編程的基礎,非常重要。 2.1 匯編語言的語句格式、匯編語言的語句
2、格式、 運算符及表達式運算符及表達式 2.1.1 匯編語言語句格式匯編語言語句格式 組成:組成:名字名字 操作符操作符 操作數操作數 ;注釋;注釋 指令語句指令語句 LOP1:MOV BL ,SI ; 偽指令語句偽指令語句 A DW 5 名字,又稱為標識符。名字,又稱為標識符。 指令語句的名字稱為指令語句的名字稱為“標號標號”, 后面一般要跟后面一般要跟 冒號。表示該指令所存放內存單元的符號地址;冒號。表示該指令所存放內存單元的符號地址; 偽指令語句名字的成分較多,有:段名、變量偽指令語句名字的成分較多,有:段名、變量 名、符號、記錄、結構等,名、符號、記錄、結構等, 與標號不同,后面與標號不
3、同,后面 不跟冒號,跟空格符。不跟冒號,跟空格符。 (2)命名)命名 使用的字符有:字母使用的字符有:字母AZ,字母,字母az ;不區別大小寫。;不區別大小寫。 數字數字09;數字不能作為名字的第一個字符。;數字不能作為名字的第一個字符。 專用字符專用字符 ? _ $ * . 等。其中等。其中“.”只能作為名字只能作為名字 的第一個字符,的第一個字符,“?”不能單獨使用。不能單獨使用。 不能用匯編語言的指令助記符、偽指令名、寄存器名、及不能用匯編語言的指令助記符、偽指令名、寄存器名、及 其他符號名,其他符號名, 如如SEGMENT、START、SUM等等來命名。名字要好記易等等來命名。名字要好
4、記易 用。名字使用的字符長度不得超過用。名字使用的字符長度不得超過31個。個。 合法的名字項,如:合法的名字項,如:DATA1 STR $A1 A? .S2 _CODE OA_2 fah 非法的名字項,如:非法的名字項,如:3DATA,因數字打頭;,因數字打頭; S.TR ,因,因“.”不在名字的第一個字符;不在名字的第一個字符; $-A1 ,因含非法字符,因含非法字符“-”; ? ,因,因“?”不能單獨使不能單獨使 用;用; .S%2 ,因含非法字符,因含非法字符“%”; -CODE ,因含非法字符,因含非法字符“-”; 0A_2,因,因0不能打頭;不能打頭; MOV ,因,因MOV是指令助
5、記符;是指令助記符; (3 3)名字屬性)名字屬性 名字有名字有3 3種屬性:段屬性、偏移屬性及類型屬性。這些屬性可以種屬性:段屬性、偏移屬性及類型屬性。這些屬性可以 通過一些運算符重新指定或重新定義通過一些運算符重新指定或重新定義. . 1 1)段()段(SEGSEG)屬性。表示名字所在段的段起始地址。)屬性。表示名字所在段的段起始地址。 2 2)偏移)偏移(OFFSET)(OFFSET)屬性。表示名字在段內偏移地址,標號的偏屬性。表示名字在段內偏移地址,標號的偏 移地址存在移地址存在IPIP(指令地址指針)中;變量的偏移地址是(指令地址指針)中;變量的偏移地址是1616位或位或 3232位
6、無符號數,位數取決于段的長度。位無符號數,位數取決于段的長度。 3 3)類型)類型(TYPE)(TYPE)屬性。屬性。 標號的類型:標號的類型:反映標號轉移距離的屬性稱為標號的類型屬性,有反映標號轉移距離的屬性稱為標號的類型屬性,有 三種類型:該標號在本段內引用,距離在三種類型:該標號在本段內引用,距離在128128+127+127之間時稱之間時稱 短標號屬性,記為短標號屬性,記為SHORTSHORT,指令指針,指令指針IPIP長度為長度為1 1字節。若指明該字節。若指明該 指令是段內使用,指令指針指令是段內使用,指令指針IPIP長度為長度為2 2字節,距離在字節,距離在3276832768
7、+32767+32767之間時稱近標號屬性,記為之間時稱近標號屬性,記為NEARNEAR。而。而FARFAR指明該指令指明該指令 是段外使用,指令指針是段外使用,指令指針IPIP長度為長度為4 4字節,兩個高字節指明段地字節,兩個高字節指明段地 址,兩個低字節指明偏移地址。址,兩個低字節指明偏移地址。 變量的類型變量的類型主要定義該變量保留的字節數:主要定義該變量保留的字節數:DBDB,DWDW,DF(6DF(6個個 字字 節長度節長度) ),DD (DD (雙字,雙字,4 4個字節長度個字節長度) ),DQ(8DQ(8個字節長度個字節長度) ),DT(10DT(10 個字節長度個字節長度)
8、)等。對應的類型號等。對應的類型號1 1、2 2、4 4、6 6、8 8、1010。 2操作符操作符 操作符就是指令、偽指令或宏指令的助記操作符就是指令、偽指令或宏指令的助記 符。符。 對于指令,匯編程序把操作符翻譯成機器對于指令,匯編程序把操作符翻譯成機器 語言指令,說明要機器語言指令,說明要機器“作什么?作什么?”; 對于偽指令,匯編程序根據操作符的提對于偽指令,匯編程序根據操作符的提 示,完成數據定義、分配存儲區域、表達式賦示,完成數據定義、分配存儲區域、表達式賦 值、指令系統的選擇、地址計數器的設置與定值、指令系統的選擇、地址計數器的設置與定 位、指示源程序結束以及位、指示源程序結束以
9、及“宏定義宏定義”等等工作。等等工作。 不產生機器語言指令,僅指示匯編程序怎不產生機器語言指令,僅指示匯編程序怎 樣將源匯編程序翻譯成目標程序。樣將源匯編程序翻譯成目標程序。 對于宏指令,匯編程序根據操作符的提對于宏指令,匯編程序根據操作符的提 示,完成宏調用和宏展開。示,完成宏調用和宏展開。 3操作數操作數 操作數是操作符的操作對象,由一個或多個表 達式(詳見2.1.2操作數的表達式)組成,當 有兩個或兩個以上的操作數時,各操作數之間 用逗號隔開。 對于指令,操作數通常是操作數的地址表達式 (請讀者回憶“尋址方式”),如常數、寄存 器,存儲單元; 對于偽指令或宏指令,操作數通常是它們所要 求
10、的參數,要給出定義。 4注釋字段注釋字段 注釋字段是以“;”開頭的說明部分,可以用 英文或者中文書寫。注釋字段是語句的非執行 部分,用來說明本條指令(或本段程序)在程 序中的功能和作用。 2.1.2操作數及其表達式操作數及其表達式 1常量常量 (1) 數值常數數值常數 (2) 字符串常量字符串常量 (3) 符號常量符號常量 2表達式表達式 (1)(1)數值表達式數值表達式 X +1 ;表達式為變量名;表達式為變量名“X”的值加的值加1 19 MOD 7 ;19除除7的余數是的余數是5 AND AX ,075FH ;將(;將(AX)和)和075FH按位作按位作“與與”運運 算算 (2) “?“表
11、示預留的存儲空間表示預留的存儲空間。 (3) 地址表達式地址表達式的運算結果是內存的偏移地址。的運算結果是內存的偏移地址。 第一章講過的第一章講過的“尋址方式尋址方式”,都是簡單的地址表達式。如,都是簡單的地址表達式。如 地址表達式地址表達式 offset data ;表示取變量;表示取變量“data”的偏移量的偏移量 1)兩個地址相加、相乘、相除是無意義兩個地址相加、相乘、相除是無意義 2) 地址加地址加(減減)數字量的表達式是有意義的,數字量的表達式是有意義的, 3)兩個地址相減也是有意義的兩個地址相減也是有意義的 而指令而指令MOV AX,(ARRAY_END ARRAY)2 則表示把數
12、組長度則表示把數組長度(即字數即字數)存入寄存器存入寄存器AX中。中。 (4) 操作數字段可以使用復制定義符操作數字段可以使用復制定義符DUP。 2.1.3操作數表達式中的運算符操作數表達式中的運算符 1算術運算符算術運算符 有有+、/、MOD(求余)、(求余)、SHL(左移)、(左移)、SHR (右移)(右移)7種運算。種運算。 如:如:50H+23;50H + 23 = 50H + 17H = 67H 43H35 = 6735 = 2345 = 0929H 0DEH MOD 3 = 222 MOD 3 = 00H 2邏輯運算符邏輯運算符 有有AND(與)、(與)、OR(或)、(或)、XOR
13、(異或)和(異或)和NOT(非)(非) 例:例:NOT 0AH的作用就是將的作用就是將0AH按位取按位取“反反”。 = NOT 00001010B = 11110101B = 0F5H 而而23 AND 66 的作用就是將的作用就是將23 = 17H = 0000000000010111B和和66 = 42 H = 0000000001000010 B按位作邏輯按位作邏輯“與與”運算,結果運算,結果0000000000000010B = 0002H 又如又如0CDH XOR 85H的作用就是將的作用就是將0CDH = 11001101B 和和85H = 10000101 H按位作邏輯按位作邏輯
14、“異或異或”運算,結果運算,結果 01001000B = 48H 3關系運算符關系運算符 有有EQ(相等)、(相等)、NE(不相等)、(不相等)、LT(小于)、(小于)、GT(大(大 于)、于)、LE(小于或等于)、(小于或等于)、GE(大于或等于)(大于或等于)6種。其種。其 結果為邏輯值:結果為真,用結果為邏輯值:結果為真,用1的補碼的補碼0FFFFH表示;結表示;結 果為假,用果為假,用0表示;表示; 例如:例如:10 LE 0AH是正確的,運算的結果是是正確的,運算的結果是0FFFFH 4分析運算符分析運算符 分析運算符是對存儲器地址進行運算的,又稱數值回送運分析運算符是對存儲器地址進
15、行運算的,又稱數值回送運 算符。算符。5個:個:SEG(求段首址)、(求段首址)、OFFSET(求偏移量)、(求偏移量)、 TYPE(求變量類型)、(求變量類型)、LENGTH(求變量長度)和(求變量長度)和SIZE (求變量字節數)。(求變量字節數)。 LENGTH(求變量長度)求變量復制次數的分析運算符,(求變量長度)求變量復制次數的分析運算符, 取取DUP前面的數值,前面的數值, 例如:例如:DATA1 DD 30 DUP(0,3 DUP(1), 2),這里,這里 (LENGTH DATA1)= 30 , 而對于而對于 ARRAY2 DB 20,30 DUP(0),這里,這里 (LENG
16、TH ARRAY2 )= 1。 但但 ARRAY3 DB 20 DUP(0),20,這里(,這里(LENGTH ARRAY3 )=20。 SIZE (求變量字節數)(求變量字節數) ,有公式如下:,有公式如下: SIZE 某變量某變量 = (LENGTH 某變量某變量) (TYPE 某變量某變量) 例如(例如(SIZE DATA1)= 304 = 120 = 78H ,而(,而(SIZE ARRAY2)= 1,(,(SIZE ARRAY3)= 20 5綜合運算符綜合運算符 5.1 5.1 屬性定義操作符屬性定義操作符PTRPTR VARl DB 10H,20H,30H VAR2 DW 1234
17、H0A845H 則在指令中,運用則在指令中,運用PTR運算符使運算符使VARl由原來的字節變量由原來的字節變量 “臨時臨時”改變成字變量,使改變成字變量,使VAR2由原來的字變量字節變由原來的字變量字節變 量量“臨時臨時”變成字節變量。如下:變成字節變量。如下: MOV AX,WORD PTR VARl ;2010H傳送到傳送到 AX MOV BL,BYTE PTR VAR2 ; ;34H傳送到傳送到 BL 而指令:而指令:ADD 2SI,2 操作數的類型不明確,是錯誤指令,應改為:操作數的類型不明確,是錯誤指令,應改為: MOV BYTE PTR 2SI,2; 或或 MOV WORD PTR
18、 2SI,2;表示把立即數送入;表示把立即數送入EA = SI+2的字存儲單元中。的字存儲單元中。 (2) 類型指定運算符類型指定運算符 格式:格式:THIS 屬性或類型屬性或類型 功能:該運算符主要用來為相應的變量名或標功能:該運算符主要用來為相應的變量名或標 號指定類型屬性,用來指定下一個能分配的存號指定類型屬性,用來指定下一個能分配的存 儲單元的類型。被指定變量或標號的地址屬性儲單元的類型。被指定變量或標號的地址屬性 (段基址和偏移量段基址和偏移量)和下一條鄰接語句的變量或標和下一條鄰接語句的變量或標 號相同。號相同。 (3) 段屬性前綴段屬性前綴 格式:段寄存器格式:段寄存器(或或“段
19、名段名”,或,或“段組名段組名”): 地址表達式地址表達式 如如 MOV AX,ES:BX+SI (4) 短轉移運算符短轉移運算符SHORT 見見 轉移指令轉移指令 (5) 分離字節運算符分離字節運算符 例:例: HIGH 3C5FH = 3CH LOW 3C5FH = 5FH 6運算符優先級運算符優先級 同級運算,按照自左向右的順序進行。優先級如下:同級運算,按照自左向右的順序進行。優先級如下: (1) 圓括號中的項圓括號中的項,操作優先執行。多重圓括號由內向外操作優先執行。多重圓括號由內向外 逐層執行。逐層執行。 (2) 方括號中的項。方括號中的項。 (3) 結構變量結構變量(變量、字段變
20、量、字段)。 (4) LENGTH、SIZE、WIDTH和和MASK。 (5) 段屬性前綴:段屬性前綴: (6) PTR、OFFSET、SEG、 TYPE、THIS及段操作符。及段操作符。 (7) HIGH和和LOW。 (8) 乘法和除法:、乘法和除法:、MOD、SHL、SHR: (9) 加法和減法:加法和減法:+、一。、一。 (10) 關系操作:關系操作:EQ、NE、LT、LE、GT、GE。 (11) 邏輯操作:邏輯操作:NOT。 (12) 邏輯操作:邏輯操作:AND。 (13) 邏輯操作:邏輯操作:OR、XOR。(14) SHORT 2.2 匯編語言程序中的偽指令匯編語言程序中的偽指令 段
21、定義偽指令: 段名段名 SEGMENT 定位類型定位類型 組合類型組合類型 類別類別 如:如:DATA1 SEGMENT ;DATA1是段名。是段名。 又如:又如:CODE SEGMENT ;CODE是段名。是段名。 一般情況下,定位類型、組合類型、和類別三個屬性可以不一般情況下,定位類型、組合類型、和類別三個屬性可以不 用說明。但是,如果需要把一個程序與其它程序模塊相連接用說明。但是,如果需要把一個程序與其它程序模塊相連接 時,就要用到這些屬性。將在第七章作進一步地討論。時,就要用到這些屬性。將在第七章作進一步地討論。 2.2.2ASSUME偽指令偽指令 CODE1 SEGMENT ASSU
22、ME CS:CODE1, DS:DATA1, ES:DATA2 ASSUME DS:DATA3, ES:NOTHING;改變前面;改變前面 ASSUME語句所說明的對應關系,語句所說明的對應關系,DS對應于數據段對應于數據段DATA3, 而段寄存器而段寄存器ES不與任何段相對應。不與任何段相對應。 1CS的裝入的裝入 當源程序當源程序 CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA CODE ENDS END START 經過匯編、連接后,由經過匯編、連接后,由DOS系統將其裝入存儲器中,同時系統將其裝入存儲器中,同時 將程序要執行的第一條指令地址裝入
23、將程序要執行的第一條指令地址裝入CS、IP中,然后從這中,然后從這 條指令開始執行。條指令開始執行。 2DS和和ES的裝入的裝入 在程序中,必須使用在程序中,必須使用MOV指令才能將對應段的段地址指令才能將對應段的段地址 裝入寄存器裝入寄存器DS和和ES中。中。 例如:例如:MOV AX , DATA1 MOV DS , AX MOV ES , AX 3SS的裝入的裝入 堆棧段是一個特殊的段,一個完整的源程序一般最好定堆棧段是一個特殊的段,一個完整的源程序一般最好定 義堆棧段。除了要生成義堆棧段。除了要生成COM型執行文件的源程序外,型執行文件的源程序外, 如果在程序中不定義堆棧段,那么,操作
24、系統在裝入該如果在程序中不定義堆棧段,那么,操作系統在裝入該 執行程序時將自動為其指定一個執行程序時將自動為其指定一個64K字節的堆棧段。字節的堆棧段。 在程序沒有定義堆棧段的情況下,在由連接程序生在程序沒有定義堆棧段的情況下,在由連接程序生 成執行文件時,將會產生警告信息,但可以不理會,所成執行文件時,將會產生警告信息,但可以不理會,所 生成的執行文件是可以正常運行的。生成的執行文件是可以正常運行的。 warning xxxx: no stack segment (其中:其中:xxxx是錯是錯 誤號誤號) SS裝入段地址的方法有兩種:裝入段地址的方法有兩種: (1) 定義堆棧段時,定義堆棧段
25、時,SEGMENT語句中的組合類型選擇語句中的組合類型選擇 STACK。如:。如: STACK1 SEGMENT PARA STACK DW 40 DUP(0) ;40是堆棧的長度,可根據需要進行改變是堆棧的長度,可根據需要進行改變 TOP LABEL WORD ;說明棧頂別名,可省略此語句;說明棧頂別名,可省略此語句 STACKL ENDS 在源程序經過匯編、連接時,由在源程序經過匯編、連接時,由DOS系統自動將系統自動將STACKL段段 的段地址裝入的段地址裝入SS中,同時使中,同時使SP指向棧底指向棧底+2的存儲單元。的存儲單元。 (2)如果在程序中要調換堆棧段,則可用類似裝入)如果在程
26、序中要調換堆棧段,則可用類似裝入DS、ES 的方法,即的方法,即 用指令來實現用指令來實現SS、SP的裝入。的裝入。 例如:例如: CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START: MOV AX,STACK2 MOV SS,AX MOV SP,0FFSET TOS ;棧底;棧底+2的地址存入的地址存入 SP 應注意,應注意,SS、SP必須同時初始化。必須同時初始化。 2.2.3 數據定義偽指令數據定義偽指令 格式為:格式為: 變量名變量名 數據定義符數據定義符 操作數操作數 ,操作數,操作數 ;注釋;注釋 常用的數據類型定義符有:常用的數據類型定義符有:
27、 DB:字節變量定義符。:字節變量定義符。 DW:字變量定義符。:字變量定義符。 DD:雙字變量定義符。:雙字變量定義符。 DQ:四字變量定義符。:四字變量定義符。 DF:六字節變量定義符。:六字節變量定義符。 DT:十字節變量定義符。常用于表示壓縮的:十字節變量定義符。常用于表示壓縮的BCD碼。碼。 還有一些其他的數據類型定義符,見還有一些其他的數據類型定義符,見2.4.2 等值定義偽等值定義偽 指令指令EQU與屬性定義操作符與屬性定義操作符PTR的聯合使用以及的聯合使用以及2.4.3 等值定義偽指令等值定義偽指令EQU與類型指定運算符與類型指定運算符THIS的聯合使的聯合使 用。用。 2.
28、2.4 符號定義偽指令符號定義偽指令 1等值定義偽指令等值定義偽指令EQU 例如:例如: NUM EQU 100 ;給緩沖區的長度取一個符號名。;給緩沖區的長度取一個符號名。 BUFF_LEN EQU NUM + 5 ;BUFF_LEN的偏移地址為的偏移地址為105 BFD EQU DS:BP + 6; (3) 用符號名代表字符串用符號名代表字符串 例如:例如:GREETINGEQU“How are you!” MOVEEQUMOV ;給指令;給指令MOV取另一個符號名取另一個符號名MOVE COUNTER EQUCX ;給寄存器;給寄存器CX取一個叫取一個叫 ;“COUNTER(計數器)(計
29、數器)”的符號名的符號名 2等值定義偽指令等值定義偽指令EQU與屬性定義操作符與屬性定義操作符PTR的聯合使用的聯合使用 如下面語句已定義如下面語句已定義START屬性是屬性是NEAR(因為(因為START的后面接的后面接 冒號),冒號), START:MOV CX,100 重新將其標號命名為重新將其標號命名為FAR_START,使屬性變為,使屬性變為FAR。 FAR_START EQU FAR PTR START 又如對于變量:又如對于變量: ACS DW ? 這里定義了一個字的保留存儲單元,若要對這個字的這里定義了一個字的保留存儲單元,若要對這個字的 兩個字節分別使用,就必須對這個字的兩個
30、字節賦予兩個字節分別使用,就必須對這個字的兩個字節賦予 另一種類型的定義:另一種類型的定義: ACS0 EQU BYTE PTR ACS ACS1 EQU BYTE PTR (ACS+1) 3等值定義偽指令等值定義偽指令EQU與類型指定運算符與類型指定運算符THIS的聯合使用的聯合使用 (1) 用于變量用于變量 FIRST_BYTE EQU THIS BYTE;給后面的字存儲單元取;給后面的字存儲單元取 字節屬性符號名。字節屬性符號名。 WORD_TYPE DW 1122H 有了上述定義后,可編寫如下語句:有了上述定義后,可編寫如下語句: MOV AL,FIRST_BYTE ;FIRST_BY
31、TE作為字節變量,作為字節變量, 將將22H傳送給寄存器傳送給寄存器AL MOV BX,WORD_TYPE ;WORD_TYPE作為字變量,將作為字變量,將 1122H傳送給寄存器傳送給寄存器BX 又例如又例如: STACK SEGMENT DW 100 DUP(?) TOP EQU THIS WORD STACK END 變量變量TOP被定義為字類型,它的偏移量應為被定義為字類型,它的偏移量應為STACK段定義段定義100 個字后的下一個字的偏移量,它恰就是堆棧指針個字后的下一個字的偏移量,它恰就是堆棧指針SP的初值,因的初值,因 此經常用這種方法為此經常用這種方法為SP賦初值。賦初值。 (
32、2) 用于標號用于標號 START EQU THIS FAR ;賦予傳送指令;賦予傳送指令(MOV)有一個有一個FAR屬性的地址屬性的地址 START。 MOV CX,100 4等號語句偽指令等號語句偽指令 匯編語言提供了用等號來定義符號常數的方法,即匯編語言提供了用等號來定義符號常數的方法,即 可用符號名代表一個常數。其一般格式如下可用符號名代表一個常數。其一般格式如下: 符號名符號名 數值表達式數值表達式 ABC = 10 + 200 5;ABC的值為的值為1010 ABC1 = 5 ABC + 21;ABC1的值為的值為5071 COUNT = 1;COUNT的值為的值為1 COUNT
33、= 2COUNT + 1;COUNT的值為的值為3 2.2.5 用偽指令用偽指令LABEL定義變量和標號定義變量和標號 1定義變量定義變量 格式:變量名格式:變量名LABEL類型類型 例如:例如:BUF LABEL BYTE DB 21 它等價于它等價于BUF DB 21 2定義標號定義標號 對于屬性為對于屬性為NEAR 和和FAR標號均可以用這種定義。標號均可以用這種定義。 格式是格式是: 標號名標號名LABEL類型類型 例如:例如: NEXT LABEL 類型類型 LOOP NEXT 2.2.6 LABEL和和THIS作為雙類型數據定義符的使用作為雙類型數據定義符的使用 雙重定義變量名利用
34、隱含或顯式的雙重方式,可以對同一內存位置定義為 雙重變量。 例如:AB EQU THIS BYTE (或AB LABEL BYTE ) AW DW 50 DUP(0) AW定義為字變量,在AW前使用了THIS BYTE,定義了一個字節類型變 量,訪問同一內存位置,用AB按字節訪問,用AW則按字訪問。 可以歸納為如下格式: (變量名)EQU THIS (類型) 和 (變量名)LABEL (類型) (變量名)DB/DW/DD (變量名)DB/DW/DD PTR操作符、操作符、LABEL偽指令與偽指令與THIS操作符的區別。操作符的區別。 格式不同格式不同 PTR操作符的格式:操作符的格式: 用于指
35、令中,用于指令中, 類型類型 PTR PTR 表達式表達式 用于等值定義偽指令用于等值定義偽指令EQU中,中, 變量或標號的新名變量或標號的新名 EQU EQU 屬性或類型屬性或類型 PTR PTR 變量或標號的原名變量或標號的原名 雙類型數據定義符雙類型數據定義符THIS的格式的格式 EQU THIS EQU THIS 屬性或類型屬性或類型 雙類型數據定義符雙類型數據定義符LABEL格式。格式。 LABEL LABEL 屬性或類型屬性或類型 范圍不同范圍不同 PTR操作符既可用于操作符既可用于指令指令,又可用于等值定義偽指令,又可用于等值定義偽指令EQU。 雙類型數據定義符雙類型數據定義符T
36、HIS只用于等值定義偽指令只用于等值定義偽指令EQU中。中。 雙類型數據定義符雙類型數據定義符LABEL只作只作定義偽指令定義偽指令用。用。 時限不同時限不同 PTR操作符既可用于指令,又可用于偽指令操作符既可用于指令,又可用于偽指令EQU。 當當PTR操作符用于指令操作符用于指令中,中,只在該語句中有效只在該語句中有效. 當當PTR操作符用于等值定義偽指令操作符用于等值定義偽指令EQU,在整個程序中起作用在整個程序中起作用。 與與THIS用于等值定義偽指令用于等值定義偽指令EQU中,以及中,以及LABEL作定義偽作定義偽 指令用,指令用,都是在整個程序中起作用的都是在整個程序中起作用的。 2
37、.2.7 置匯編地址計數器偽指令置匯編地址計數器偽指令 地址計數器的值用地址計數器的值用“$”來表示,用戶可以通過來表示,用戶可以通過“$”直接引用直接引用 地址計數器的值。地址計數器的值。 例如:例如:COUNT EQU $VAR2 ; 給表達式給表達式$-VAR2起名字起名字COUNT,如果變量,如果變量VAR2開始的符號開始的符號 地址(偏移地址)為地址(偏移地址)為7,其數值一直延續到當前偏移地址,設,其數值一直延續到當前偏移地址,設 為為EA = 16,即,即$ = 16,則,則COUNT的值表示的值表示VAR2的長度,的長度,16 7 = 9,不占內存。,不占內存。 又例如:又例如
38、: VAR6 DW 1, 2 , $ + 4 ,3 , 4 , $ + 4; 這里這里VAR6數組中的兩個數組中的兩個$ + 4得到的結果是不同的,這是由得到的結果是不同的,這是由 于于$的值在不斷變化的緣故。的值在不斷變化的緣故。 如匯編時為如匯編時為VAR6分配的偏移地址值為分配的偏移地址值為0100H,則前面的,則前面的$ + 4的當前值是的當前值是 0108,因,因$保存的當前偏移地址保存的當前偏移地址EA = 0104,則,則 (VAR6 + 4)= (0104H)= 0108H ,(,(VAR6 + 5)= (0105H)= 010A H ,;后面的;后面的$+4的當前值是的當前值
39、是 010EH, 因因 $ 保存的當前偏移地址保存的當前偏移地址EA = 010AH,則(,則(VAR6+10)= (010AH)= 0E H ,(,(VAR6+11)=(010BH)= 010E H 。 2.2.8 地址定位偽操作地址定位偽操作 1偶對齊偽指令偶對齊偽指令EVEN 格式:格式:EVEN 功能:使下一個字節地址成為偶數。功能:使下一個字節地址成為偶數。 例如:例如: DATA SEGMENT A DB ABCDEFG ;7個字符占個字符占7個字節,下一個存儲單元是奇地址。個字節,下一個存儲單元是奇地址。 EVEN ;以下;以下100個個“字字”從偶地址開始。從偶地址開始。 AR
40、RAY DW 100 DUP(?) DATA ENDS 2對齊偽指令對齊偽指令ALIGN 格式:格式: ALIGN NUM 其中:其中:NUM必須是必須是2的冪,如:的冪,如:2、4、8和和16等。等。 功能:告訴匯編程序,本偽指令下面的內存變量必須從下一個能被功能:告訴匯編程序,本偽指令下面的內存變量必須從下一個能被NUM整整 除的地址開始分配。如果下一個地址正好能被除的地址開始分配。如果下一個地址正好能被NUM整除,那么,該偽指令整除,那么,該偽指令 不起作用;不起作用; 否則,匯編程序將空出若干個字節,直到下一個地址能被否則,匯編程序將空出若干個字節,直到下一個地址能被NUM整除為止。整
41、除為止。 試比較下面二組變量定義,它們的對齊效果一致嗎?試比較下面二組變量定義,它們的對齊效果一致嗎? B1 DB12H B1 DB12H EVEN ALIGN2 W1 DW4567H W1 DW4567H 從上面對比,我們不難看出:偽指令從上面對比,我們不難看出:偽指令ALIGN的說明功能要比偽指令的說明功能要比偽指令EVEN強。強。 3調整偏移量偽指令調整偏移量偽指令ORG 格式:格式:ORG 表達式表達式 功能:使下一個字節的地址成為表達式的值。該偽指令可用于數據功能:使下一個字節的地址成為表達式的值。該偽指令可用于數據 段、代碼段的任何位置。段、代碼段的任何位置。 例如:例如: DAT
42、A SEGMENT ORG 10H ;使下一個字節的偏移地址成為表達式的值:;使下一個字節的偏移地址成為表達式的值:10H。 VARL DW 4567H ;VARL的偏移地址為的偏移地址為10H。 ORG $ + 10H ;使下一個字節的偏移地址成為表達式的值:設;使下一個字節的偏移地址成為表達式的值:設 $ = 10H, $ + 10H = 0022H 。 VAR2 DW 1234H DATA ENDS CODE SEGMENT ORG 100H START: MOV AX,DATA ;此指令的偏移地址為;此指令的偏移地址為0100H。 CODE ENDS END START 再舉一例,假設
43、在給變量再舉一例,假設在給變量W1W1分配內存單元時,當前分配內存單元時,當前 偏移量計數器偏移量計數器$ $ 的值為的值為2 2: W1 DW $, $ ;變量;變量W1后面第一個后面第一個“$”代表數值代表數值2,第一個字分,第一個字分 配后,偏移量計數器配后,偏移量計數器$的值為的值為4,第二個字分配完后,第二個字分配完后, “$”就代表數值就代表數值6。 ORG $+3 ;從當前地址;從當前地址$ = 6開始空開始空3個字節。個字節。$+3的值為的值為9, 所以,偽指令所以,偽指令“ORG $+3”就表示下一個變量從偏就表示下一個變量從偏 移量為移量為9的單元地址開始分配。的單元地址開
44、始分配。 B1 DB 43H 注意:如果在指令中用到注意:如果在指令中用到“$”,它只代表該指令的,它只代表該指令的 首地址,而與首地址,而與“$”本身所在的字節無關。本身所在的字節無關。 比如指令:比如指令:JNZ $ + 6 ;表示指令由此跳轉到下面表示指令由此跳轉到下面 第第6條指令執行。條指令執行。 2.2.9 基數控制偽指令基數控制偽指令 格式:RADIX 基數值 RADIX 16 MOV BX,0FFH MOV AX,178DH 應當注意,在把基數定為十六進制后,十進 制數后面都應加字母D。在這種情況下,如果 某個十六進制數的末字符為D,則應在其后跟 字母H,以免與十進制數發生混淆
45、。 2.3 8086/8088處理器的匯編語言處理器的匯編語言 常用指令常用指令 2.3.1 數據傳送指令數據傳送指令 2.3.2 算術運算指令算術運算指令 2.3.3 邏輯運算指令邏輯運算指令 2.3.4 移位指令移位指令 2.3.5 串操作指令串操作指令 2.3.6 控制轉移指令控制轉移指令 2.3.7 循環指令循環指令 2.3.8 過程調用和返回指令過程調用和返回指令 2.3.9 中斷指令中斷指令 2.3.10 處理機控制指令處理機控制指令 2.3.1 數據傳送指令數據傳送指令 返回第3章 作用:它們在存貯器、寄存器和輸入輸出端口之間傳送數據。作用:它們在存貯器、寄存器和輸入輸出端口之間
46、傳送數據。 分類:數據傳送指令可以分為分類:數據傳送指令可以分為:傳送指令、交換指令、地址傳送指令、傳送指令、交換指令、地址傳送指令、 堆棧操作指令、標志傳送指令、查表指令、輸入輸出指令。堆棧操作指令、標志傳送指令、查表指令、輸入輸出指令。 1、傳送指令、傳送指令 格式格式: MOV DST,SRC(DST為目的操作數,為目的操作數,SRC為源操作數)為源操作數) 功能:該指令把一個字節或一個字從功能:該指令把一個字節或一個字從SRC送到送到DST。 例例3-17 MOV AH,AL ;通用寄存器之間傳送;通用寄存器之間傳送 MOV AL,3 ;立即數與通用寄存器之間傳送;立即數與通用寄存器之
47、間傳送 MOV AX,DI ;寄存器與存儲器之間傳送;寄存器與存儲器之間傳送(寄存器間接尋寄存器間接尋 址址) 說明:說明: 1)源操作數可以是立即數、寄存器、存儲單元或者是累加器。)源操作數可以是立即數、寄存器、存儲單元或者是累加器。 2)目的操作數可以是累加器、寄存器(除)目的操作數可以是累加器、寄存器(除CS 外)和存儲單元。外)和存儲單元。 3)禁止:立即數)禁止:立即數段段寄存器;存儲器寄存器;存儲器存儲器;存儲器;段段寄存器寄存器段段寄存寄存 器;器; 4)MOV指令不改變指令不改變SRC;不影響標志位。;不影響標志位。 2、交換指令、交換指令 格式格式: XCHG OPRD1,O
48、PRD2(OPRD為操作數)為操作數) 功能:該指令把功能:該指令把OPRD1的內容與的內容與OPRD2的內容交換。的內容交換。 例例3-18 XCHG SI+3,AL ;存儲器與寄存器之間交換數據;存儲器與寄存器之間交換數據 XCHG DI,BX ;寄存器之間交換數據;寄存器之間交換數據 說明:說明: OPRD1和和OPRD2可以是通用寄存器和存儲單元但不包括段寄存器,可以是通用寄存器和存儲單元但不包括段寄存器, 也不能同時為存儲單元,不能包含立即數。也不能同時為存儲單元,不能包含立即數。 OPERAND-操作數操作數 地址傳送指令又有地址傳送指令又有3條指令條指令 (1)LEA 裝入有效地
49、址指令裝入有效地址指令(Load effective address ) 格式:格式:LEA REG,OPRD(REG為寄存器,為寄存器,OPRD為操作數)為操作數) 功能:該指令把操作數功能:該指令把操作數OPRD的有效地址傳送到的有效地址傳送到REG寄存器中。寄存器中。 例例3-19 LEA AX,BX+3 ;將操作數的有效地址(即偏移地;將操作數的有效地址(即偏移地 址)送入寄存器址)送入寄存器AX LEA DX,BUFFER;BUFFER為變量名為變量名 說明:說明: 1)OPRD必須是一個存儲器操作數。必須是一個存儲器操作數。 2)REG必須是一個必須是一個16位通用寄存器。位通用寄
50、存器。 3、地址傳送指令、地址傳送指令-1 (2)LDS 傳送目標指針傳送目標指針,把指針內容裝入把指針內容裝入DS指令指令(Load DS with Pointer ) 格式:格式:LDS REG,OPRD(REG為寄存器,為寄存器,OPRD為操作數)為操作數) 功能:該指令把操作數功能:該指令把操作數OPRD中包含的中包含的32位地址指針段值部分(高位地址指針段值部分(高16位)位) 送到數據段寄存器送到數據段寄存器DS,把偏移部分(低,把偏移部分(低16位)送到通用寄存器位)送到通用寄存器REG。 例例3-20 LDS DI,BX LDS SI,FARPOINTER ;FARPOINTE
51、R是一個雙字變量是一個雙字變量 解:若已知解:若已知(DS)=4000H,(BX)=1234H,(41234H)=78H, (41235H)=56H,(,(41236H)=BCH, (41237H)=9AH, 則(則( DI )= 5678H, (DS)=9ABCH, 若已知(若已知(FAR POINTER)=76BF3498H, 則則 ( SI )= 3498H, (DS)=76BFH, 說明:說明: 1)REG表示除段寄存器之外的表示除段寄存器之外的16位通用寄存器。位通用寄存器。 2)OPRD表示雙字的各種尋址方式的存儲器操作數的首地址。表示雙字的各種尋址方式的存儲器操作數的首地址。 (
52、3)LES 傳送目標指針傳送目標指針,把指針內容裝入把指針內容裝入ES指令指令(Load ES with Pointer ) 格式:格式:LES REG,OPRD 功能:該指令把操作數功能:該指令把操作數OPRD中包含的中包含的32位地址指針的段值部分(高位地址指針的段值部分(高16位)位) 送到附加段寄存器送到附加段寄存器ES中,把偏移部分(低中,把偏移部分(低16位)送到通用寄存器位)送到通用寄存器REG中。中。 例例3-20 LES DI,BX LES SI,FARPOINTER ;FARPOINTER是一個雙字變量是一個雙字變量 解:若已知解:若已知(ES)=8000H,(BX)=12
53、34H,(81234H)=78H, (81235H)=56H,(,(81236H)=BCH, (81237H)=9AH, 則(則( DI )= 5678H, (ES)=9ABCH, 若已知(若已知(FAR POINTER)=76BF3498H, 則則 ( SI )= 3498H, (ES)=76BFH, 說明:說明: 1)REG表示除段寄存器之外的表示除段寄存器之外的16位通用寄存器。位通用寄存器。 2)OPRD表示雙字的各種尋址方式的存儲器操作數的首地址。表示雙字的各種尋址方式的存儲器操作數的首地址。 3、地址傳送指令、地址傳送指令-2 堆棧是只允許在一端進行數據插入和數據刪除操作的線性表,
54、它是一段堆棧是只允許在一端進行數據插入和數據刪除操作的線性表,它是一段 RAM,其中地址較大的為棧底,地址較小的為棧頂(進行數據插入和刪除操作,其中地址較大的為棧底,地址較小的為棧頂(進行數據插入和刪除操作 的一端)。堆棧的段值存放在段寄存器的一端)。堆棧的段值存放在段寄存器SS中,指針中,指針SP始終指向棧頂。棧的操作始終指向棧頂。棧的操作 遵循先進后出的原則。遵循先進后出的原則。 (1)PUSH 把字壓入堆棧指令把字壓入堆棧指令 格式:格式:PUSH SRC(SRC為源操作數)為源操作數) 功能:該指令把源操作數功能:該指令把源操作數SRC壓入堆棧,壓入堆棧,SP隨著壓棧而減小。隨著壓棧而
55、減小。 例例3-21 PUSH SI PUSH DS PUSH SI 說明:數據進入堆棧的時候遵守說明:數據進入堆棧的時候遵守”高高低低高高低低”原則,即高位數據放在高字節中,原則,即高位數據放在高字節中, 低位數據放在低字節中。低位數據放在低字節中。 (2)POP 把字彈出堆棧指令把字彈出堆棧指令 格式:格式:POP DST(DST為目的操作數)為目的操作數) 功能:該指令從堆棧彈出一個字數據到目的操作數功能:該指令從堆棧彈出一個字數據到目的操作數DST,SP隨著出棧而增大。隨著出棧而增大。 例例3-22 POP SI POP ES POP SI 說明:說明:DST可以是通用寄存器以及段寄存
56、器可以是通用寄存器以及段寄存器(除除CS外外),也可以是字存儲單元。也可以是字存儲單元。 4、堆棧操作指令、堆棧操作指令 8086/80888CPU中有專用于標志寄存器的指令。中有專用于標志寄存器的指令。 (1)LAHF標志位送標志位送AH指令指令 格式:格式:LAHF 功能:該指令把標志寄存器低功能:該指令把標志寄存器低8位位(SF、ZF、AF、PF、CF)傳送到傳送到 寄存器寄存器AH的指定位的指定位(即即7、6、4、2、0)。 (2)SAHF將將AH送入標志寄存器指令送入標志寄存器指令 格式:格式:SAHF 功能:該指令把寄存器功能:該指令把寄存器AH的指定位傳送到標志寄存器的低的指定位
57、傳送到標志寄存器的低8位位(即即 該指令為該指令為LAHF逆操作逆操作)。 (3)PUSHF標志寄存器進棧指令標志寄存器進棧指令 格式:格式:PUSHF 功能:該指令把標志寄存器的內容壓入堆棧。該指令不影響標志。功能:該指令把標志寄存器的內容壓入堆棧。該指令不影響標志。 (4)POPF標志寄存器出棧指令標志寄存器出棧指令 格式:格式:POPF 功能:該指令把當前堆棧的一個字傳給標志寄存器,同時功能:該指令把當前堆棧的一個字傳給標志寄存器,同時SP加加2, 該指令影響對應的標志位。該指令影響對應的標志位。 5、標志傳送指令、標志傳送指令 (1)IN I/O端口輸入指令端口輸入指令 格式:格式:I
58、N AL,端口地址或,端口地址或IN AX,端口地址,端口地址 功能:從功能:從8位端口讀入一個字節到位端口讀入一個字節到AL寄存器中,或從寄存器中,或從 16位端口讀入一個字到位端口讀入一個字到AX寄存器中。寄存器中。 (2)OUT I/O端口輸出指令端口輸出指令 格式:格式:OUT 端口地址,端口地址,AL 或或 OUT 端口地址,端口地址,AX 功能:將功能:將AL中的一個字節寫到一個中的一個字節寫到一個8位端口,或把位端口,或把 AX中的一個字寫到一個中的一個字寫到一個16位端口。位端口。 返回第3章 6、輸入輸出端口傳送指令、輸入輸出端口傳送指令 作用:完成對數值的加、減、乘、除等運
59、算。作用:完成對數值的加、減、乘、除等運算。 3.2.2 算術運算指令算術運算指令 1、加法運算指令、加法運算指令 (1)ADD加法指令加法指令 格式:格式:ADDDST,SRC(DST為目的操作數,為目的操作數,SRC為源操作數)為源操作數) 功能:將功能:將DST內容與內容與SRC內容相加,結果存入內容相加,結果存入DST當中,當中,SRC內容不變。內容不變。 例例3-23 執行如下指令:執行如下指令: MOV AX,1234H MOV BX,2211H ADD AX,BX 說明:說明: 1)當)當SRC是立即數或寄存器操作數時,是立即數或寄存器操作數時,DST可以是寄存器或存儲器操作數。
60、可以是寄存器或存儲器操作數。 2)當)當SRC是存儲器操作數時,是存儲器操作數時,DST只能是寄存器操作數。只能是寄存器操作數。 3)段寄存器操作數不能為)段寄存器操作數不能為SRC和和DST。 4)該指令會影響)該指令會影響OF,PF,SF,ZF ,AF標志位。標志位。 (2)ADC帶進位加法指令帶進位加法指令(add with carry) 格式:格式:ADC DST ,SRC(DST為目的操作數,為目的操作數,SRC為源操作數)為源操作數) 功能:將功能:將DST內容加上內容加上SRC內容再加上內容再加上CF進位標志,并將結果送進位標志,并將結果送DST中。中。 例例3-24 設(設(C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 路邊電纜施工方案
- 2025至2030年中國銅竹節軟管市場分析及競爭策略研究報告
- 2025至2030年中國米餅市場分析及競爭策略研究報告
- 城市大數據中心項目規劃設計方案
- 退休職業道德教育顧問合同
- 九年級化學家長溝通與反饋計劃
- 雇員車補離職協議
- 高中英語教學比賽課堂互動模式和特征研究
- BF-BT-BZT陶瓷的微觀結構演變、高溫壓電性能及熱穩定性研究
- 跨國婚姻資產保全與忠誠履行協議
- 托幼機構安全應急預案制度
- 92槍械課件教學課件
- DB35T 1980-2021 居家醫療護理服務規范
- 產業園區可持續發展實踐白皮書-盛裕集團-2024-88正式版WN8
- 高低溫截止閥關鍵技術
- 小超市食品安全管理制度
- 老年人支氣管哮喘診斷與管理中國專家共識2020
- 全過程工程咨詢管理服務方案投標方案(技術方案)
- 6.2反比例函數的圖象與性質(第一課時)教學設計2024-2025學年北師大版數學九年級上冊
- DL∕T 1938-2018 垃圾發電廠爐渣處理技術規范
- 無人機編隊技術的發展與應用
評論
0/150
提交評論