微機原理(匯編語言)_第1頁
微機原理(匯編語言)_第2頁
微機原理(匯編語言)_第3頁
微機原理(匯編語言)_第4頁
微機原理(匯編語言)_第5頁
已閱讀5頁,還剩56頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、1第三章第三章 匯編語言程序設計匯編語言程序設計 匯編語言是一種將機器碼指令符號化了的編匯編語言是一種將機器碼指令符號化了的編程語言,介于機器語言和高級語言之間。除了程語言,介于機器語言和高級語言之間。除了匯編語言指令語句匯編語言指令語句外,匯編語言還有豐富的外,匯編語言還有豐富的偽偽指令語句等內容指令語句等內容。本章包括以下主要內容:。本章包括以下主要內容:3.1 3.1 匯編語言程序結構匯編語言程序結構3.2 3.2 偽指令偽指令3.3 3.3 語句格式語句格式3.4 3.4 程序設計舉例程序設計舉例23.1 3.1 匯編語言程序結構匯編語言程序結構 由于由于80X86/Pentium80

2、X86/Pentium系列微處理器均采用存儲器系列微處理器均采用存儲器段頁式管理,其匯編語言都是以邏輯段為基礎,按段頁式管理,其匯編語言都是以邏輯段為基礎,按段的概念來組織代碼和數據的。因此,源程序結構段的概念來組織代碼和數據的。因此,源程序結構和邏輯段的定義方法密切相關。和邏輯段的定義方法密切相關。 下面給出一個標準的、以下面給出一個標準的、以宏匯編宏匯編MASMMASM為基礎的、為基礎的、用用完整段完整段定義的匯編語言源程序的結構形式:定義的匯編語言源程序的結構形式:第三章第三章程序結構程序結構_1_13DATA SEGMENT USE16/USE32 DATA SEGMENT USE16

3、/USE32 ;定義數據段定義數據段 ;數據定義偽指令序列數據定義偽指令序列DATA ENDSDATA ENDSSTACK SEGMENT USE16/USE32 STACK STACK SEGMENT USE16/USE32 STACK ;定義堆棧段定義堆棧段 ;數據定義偽指令序列數據定義偽指令序列STACK ENDSSTACK ENDSCODE SEGMENT USE16/USE32 CODE SEGMENT USE16/USE32 ;定義代碼段定義代碼段 ASSUME CS:CODE,ASSUME CS:CODE,SS:STACKSS:STACK, ,DS:DATADS:DATA, ,E

4、S:DATDES:DATD; ;段寄存器說明段寄存器說明STARTSTART:MOV AXMOV AX,DATA DATA ;取數據段基值取數據段基值 MOV DSMOV DS,AX AX ;建立數據段的可尋址性建立數據段的可尋址性 MOV ESMOV ES,AX AX ;建立附加數據段的可尋址性建立附加數據段的可尋址性 ;核心程序段:指令序列核心程序段:指令序列 MOV AHMOV AH,4CH 4CH ;返回返回DOSDOS操作系統操作系統 INT 21HINT 21HCODE ENDSCODE ENDS END START END START4 4、一個源程序通常具有代碼段、堆棧段、數據

5、段和、一個源程序通常具有代碼段、堆棧段、數據段和附加數據段。四種邏輯段分別允許定義幾個,但現行附加數據段。四種邏輯段分別允許定義幾個,但現行段有限制:段有限制:80868086允許四種段各一個;允許四種段各一個;PentiumPentium允許代允許代碼段、堆棧段各一個和四個數據段。每個程序至少有碼段、堆棧段各一個和四個數據段。每個程序至少有一個代碼段,其它段可根據需要設置。一個代碼段,其它段可根據需要設置。5 5、完整段定義時,代碼段的首條語句是段寄存器、完整段定義時,代碼段的首條語句是段寄存器說明語句說明語句ASSUMEASSUME,用于建立各個段寄存器與邏輯,用于建立各個段寄存器與邏輯段

6、的關系。段的關系。DSDS、ESES等要在代碼段起始處賦初值,等要在代碼段起始處賦初值,建立對邏輯段的可尋址性。建立對邏輯段的可尋址性。3 3、各邏輯段由語句序列組成,包括:、各邏輯段由語句序列組成,包括:指令語句,指令語句,偽指令語句,偽指令語句,宏指令宏指令語句,語句,注釋語句,注釋語句,空行語句。空行語句。2 2、源程序以、源程序以ENDEND偽指令結束。源程序偽指令結束。源程序為主模塊時,為主模塊時,ENDEND偽指令后要跟啟動偽指令后要跟啟動標號標號( (如:如:STARTSTART、BEGINBEGIN等等) )。第三章第三章程序結構程序結構_2_26 6、每個源程序的代碼段中必須

7、、每個源程序的代碼段中必須有返回到有返回到DOSDOS的指令語句。的指令語句。1 1、程序由若干邏輯段組成,、程序由若干邏輯段組成, 各邏輯段均由偽指令語句各邏輯段均由偽指令語句 SEGMENT/ENDSSEGMENT/ENDS定義和說明。定義和說明。4 采用采用DOS 4CHDOS 4CH號功能調用號功能調用 MOV AHMOV AH,4CH 4CH ;送功能號送功能號 INT 21H INT 21H ;中斷調用中斷調用 這是最有效且兼容性最這是最有效且兼容性最好的方法,通常設置在程好的方法,通常設置在程序的出口處。序的出口處。 “ “標準序標準序”方法方法 將主過程定義為遠過程:將主過程定

8、義為遠過程:CODE SEGMENTCODE SEGMENT ASSUME ASSUME主過程名主過程名 PROC FARPROC FAR PUSH DSPUSH DS MOV AX MOV AX,0 0 PUSH AX PUSH AX RET RET主過程名主過程名 ENDPENDP END END 主過程名主過程名 第三章第三章程序結構程序結構_3_3返回返回DOSDOS操作系統操作系統的方法:的方法:5 利用利用20H20H號軟中斷調用號軟中斷調用 調用方式是在代碼段結束前加調用語句:調用方式是在代碼段結束前加調用語句: INT 20HINT 20H 利用利用DOSDOS的的0 0號功能

9、調用號功能調用 調用方式是在代碼段結束前加調用語句:調用方式是在代碼段結束前加調用語句: MOV AHMOV AH,0 0 INT 21H INT 21H 后兩種方法不能用于擴展名為后兩種方法不能用于擴展名為.EXE.EXE的可執行的可執行文件,只適用于擴展名為文件,只適用于擴展名為.COM.COM(小模式)的可(小模式)的可執行文件。執行文件。第三章第三章程序結構程序結構_4_463.2 3.2 偽指令偽指令 80X86/Pentium80X86/Pentium宏匯編提供了豐富的偽指令。宏匯編提供了豐富的偽指令。 偽指令沒有對應的機器代碼,只在匯編程序對偽指令沒有對應的機器代碼,只在匯編程序

10、對源程序匯編期間由匯編程序處理的指令。源程序匯編期間由匯編程序處理的指令。 本節主要討論如下常用的偽指令:本節主要討論如下常用的偽指令: 1 1、邏輯段定義偽指令、邏輯段定義偽指令 2 2、符號定義偽指令、符號定義偽指令 3 3、數據定義偽指令、數據定義偽指令 4 4、標號定義偽指令、標號定義偽指令 5 5、過程和宏定義偽指令、過程和宏定義偽指令第三章第三章偽指令偽指令內容提要內容提要7 段定義語句段定義語句(SEGMENT/ENDS)(SEGMENT/ENDS)段名段名 SEGMENT SEGMENT 定位類型定位類型,組合類型組合類型,字長選擇字長選擇,類類別別 ( (段體段體) )段名段

11、名 ENDSENDS功能:功能:指出段名及段的各種屬性,以及段的開始和結束地址。指出段名及段的各種屬性,以及段的開始和結束地址。 段名段名是用戶定義的標識符,指明段的基址。是用戶定義的標識符,指明段的基址。 段體段體由指令、偽指令和宏指令語句組成。由指令、偽指令和宏指令語句組成。1 1、邏輯段定義偽指令、邏輯段定義偽指令 段定義偽指令段定義偽指令可控制匯編程序可控制匯編程序(MASM)(MASM)和連接程序和連接程序(LINK)(LINK)在內存中組織代碼和數據的方式。在內存中組織代碼和數據的方式。 主要包括主要包括段定義語句段定義語句和和段寄存器說明語句段寄存器說明語句。第三章第三章偽指令偽

12、指令邏輯段定義邏輯段定義_1_18第三章第三章偽指令偽指令邏輯段定義邏輯段定義_2_2 SEGMENT SEGMENT后面有四種可選擇的屬性,為源程序的匯編后面有四種可選擇的屬性,為源程序的匯編和連接提供必要的信息。主要用于模塊程序設計中和連接提供必要的信息。主要用于模塊程序設計中不同不同模塊的同名段模塊的同名段的連接。對于單模塊程序無此必要。的連接。對于單模塊程序無此必要。 組合類型組合類型 告知告知LINKLINK程序本段與其它模塊中同名段的組合連接程序本段與其它模塊中同名段的組合連接關系。關系。若缺省,該段為獨立段若缺省,該段為獨立段。有如下。有如下5 5種組合類型:種組合類型: PUB

13、LIC/STACK/COMMON/MEMORY/ATPUBLIC/STACK/COMMON/MEMORY/AT表達式。表達式。其中:其中:當選用當選用STACKSTACK時,連接時時,連接時LINKLINK程序將自動給程序將自動給SSSS和和SPSP賦初賦初值,否則,在代碼段中需給值,否則,在代碼段中需給SSSS和和SPSP賦初值。賦初值。 定位類型定位類型 用于指定該段地址的起點邊界類型,五種類型為:用于指定該段地址的起點邊界類型,五種類型為: BYTE(BYTE(字節字節)/WORD()/WORD(字字)/DWORD()/DWORD(雙字雙字)/PARA()/PARA(節節=16B) =1

14、6B) /PAGE(/PAGE(頁頁=256B)=256B)。9 字長選擇字長選擇 用于定義段中使用的用于定義段中使用的偏移地址和寄存器偏移地址和寄存器的字長,的字長, 只適用于含有只適用于含有.386.386、.486.486、.586.586語句的段:語句的段: ( (注意:注意:.x86.x86為方式選擇偽指令,告知匯編程序可為方式選擇偽指令,告知匯編程序可 接受的指令集,默認方式為接受的指令集,默認方式為80868086,接受,接受80868086指令指令) ) USE16USE16字長為字長為1616位,位,1616位尋址,段長度為位尋址,段長度為64KB64KB; USE32USE

15、32字長為字長為3232位,位,3232位尋址,段長度為位尋址,段長度為4GB4GB。 缺省且使用缺省且使用.386.386.586.586偽指令時,默認為偽指令時,默認為USE32USE32。第三章第三章偽指令偽指令邏輯段定義邏輯段定義_3_3 類別類別 連接時用于控制段的歸類存放次序,如:連接時用于控制段的歸類存放次序,如:stackstack。 注意與注意與組合類型組合類型STACKSTACK的區別的區別( (單引號單引號) )。10 段寄存器說明語句段寄存器說明語句 ASSUMEASSUME格式:格式:ASSUME ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器:段名,段寄存器

16、:段名,功能:說明源程序中定義的段由哪個段寄存器尋址。功能:說明源程序中定義的段由哪個段寄存器尋址。第三章第三章偽指令偽指令邏輯段定義邏輯段定義_4_4設置段寄存器初值的兩種常用方法如下:設置段寄存器初值的兩種常用方法如下:、 MOV AXMOV AX,DATA DATA 、 MOV AXMOV AX,SEG DATA SEG DATA MOV DS MOV DS,AX MOV DSAX MOV DS,AXAX本語句是說明性語句本語句是說明性語句,除主程序的代碼段及用,除主程序的代碼段及用STACKSTACK 說明過的堆棧段外,各段初值由用戶在程序中設置。說明過的堆棧段外,各段初值由用戶在程序

17、中設置。段名段名必須是由必須是由SEGMENTSEGMENT定義過的段的名稱,定義過的段的名稱,CSCS對應的對應的 段名必須在該語句之前定義。段名必須在該語句之前定義。段寄存器段寄存器必須是必須是CSCS、SSSS、DSDS、ESES、FSFS、GSGS,CSCS只能只能 用于代碼段,用于代碼段,SSSS只能用于堆棧段。只能用于堆棧段。該語句該語句設在源程序代碼段中,緊跟段定義語句之后。設在源程序代碼段中,緊跟段定義語句之后。11舉例:舉例:DATA SEGMENT DATA SEGMENT ;定義數據段定義數據段 SUM DW 1234H SUM DW 1234H ;數據定義偽指令數據定義

18、偽指令DATA ENDSDATA ENDSSTACK SEGMENT STACK SEGMENT ;定義堆棧段定義堆棧段 SPN DB 200 DUP(?) SPN DB 200 DUP(?) ;堆棧長度為堆棧長度為200200個字節個字節STACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ;定義代碼段定義代碼段 ASSUME CS:CODEASSUME CS:CODE,SS:STACKSS:STACK,DS:DATA DS:DATA STARTSTART:MOV AXMOV AX,STACK STACK ;取堆棧段基值取堆棧段基值 MOV SSMOV S

19、S,AX AX ;建立堆棧段的可尋址性建立堆棧段的可尋址性 MOV SPMOV SP,SIZE SPN SIZE SPN ;置棧頂指針置棧頂指針( (空棧空棧) ) MOV AX MOV AX,DATADATA ;取數據段基值取數據段基值 MOV DSMOV DS,AXAX ;建立數據段的可尋址性建立數據段的可尋址性第三章第三章偽指令偽指令邏輯段定義邏輯段定義_5_5122 2、符號定義偽指令、符號定義偽指令 這類指令這類指令可為常數或表達式等指定一個符號名可為常數或表達式等指定一個符號名,以,以 利于程序的調試與修改。一旦命名后,程序中就可把利于程序的調試與修改。一旦命名后,程序中就可把 符

20、號名像立即數一樣使用。符號名像立即數一樣使用。第三章第三章偽指令偽指令符號定義符號定義 等號偽指令等號偽指令格式:格式:符號名符號名 = = 表達式表達式說明:該語句功能與說明:該語句功能與EQUEQU相同,相同, 只是它可以重新定義。只是它可以重新定義。例如:例如: PORT1 = 30HPORT1 = 30H PORT1 = PORT1+20H PORT1 = PORT1+20H PORT1 = 64 PORT1 = 648 8 若以上三條語句作為語句序若以上三條語句作為語句序列,其結果應該是多少?列,其結果應該是多少? 賦值偽指令賦值偽指令格式:格式:符號名符號名 EQUEQU 表達式表

21、達式功能:用符號名代替表達式的值。功能:用符號名代替表達式的值。說明:說明:EQUEQU語句不能重新定義,語句不能重新定義, 必須先定義,后使用。必須先定義,后使用。例如:例如:X EQU 50X EQU 50 Y EQU X+10 Y EQU X+10 COUNT EQU CX COUNT EQU CX133 3、數據定義偽指令:、數據定義偽指令:格式:格式: 符號名符號名 DB/DW/DD/DF/DQ/DTDB/DW/DD/DF/DQ/DT 數據項序列數據項序列功能:功能:為數據項分配為數據項分配一個或多個一個或多個字節字節/ /字字/ /雙字雙字/ /長字長字 / /四字四字/ /十字節

22、的存儲空間,可以賦初值,也可十字節的存儲空間,可以賦初值,也可 以用一個符號名與之聯系。以用一個符號名與之聯系。第三章第三章偽指令偽指令數據定義數據定義_1_1說明:說明: 本偽指令按數據長度可分為六種類型本偽指令按數據長度可分為六種類型:DB(8:DB(8位位), ), DW(16 DW(16位位),DD(32),DD(32位位),DF(48),DF(48位位),DQ(64),DQ(64位位),DT(80),DT(80位位) ) 與數據項相聯系的符號名稱為變量名。經過定義的與數據項相聯系的符號名稱為變量名。經過定義的 變量具有變量具有三個屬性三個屬性( (數據類型、段基址、偏移量數據類型、段

23、基址、偏移量) ), 都有對應的運算符獲取其屬性值;都有對應的運算符獲取其屬性值;14第三章第三章偽指令偽指令數據定義數據定義_2_2舉例:舉例:VAR1 DB ? VAR1 DB ? ;分配一字節,不賦初值;分配一字節,不賦初值NUM DT 123H NUM DT 123H ;分配十字節,賦初值;分配十字節,賦初值123H123HSTR DB ABCDE STR DB ABCDE ;分配五字節,賦字符串初;分配五字節,賦字符串初值值ARRAY DW 20 DUP(1) ARRAY DW 20 DUP(1) ;分配;分配2020個字,初值為個字,初值為1 1BUFF DB 6 DUP(?) B

24、UFF DB 6 DUP(?) ;相當于;相當于 DB ?,?,?,?,?,?DB ?,?,?,?,?,?COUNT DB 20COUNT DB 20,3030,40 40 ;分配三字節,賦初值;分配三字節,賦初值 初值可以是確定值,或不確定值初值可以是確定值,或不確定值( (用?表示:只分配用?表示:只分配 相應的存儲空間相應的存儲空間) )。初值序列為多個元素時,各元素。初值序列為多個元素時,各元素 用逗號分隔,也可用復制運算符用逗號分隔,也可用復制運算符DUPDUP賦相同值。其中賦相同值。其中 確定值可以是:整數、字符、字符串、表達式等。確定值可以是:整數、字符、字符串、表達式等。15匯

25、編時數據定義在存儲器匯編時數據定義在存儲器中的分配示意圖:中的分配示意圖:DATA SEGMENTDATA SEGMENT D1 DB 10 D1 DB 10,10H10H D2 DW 100H D2 DW 100H,-5-5 D3 DD 3 D3 DD 32020,0FFFDH0FFFDH D4 DB AB D4 DB AB D5 DW AB D5 DW AB D6 DD AB D6 DD AB ;結果?結果?DATA ENDSDATA ENDS第三章第三章偽指令偽指令數據定義數據定義_3_3(100H)(100H)0AH0AH10H10H00H00H01H01HFBHFBHFFHFFH3C

26、H3CH00H00H00H00H00H00HFDHFDHFFHFFH00H00H00H00H41H41H42H42H42H42H41H41H(10)(10)(10H)(10H)( (55) )( (6060) )AABBBBAAD1D1D2D2D3D3D4D4D5D5存儲器存儲器 低端低端16復制操作符舉例:復制操作符舉例:DUPDUP的嵌套操作。的嵌套操作。X DB 2DUP(0,2DUP(1,2),3)X DB 2DUP(0,2DUP(1,2),3)則匯編結果如右圖:則匯編結果如右圖:第三章第三章偽指令偽指令數據定義數據定義_4_41 1次次DUPDUP2 2次次DUPDUP0000010

27、10202010102020303000001010202010102020303存儲器存儲器 低端低端174 4、標號定義偽指令、標號定義偽指令 LABELLABEL格式:格式:符號名符號名 LABELLABEL 類型類型功能:功能:為緊跟在本偽指令語句之后的標號、過程或為緊跟在本偽指令語句之后的標號、過程或 變量建立新的符號名,建立另一種類型屬性。變量建立新的符號名,建立另一種類型屬性。第三章第三章偽指令偽指令標號定義標號定義_1_1說明:說明: 對標號、過程:對標號、過程:類型為類型為NEARNEAR、FARFAR; 對變量:對變量:類型為類型為BYTE/WORD/DWORD/FWORD

28、/QWORD/BYTE/WORD/DWORD/FWORD/QWORD/ TBYTE TBYTE。 本偽指令提供了另一種定義標號或變量名的方法,本偽指令提供了另一種定義標號或變量名的方法, 但不為符號名分配存儲空間,只建立新的屬性。但不為符號名分配存儲空間,只建立新的屬性。18例例1 1:SUBRF LABEL FARSUBRF LABEL FAR ;標號標號SUBRFSUBRF為段間調用入口為段間調用入口 SUBRNSUBRN:MOV MOV ;標號標號SUBRNSUBRN原為段內調用入口原為段內調用入口 SUBRFSUBRF和和SUBRNSUBRN均指向同一條指令單元,類型不同。均指向同一條

29、指令單元,類型不同。當前代碼段可用當前代碼段可用近標號近標號SUBRNSUBRN調用該程序段,而其它調用該程序段,而其它 代碼段可用代碼段可用遠標號遠標號SUBRFSUBRF調用該程序段。調用該程序段。第三章第三章偽指令偽指令標號定義標號定義_2_2例例2 2:BARRAY LABEL BYTEBARRAY LABEL BYTE ;ARRAYARRAY數組的另一名稱數組的另一名稱, ,字節字節屬性屬性ARRAY DW 200 DUP(?)ARRAY DW 200 DUP(?);ARRAYARRAY數組的原屬性為數組的原屬性為字字 MOV AXMOV AX,ARRAY99 ARRAY99 ;取數

30、組的;取數組的1 1個字個字的值送的值送AXAX MOV ALMOV AL,BARRAY99 BARRAY99 ;取數組的;取數組的第第100100個字節個字節的值送的值送ALAL19第三章第三章偽指令偽指令標號定義標號定義_3_3當前位置計數器當前位置計數器$ $和指定地址偽指令和指定地址偽指令ORGORG 對源程序中的段匯編時,將段名填入段表的同時,對源程序中的段匯編時,將段名填入段表的同時,為該段設置了一個初值是為該段設置了一個初值是0 0的的位置計數器位置計數器$ $,$ $依次累依次累計段內語句被匯編后生成的目標代碼字節數。可用計段內語句被匯編后生成的目標代碼字節數。可用偽指令偽指令

31、ORGORG修改修改$ $的值。的值。 對數據段對數據段,ORGORG后的數據定義偽指令從指定位置后的數據定義偽指令從指定位置進進行單元分配行單元分配; 對代碼段對代碼段,ORGORG后的一條指令語句從指定位置后的一條指令語句從指定位置生成生成目標代碼目標代碼。格式:格式:ORG ORG 偏移地址偏移地址 ;取值范圍:;取值范圍:0 06553565535 ORG $+ ORG $+偏移地址偏移地址功能:功能:將指定的將指定的偏移地址偏移地址或或由由$ $給出的當前地址加上給出的當前地址加上 偏移地址偏移地址作為當前開始分配和使用的偏移地址。作為當前開始分配和使用的偏移地址。20第三章第三章偽

32、指令偽指令標號定義標號定義_4_4舉例:舉例:ORG 0F0H ORG 0F0H ;從;從($=0F0H)($=0F0H)開始安排數據開始安排數據ORG $+10H ORG $+10H ;跳過;跳過10H10H個字節安排數據,個字節安排數據,$ $?DW 1,$+4,$+4, DW 1,$+4,$+4, ;(100H)=1,(102H)=106H,(104H)=?(100H)=1,(102H)=106H,(104H)=?數據段數據段DWDW X0100H 01HX0100H 01HX0101H 00HX0101H 00HX0102H 06HX0102H 06HX0103H 01HX0103H

33、01HX0104H X0104H ?X0105H X0105H ?X0106H X0106H 存儲器存儲器 $ $21數據定義存儲單元分配示例:數據定義存儲單元分配示例: ORG 0200HORG 0200HARY DW -1ARY DW -1,2 2,-3-3,4 4CNT DW $-ARYCNT DW $-ARYVAR DW ARYVAR DW ARY,$+4$+4 執行下列指令:執行下列指令:MOV AXMOV AX,ARY ARY ;(AX)= -1(AX)= -1MOV BXMOV BX,OFFSET VAR OFFSET VAR ;(BX)=20AH(BX)=20AHMOV CXM

34、OV CX,CNT CNT ;(CX)= 8(CX)= 8MOV DXMOV DX,VAR+2 VAR+2 ;(DX)=210H(DX)=210HLEA SILEA SI,ARY ARY ;(SI)=200H(SI)=200H第三章第三章偽指令偽指令標號定義標號定義_5_52 202H02H00H00H-1-1-3-3$-ARY$-ARYARYARY0200H0200H存儲器存儲器 低端低端4 4ARYARY的的偏移值偏移值$+4$+4FFHFFHFFHFFHFDHFDHFFHFFH04H04H00H00H10H10H02H02H08H08H00H00H00H00H02H02HCNTCNT02

35、08H0208HVARVAR020AH020AH020CH020CH225 5、過程和宏定義偽指令、過程和宏定義偽指令 在程序設計中,常常將一些功能獨立且多次重復使在程序設計中,常常將一些功能獨立且多次重復使用的程序段以子程序的形式設計,可簡化程序并提高用的程序段以子程序的形式設計,可簡化程序并提高效率。匯編語言中的過程和宏就具備這樣的功能。效率。匯編語言中的過程和宏就具備這樣的功能。第三章第三章偽指令偽指令過程和宏定義過程和宏定義_1_1 過程定義偽指令過程定義偽指令 PROCPROC和和ENDPENDP 過程可由其它程序用過程可由其它程序用CALLCALL指令調用,執行完后用指令調用,執行

36、完后用 RETRET指令指令返回調用程序。返回調用程序。 格式:格式: 過程名過程名 PROC PROC 屬性屬性 ;過程開始;過程開始 ;過程體;過程體 RET RET ; 過程名過程名 ENDP ENDP ;過程結束;過程結束 功能:功能:定義一個過程定義一個過程( (子程序子程序) )。23說明:說明: 過程名是過程的標識符,可當標號處理過程名是過程的標識符,可當標號處理 ; 過程的類型屬性為:過程的類型屬性為:NEAR(NEAR(近調用即段內調用近調用即段內調用) )和和FARFAR ( (遠調用即段間調用遠調用即段間調用) ),缺省時為,缺省時為NEARNEAR; RET RET返回

37、指令,與調用程序的返回指令,與調用程序的CALLCALL對應。每個過程至對應。每個過程至 少有一條少有一條RETRET指令,但不一定是該過程的最后一條指指令,但不一定是該過程的最后一條指 令,允許有多條令,允許有多條RETRET指令,效果一樣;指令,效果一樣; PROC/ENDP PROC/ENDP 必須成對出現;必須成對出現; 過程是相對獨立的子程序,允許嵌套,嵌套的深度過程是相對獨立的子程序,允許嵌套,嵌套的深度 ( (層數層數) )只受堆棧的限制。只受堆棧的限制。 過程與程序段不允許交叉。過程與程序段不允許交叉。第三章第三章偽指令偽指令過程和宏定義過程和宏定義_2_224 宏定義偽指令宏

38、定義偽指令 宏與過程相似,也可由其它程序用宏名直接調用。宏與過程相似,也可由其它程序用宏名直接調用。格式:格式:宏名宏名 MACRO MACRO 形式參數表形式參數表 ;宏開始;宏開始 ;宏體;宏體 ENDM ENDM ;宏結束;宏結束第三章第三章偽指令偽指令過程和宏定義過程和宏定義_3_3說明:說明: 用一個宏名字代替所定義的宏體的內容;用一個宏名字代替所定義的宏體的內容; 形式參數表的參數用逗號形式參數表的參數用逗號/ /空格分隔。當調用宏時,空格分隔。當調用宏時, 必須用對應的實際參數代替形參,實現數據傳遞;必須用對應的實際參數代替形參,實現數據傳遞; 宏體是指令和偽指令序列,它決定宏的

39、功能,宏也宏體是指令和偽指令序列,它決定宏的功能,宏也 允許嵌套;允許嵌套; 宏一經定義,就如同機器多了一條新指令,一條用宏一經定義,就如同機器多了一條新指令,一條用 戶自己定義的指令。戶自己定義的指令。25舉例:定義一個兩數相加并將結果送至第三個參數的宏。舉例:定義一個兩數相加并將結果送至第三個參數的宏。 CODE SEGMENTCODE SEGMENT ADDUP MACRO AD1ADDUP MACRO AD1,AD2AD2,SUM SUM ;定義一個帶定義一個帶3 3個形參的宏個形參的宏 MOV AXMOV AX, AD1AD1 ADD AX ADD AX, AD2AD2 MOV SU

40、M MOV SUM,AXAX ENDM ENDM ADDUP BXADDUP BX,2424,DXDX ;宏調用,用實際參數;宏調用,用實際參數BXBX、 ;2424、DXDX取代對應的形參取代對應的形參第三章第三章偽指令偽指令過程和宏定義過程和宏定義_4_426 宏和過程的比較宏和過程的比較宏調用只能簡化源程序的書寫,并不縮短目標代碼的宏調用只能簡化源程序的書寫,并不縮短目標代碼的長度。匯編時,宏調用幾次,就加入幾段;過程只在長度。匯編時,宏調用幾次,就加入幾段;過程只在匯編時生成一次目標代碼,程序運行時由匯編時生成一次目標代碼,程序運行時由CALLCALL和和RETRET完成調用完成調用/

41、 /返回操作。返回操作。前者占用存儲空間比后者多。前者占用存儲空間比后者多。第三章第三章偽指令偽指令過程和宏定義過程和宏定義_5_5因此,宏適合于代碼較短,傳送參數較多的子功能段使用;因此,宏適合于代碼較短,傳送參數較多的子功能段使用;而過程適合于代碼較長,調用比較頻繁的子功能段使用。而過程適合于代碼較長,調用比較頻繁的子功能段使用。程序運行時,宏不增加額外的時間開銷。而過程調用程序運行時,宏不增加額外的時間開銷。而過程調用 由于需要保護和恢復現場及斷點,增加了時間開銷。由于需要保護和恢復現場及斷點,增加了時間開銷。 前者執行速度比后者稍快。前者執行速度比后者稍快。宏可以通過形式參數直接傳遞數

42、據。而過程不能,需宏可以通過形式參數直接傳遞數據。而過程不能,需 傳遞數據時,必須通過堆棧、寄存器或存儲器進行。傳遞數據時,必須通過堆棧、寄存器或存儲器進行。 前者編程較后者容易。前者編程較后者容易。273.3 3.3 語句格式語句格式 匯編語言程序主要有指令語句和偽指令語句兩大類。匯編語言程序主要有指令語句和偽指令語句兩大類。格式:格式:指令語句:指令語句: 標號:標號: 助記符助記符 操作數操作數 ;注釋;注釋 偽指令語句:偽指令語句: 名字名字 定義符定義符 操作數操作數 ;注釋;注釋 第三章第三章語句格式語句格式說明:說明: 方括號方括號 內的內容是可選項。內的內容是可選項。 形式上兩

43、種語句很相似,主要不同之處在于:形式上兩種語句很相似,主要不同之處在于: 標號后有冒號標號后有冒號:,而名字后沒有。,而名字后沒有。 下面分別說明語句格式中的四個部分:下面分別說明語句格式中的四個部分:281 1、標號和名字、標號和名字 標號和名字統稱為標識符,標號和名字統稱為標識符,它們分別是指令單元它們分別是指令單元 和偽指令的和偽指令的符號名稱符號名稱。 標識符標識符可由不超過可由不超過3131個字符的字符串組成。個字符的字符串組成。第三章第三章語句格式語句格式標號與名字標號與名字_1_1注意:注意: 標號不允許用數字開頭;標號不允許用數字開頭; 不允許將特殊字符單獨用作標識符;不允許將

44、特殊字符單獨用作標識符; 不允許使用保留字如指令、偽指令、寄存器名等。不允許使用保留字如指令、偽指令、寄存器名等。可選的字符集如下:可選的字符集如下: ASCII ASCII字母字母A AZ Z或或a az(z(匯編不分大小寫匯編不分大小寫) ); 數字數字0 0 9 9; 特殊字符特殊字符 $ _ . : ? () ; / + - $ _ . : ? () ; / + - * * % & % &等。等。29標號與名字的含義:標號與名字的含義: 標號標號 標號是與指令地址關聯標號是與指令地址關聯的標識符的標識符,它指定了機器,它指定了機器指令的起始地址,可以作指令的起始地址,可以作為轉移指令如

45、為轉移指令如JMPJMP、JZJZ、JNAJNA等和調用指令等和調用指令CALLCALL的轉的轉移目標。移目標。第三章第三章語句格式語句格式標號與名字標號與名字_2_2舉例:舉例:CODE SEGMENTCODE SEGMENT CYCLE:CYCLE: CMP AL CMP AL,100100 JNA JNA NDONENDONE NDONE:NDONE: IN AL IN AL,DXDX JMP JMP CYCLECYCLE 30 名字名字 偽指令語句中的名字含義較多:偽指令語句中的名字含義較多:第三章第三章語句格式語句格式標號與名字標號與名字_3_3用它表示一條宏指令。用它表示一條宏指令

46、。還可以用作常量符號等等。還可以用作常量符號等等。 作為變量名作為變量名 作為過程名作為過程名 用作宏名用作宏名與存放數據的存儲單元相對應,指與存放數據的存儲單元相對應,指明該變量在對應的數據段中的地址,明該變量在對應的數據段中的地址,但轉移指令絕不能轉向它;但轉移指令絕不能轉向它;代表一個功能獨立的、可供程序調代表一個功能獨立的、可供程序調用的子程序段,指明該過程的地址用的子程序段,指明該過程的地址入口;入口;312 2、助記符和定義符助記符和定義符 助記符助記符和和定義符定義符是語句中最實質的內容,也是必須是語句中最實質的內容,也是必須選擇的核心項。選擇的核心項。第三章第三章語句格式語句格

47、式助記符和定義符助記符和定義符 偽指令定義符偽指令定義符則規定了偽指令語句的偽操作功能。則規定了偽指令語句的偽操作功能。 注意:注意:偽指令語句是沒有機器碼的,只是在匯編時偽指令語句是沒有機器碼的,只是在匯編時 指示匯編程序做一些操作,如定義符號、過指示匯編程序做一些操作,如定義符號、過 程、分配存儲單元、初始化存儲器等等。程、分配存儲單元、初始化存儲器等等。 助記符助記符的全稱是指令代碼助記符,它規定了指令語的全稱是指令代碼助記符,它規定了指令語句的操作性質,在指令語句的助記符前還可以根據需句的操作性質,在指令語句的助記符前還可以根據需要,增加前綴。要,增加前綴。323 3、操作數、操作數

48、操作數也叫參數。這是可選項,一條語句中可以有操作數也叫參數。這是可選項,一條語句中可以有一個或多個參數,也可以沒有參數。多個參數之間需用一個或多個參數,也可以沒有參數。多個參數之間需用逗號逗號,或空格分隔。或空格分隔。 操作數主要有三類:常量、存儲器、表達式操作數。操作數主要有三類:常量、存儲器、表達式操作數。第三章第三章語句格式語句格式操作數操作數常量操作數常量操作數 常量操作數常量操作數 二二/ /八八/ /十十/ /十六進制的整形常數十六進制的整形常數 十六進制實數十六進制實數 字符串字符串( (必須用單引號括起來,必須用單引號括起來, 其值為其值為ASCIIASCII碼值碼值) ) 已

49、賦值的常數標識符已賦值的常數標識符 寄存器名或寄存器名或I/OI/O端口地址端口地址33 存儲器操作數存儲器操作數 存儲器操作數有兩種:標號和變量。這二者是存儲器操作數有兩種:標號和變量。這二者是程序中最常用的操作數。程序中最常用的操作數。 標號標號的含義已經討論過,它是指令單元的符號的含義已經討論過,它是指令單元的符號化地址。化地址。 變量變量則是存放數據的存儲單元的符號化地址,則是存放數據的存儲單元的符號化地址,它一般位于數據段或堆棧段中。可用各種尋址方它一般位于數據段或堆棧段中。可用各種尋址方式對變量進行存取。式對變量進行存取。第三章第三章語句格式語句格式操作數操作數存儲器操作數存儲器操

50、作數_1_134第三章第三章語句格式語句格式操作數操作數存儲器操作數存儲器操作數_2_2 對于變量還有長度和字節數兩個特有屬性。對于變量還有長度和字節數兩個特有屬性。標號的段基值標號的段基值在代碼段寄存器在代碼段寄存器CSCS中;中;變量的段基值變量的段基值在數據段寄存器在數據段寄存器DS/ESDS/ES/GS/FS/GS/FS或堆棧段寄存器或堆棧段寄存器SSSS中。中。段內偏移地址段內偏移地址是是1616位或位或3232位無符號數位無符號數, ,它代表從段起始地址到定義標號或變它代表從段起始地址到定義標號或變量的位置之間的字節數。量的位置之間的字節數。對標號有對標號有NEARNEAR和和FA

51、RFAR兩種類型,分別兩種類型,分別表示在段內引用和段間引用;表示在段內引用和段間引用;對變量有對變量有字節字節/ /字字/ /雙字雙字/ /長字長字/ /四字四字/ /十字十字等六種類型。等六種類型。類型類型偏移值偏移值段值段值標標號號和和變變量量共共同同屬屬性性35 表達式操作數表達式操作數 它是由各種操作數、運算符組合而成的。匯編時,它是由各種操作數、運算符組合而成的。匯編時,每每個表達式都將產生一個確定的值。個表達式都將產生一個確定的值。 運算符在表達式中有重要作用,內容豐富。運算符在表達式中有重要作用,內容豐富。第三章第三章語句格式語句格式操作數操作數表達式操作數表達式操作數運算符種

52、類運算符種類 算術運算符算術運算符 邏輯運算符邏輯運算符 關系運算符關系運算符 分析運算符分析運算符 合成運算符合成運算符 其它運算符其它運算符36第三章第三章語句格式語句格式操作數操作數表達式表達式算術運算符算術運算符_1_1 算術運算符算術運算符符號符號名稱名稱運算結果運算結果實實 例例+ +加法加法和和2+6=82+6=8- -減法減法差差8-2=68-2=6* *乘法乘法乘積乘積8 8* *5=405=40/ /除法除法商商22/5=422/5=4MODMOD模除模除余數余數12MOD3=012MOD3=0,32MOD6=232MOD6=2SHLSHL左移左移左移后值左移后值0010B

53、 SHL 2 =1000B0010B SHL 2 =1000BSHRSHR右移右移右移后值右移后值1100B SHR 1 =0110B1100B SHR 1 =0110B 算術運算符主要用于數字運算,結果仍是數字的。算術運算符主要用于數字運算,結果仍是數字的。 它用于存儲器的地址操作數計算時,一般只對在同它用于存儲器的地址操作數計算時,一般只對在同一段內的地址操作數進行加一段內的地址操作數進行加/ /減一個數字量的計算。減一個數字量的計算。37舉例:舉例:對右邊程序段中的地址對右邊程序段中的地址操作數作算術運算操作數作算術運算 NUM+2NUM+2 CYCLE-5 CYCLE-5 NDONE-

54、GO NDONE-GO 是有效的表達式,是有效的表達式, NUM-CYCLENUM-CYCLE 是無效的,不在同一個段。是無效的,不在同一個段。注意:注意:NUM+2NUM+2的值,是指向變量的值,是指向變量NUMNUM的第三個字節的地址,而的第三個字節的地址,而不是不是NUMNUM單元的內容單元的內容+2+2。DATA SEGMENTDATA SEGMENTNUMNUM DB 7,8,9 DB 7,8,9DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME ASSUME GOGO: MOV AXMOV AX,DATADATA MOV DS MOV

55、 DS,AXAXCYCLECYCLE:CMP ALCMP AL,100100 JNA NDONE JNA NDONE NDONENDONE:IN ALIN AL,DXDX JMP CYCLE JMP CYCLECODE ENDSCODE ENDS END GO END GO 第三章第三章語句格式語句格式操作數操作數表達式表達式算術運算符算術運算符_2_238第三章第三章語句格式語句格式操作數操作數表達式表達式邏輯運算符邏輯運算符_1_1 邏輯運算符邏輯運算符 邏輯運算是按位操作的,其操作數只能是數字的。存邏輯運算是按位操作的,其操作數只能是數字的。存儲器地址操作數不能進行邏輯運算。儲器地址操作

56、數不能進行邏輯運算。符號符號名稱名稱運算結果運算結果實實 例例NOTNOT非非非結果非結果NOT 1010B = 0101BNOT 1010B = 0101BANDAND與與與結果與結果1010B AND 1100B=1000B1010B AND 1100B=1000BOROR或或或結果或結果1011B OR 1100B=1111B1011B OR 1100B=1111BXORXOR異或異或異或結果異或結果1010B XOR 1100B=0110B1010B XOR 1100B=0110B舉例:舉例:IN ALIN AL,PORT PORT ;設;設PORTPORT為奇數端口號為奇數端口號 O

57、UT PORT AND 0FEHOUT PORT AND 0FEH,AL AL ;端口號末位清零,從;端口號末位清零,從 ;偶數端口輸出;偶數端口輸出39特別注意:特別注意: 邏輯運算符邏輯運算符NOT/AND/OR/XOR(NOT/AND/OR/XOR(包括算術運算符包括算術運算符SHL/SHR)SHL/SHR)與與80X86/Pentium80X86/Pentium對應的指令助記符完全對應的指令助記符完全一樣。但是它們的操作時機不同:運算符是在程序一樣。但是它們的操作時機不同:運算符是在程序匯編時完成操作的,而指令助記符是在程序執行時匯編時完成操作的,而指令助記符是在程序執行時操作的。操作

58、的。例如:例如:AND DXAND DX,PORT AND 0FEHPORT AND 0FEH 在程序匯編時,計算在程序匯編時,計算PORT AND 0FEHPORT AND 0FEH,產生一個,產生一個立即數;當程序執行時,這個立即數將與立即數;當程序執行時,這個立即數將與DXDX的內容的內容作作“與與”操作,結果送至操作,結果送至DXDX。第三章第三章語句格式語句格式操作數操作數表達式表達式邏輯運算符邏輯運算符_2_240第三章第三章語句格式語句格式操作數操作數表達式表達式關系運算符關系運算符 關系運算符關系運算符符號符號名稱名稱運算結果運算結果實實 例例EQEQ相等相等結果為真結果為真輸

59、出全輸出全“1”1”結果為假結果為假輸出全輸出全“0”0”6 EQ 11B = 6 EQ 11B = 全全“0”0”NENE不等不等6 NE 11B = 6 NE 11B = 全全“1”1”LTLT小于小于5 LT 8 = 5 LT 8 = 全全“1”1”LELE不大于不大于7 LE 101B = 7 LE 101B = 全全“0”0”GTGT大于大于6 GT 100B = 6 GT 100B = 全全“1”1”GEGE不小于不小于6 GE 111B = 6 GE 111B = 全全“0”0” 關系運算符的兩個操作數必須同為數字的,或同為同一關系運算符的兩個操作數必須同為數字的,或同為同一個段

60、內的存儲器地址。例如:個段內的存儲器地址。例如:MOV BXMOV BX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)(PORT LT 5)AND 20)OR(PORT GE 5)AND 30) 結果:結果:(BX)=20(PORT(BX)=20(PORT5) 5) 或或 (BX)=30(PORT5)(BX)=30(PORT5)41第三章第三章語句格式語句格式操作數操作數表達式表達式分析運算符分析運算符_1_1 分析運算符分析運算符 分析運算符的作用是把分析運算符的作用是把存儲器地址操作數存儲器地址操作數分解為它分解為它的組成部分,根據需要獲取所需的值。的組成部

溫馨提示

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

評論

0/150

提交評論