




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、微機原理與接口技術第4章 匯編語言程序設計 4.1 匯編語言概述華中科技大學出版社 匯編語言(Assembly Language)是一種面向CPU指令系統的程序設計語言,它采用指令系統的助記符來表示操作碼和操作數,用符號地址表示操作數地址,因而易記、易讀、易修改,給編程帶來很大方便。 用匯編語言編寫的程序能夠直接對位、字節、寄存器、存儲單元、I/O接口等進行處理,同時也能直接使用CPU指令系統和指令系統提供的各種尋址方式編制出高質量的程序,這種程序不但占用內存空間少,而且執行速度快。所以計算機高級技術人員大量使用匯編語言來編寫計算機系統程序,實時通信程序和實時控制程序等。華中科技大學出版社 用
2、匯編語言編寫的源程序在輸入計算機后,需要將其翻譯成目標程序,計算機才能執行相應指令,這個翻譯過程稱為匯編,完成匯編任務的程序稱為匯編程序。8086系統中常用的匯編程序是標準匯編程序(ASM)和宏匯編程序(MASM),因此除了指令系統外,還要了解(MASM)中的標號、表達式、偽指令,必須按MASM中規定的格式來編寫源程序,才能正確匯編成可執行程序。4.1.1匯編語言調試準備用匯編語言編寫的源程序在輸入計算機后,需要將其翻譯成目標程序,計算機才能執行相應指令,這個翻譯過程稱為匯編,完成匯編任務的程序稱為匯編程序。 8086系統中常用的匯編程序是小匯編程序ASM或宏匯編程序MASM,因此除了指令系統
3、外,還要了解MASM中的標號、表達式、偽指令,必須按MASM中規定的格式來編寫源程序 軟件準備主要包括以下幾類:(1)MS-DOS操作系統,如:MSDOS6.22,MSDOS7.0等。(2)文本編輯器,如:EDIT,TC等。(3)匯編程序,如:MASM等。(4)連接程序,如LINK。(5)調試程序,如:DEBUG、TDEBUG等)。 4.1.1匯編語言調試過程4.2 匯編語言8086宏匯編源程序是由8086CPU規定的“指令”和宏匯編程序規定的“偽指令”共同構成的。下面先看一個完整的用匯編語言編寫程序。【例4.1】通過鍵盤向系統輸入一個小寫字符,然后將該字符轉換成大寫并顯示出來。DATASEG
4、MENT;數據段BUFDB?DATAENDSSTACKSEGMNETST1DB 100DUP(?)CODESEGMENT;代碼段ASSUME CS:CODE, DS:DATA, SS:STACKSTARTPROCFAR華中科技大學出版社BEGIN:PUSHDS;正常返回所需段地址及偏移地址MOVAX,0PUSHAXMOVAX,DATA;送數據段段地址MOVDS,AXMOVAX,STACK;送堆棧段地址MOVSS,AXLEA DX,BUF;送緩沖區首地址MOVAH,1;01號鍵盤輸入功能調用INT21H;調用DOS中斷服務,讀入字符SUBAL,32MOVDL,AL;將需要顯示的字符送DLMOVA
5、H,2;2號顯示功能調用INT21H;調用DOS中斷服務,輸出字符RETSTARTENDPCODEENDSENDBEGIN從例4.1不難看到,因為8086系統的存儲器采用分段管理,所以其匯編源程序也是由用戶根據需要劃分成“段”,匯編程序為此提供了專門的偽指令(SEGMENT和ENDS)來實現邏輯段的劃分。實際上,一個完整的8086匯編語言源程序就是由一個或多個段組成的,段之間用段名加以區分,每個段中包括數目不等的語句行,各行語句均由各種符號(標記)及分隔符按照一定的規則組織起來。 華中科技大學出版社其一般結構如下: 段名1 SEGMENT;一個段的開始 語句1 語句2 段名1 ENDS;一個段
6、的結束 段名2 SEGMENT;另一個段的開始 段名2 ENDS;另一個段的結束 ;其他段 END ;源代碼結束4.2.1 段華中科技大學出版社數據段用來在內存中建立一個適當容量的工作區,以存放常數、變量等操作數據。堆棧段用來在內存中建立一個適當的堆棧區,以便在中斷、子程序調用時使用。代碼段包括了許多以符號表示的指令,其內容就是程序要執行的指令。必不可少的是代碼段和堆棧段,堆棧段也可以不用顯示定義,可以直接使用隱式堆棧段,如果程序中需要使用數據存儲區,則要定義數據段,必要時還要定義附加段。通常需要一個代碼段、一個數據段和一個堆棧段,有時可包含一個附加段。而對于復雜的程序,除了使用上述3個段以外
7、還可以使用多個段,甚至可以使用多個程序模塊。 華中科技大學出版社4.2.2 語句 語句是匯編語言源程序的基本組成單位。一個匯編語言源程序中有3種基本語句:指令性語句(指令)、指示性語句(偽指令)和宏指令。前兩種是最常見、最基本的語句。指令語句和偽指令語句不僅在程序中的功能不同,而且實現其功能的方法和時間也不同。華中科技大學出版社1. 指令性語句(指令) 指令性語句與機器指令相對應,匯編程序可將它翻譯成目標代碼(機器指令代碼),所以這種語句又稱為可執行語句。語句格式為標號: 指令助記符操作數;注釋 標號表示本指令語句的符號地址,標號后面必須緊跟 “:”。標號可使用的字符為字母(AZ,az)、數字
8、(09)或某些特殊字符(、_、?)等。第一個字符必須為字母或某些特殊字符,最大有效字符長度為31個字符。華中科技大學出版社 指令助記符是該語句的指令名稱的代表符號,匯編程序將其翻譯成機器命令。 操作數表示參加指令運算的數據,根據指令要求可以有一個或多個操作數,有的指令不需要操作數,多個操作數之間應用逗號隔開,操作數與指令助記符之間用空格隔開。操作數可以是常數、變量、標號、寄存器名或表達式。 注釋用來說明一條指令或一段程序的功能。注釋前必須加上 “;”。華中科技大學出版社2. 指示性語句(偽指令) 偽指令語句沒有對應的機器指令,只為匯編提供所需信息,匯編程序匯編源程序時對偽指令進行處理,它可以完
9、成數據定義,存儲區分配,段分配,指示程序結束等功能。其一般格式如下:名字 偽指令助記符 操作數 ;注釋 名字是給偽指令取的名稱,它用符號地址表示,名字后不允許帶冒號,名字可以省略。偽指令中的名字通常是變量名、段名、過程名、符號名等。華中科技大學出版社 偽指令助記符是匯編程序MASM匯編規定的符號,常用的有變量定義語句(DB、DW),符號定義語句(EQU、=),段定義語句(SEGMENTENDS)等類型。 操作數是由偽指令具體要求的,有的偽指令不允許帶操作數,有的要求帶多個操作數,多個操作數之間必須用逗號分開。操作數可以是常數、變量、字符串、表達式等。 偽指令語句的注釋也是可選項,需要時必須以“
10、;”開始。華中科技大學出版社3. 宏指令宏指令是一種特殊的偽指令,實際上是用一條偽指令代替多條指令,以簡化程序的書寫。其組成形式同指示性語句。帶有宏指令的匯編源程序只能用宏匯編程序進行匯編。華中科技大學出版社4.3.1 字符集1英文字母:包括大寫字母AZ和小寫字母az。宏匯編語言中的大小寫字母不予區分。2阿拉伯數字:09。3特殊符號:包括可打印字符和不可打印字符。其中:可打印字符包括:+ - * / = _ ( ) ; : , ? , $ & # 。不可打印字符包括空格符、制表符(Tab鍵)、回車符、換行符。4.3 8086匯編語言的基本語法華中科技大學出版社4.3.2 常量宏匯編語言中允許使
11、用以下兩種類型的常量:1數字常量(1)二進制數:以“B”結尾,如00001101B;(2)八進制數:以“O”結尾,如725O;(3)十六進制數:以“H”結尾,若最高位為字母 AF,前面應加0,如0A12H;(4)十進制數:以“D”結尾或無任何字母作結尾,如10D、10。華中科技大學出版社2字符串常量字符串常量表示為包含在兩個單引號之間的一連串ASCII碼字符。當單引號本身作為一個串元素時,需連寫兩個單引號。每個串元素的值定義為該元素所對應的1字節ASCII碼值。華中科技大學出版社4.3.3保留字8086宏匯編源程序可以使用以下幾類保留字:(1)8086CPU規定的所有指令助記符:如MOV、AD
12、D等。(2)8086CPU中各寄存器名(包括16位和8位寄存器):如AL、AH、AX、DS、ES、SS等。(3)宏匯編程序規定的所有偽指令助記符:如ASSUME、END、ENDM、SEGMENT等。(4)宏匯編程序規定的其他助記符(包括各種運算符及偽指令參數):如AT、BYTE、COMMON、DUP、EQ、FAR、SEG、SHORT、等。華中科技大學出版社4.3.4 標識符用戶定義的、具有特殊意義的字符序列。常用標識符包括變量名、標號、段名、過程名等。1變量名變量名具有以下3個屬性:(1)段基址:該內存單元所在段的首址,為該段所對應的段寄存器值。(2)偏移量:該內存單元在段內相對于首址的距離,
13、為16位二進制數。(3)類型:該內存單元所存放的數據長度,可能是字節(BYTE)、字(WORD)等類型。華中科技大學出版社2標號用戶為程序中某條指令所起的名字。標號也有3個屬性:(1)段基址:標號所在代碼段的首址,即CS值。(2)偏移量:標號所代表的指令相對于代碼段首址的距離,為16位二進制數。(3)類型:有遠(FAR)、近(NEAR)兩種,分別區別標號所代表的指令與使用該標號做目標地址的控制轉移指令是否位于同一代碼段中若是,則為NEAR類型,否則為FAR類型。華中科技大學出版社3段名用戶為程序中某個段所起的名字,等于該段的段基址。4過程名用戶為程序中某個過程(子程序)所起的名字,等于該過程的
14、入口地址,即該過程第一條指令所對應的目標代碼的存放地址。過程名具有標號所有的3個屬性。華中科技大學出版社4.3.5 表達式表達式由運算對象及運算符組成,在匯編時由匯編程序對它進行運算,運算結果作為一個語句中的操作數去使用。表達式中的運算符包括算術運算符、邏輯運算符、關系運算符、分析運算符以及合成運算符五種。表4.1和表4.2給出了各類運算符以及其優先級別。華中科技大學出版社算術運算符邏輯運算符關系運算符分析運算符合成運算符加+與AND相等EQ取段基址SEGPTR減-或OR不等NE取偏移量OFFSETTHIS乘*非NOT大于GT取類型TYPESHORT除異或XOR小于LT取字節個數SIZE取余M
15、OD不小于GE取元素個數LENGTH左移SHL不大于LE取高字節HIGH右移SHR取低字節LOW表4.1 8086宏匯編語言支持的常用運算符華中科技大學出版社優先級運 算 符高低( )SIZE、 LENGTHPTR、 THIS、 SEG、 OFFSET、 TYPE*、MOD、SHL、SHR、 EQ、 NE、 GT、 LT、 GE、 LENOTANDOR、XOR表4.2 常用運算符的優先級別華中科技大學出版社1) 算術運算符 算術運算符包括+(加)、(減)、*(乘)、/(除,只取除法運算結果之商)、MOD(模,只取除法運算結果之余)、SHL(左移,左移1位相當于乘2)、SHR(右移,右移1位相當
16、于除2),因此19/7是2(商是2),而19MOD7是5(余數是5)。 所有的算術運算符均可以對數據進行運算,運算對象與運算結果都是整數。當算術運算符應用于存儲器即地址操作數時其規則就更加嚴格:只有當結果具有明確的、有意義的物理解釋時,這些運算才是有效的。若對地址運算,通常是在標號上加/減某一個數字量,例DA1+2、K23各表示一個存儲單元的地址,對地址乘是沒有意義的。華中科技大學出版社【例4.2】 MOV AX,3*10+8 MOV AL,5MOD3 MOV BH,0001010lBSHL2 匯編后得到 MOV AX,38 MOV AL,2 MOV BH,01010100B華中科技大學出版社
17、【例4.3】 DAT1 DB 1 ;定義字節變量,并相應賦初值 DAT2 DB 3 DAT3 DB 20 MOV AL,DAT1 ADD AL,2 ;“ADD將在程序運行時進 ;行,結果(AL)123 MOV AL,DAT1+2 ;“”將在匯編時進行,這時還沒有真正分配內存空間,各變量的值也并未存放好,指令的實際意義是:將DAT1單元后的第二個單元的值(即DAT3的值)送到AL中,程序運行后(AL)=20。華中科技大學出版社2) 邏輯運算符 邏輯運算符包括AND(與)、OR(或)、NOT(非)、XOR(異或)4種,邏輯運算符是按位運算的,只能對常數進行運算,得到結果也是常數。 邏輯運算符與80
18、86指令系統中的指令助記符AND、OR、NOT、XOR的符號完全相同,但二者是不會混淆的。作為MASM的運算符是在匯編過程中進行計算的,而指令助記符是在程序執行時進行運算的。華中科技大學出版社【例4.4】 AND BL,46H AND 0FH MOV AL,NOT 01H匯編后得到AND BL,06HMOV AL,0FEH華中科技大學出版社3) 關系運算符 關系運算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6種。 關系運算符的兩個操作數必須是數據,或是同一段內的兩個存儲單元的地址。進行關系運算的比較操作后,結果是一個數值,若結果為真,輸
19、出全是“1”,即0FFH或0FFFFH。若結果為假,輸出全是“0”。關系運算符一般與邏輯運算符組合起來使用。華中科技大學出版社【例4.5】MOV AX,0A2H NE 02H MOV AL,02H GT 0A2H 匯編后得到MOV AX,0FFFFHMOV AL,00H華中科技大學出版社4) 分析運算符 分析運算符也經常稱作數值返回運算符(analytic operators),包括OFFSET、TYPE、LENGTH、SIZE等,它們加在變量或標號前,返回運算對象的某個參數值,例如偏移地址值、段地址值、類型屬性、變量包含的單元數等。(1) OFFSET。 格式:OFFSET 變量或標號 OF
20、FSET返回標號或變量的偏移地址值,為程序設計中常用的運算符。華中科技大學出版社(2) SEG。格式:SEG 變量或標號SEG用來取變量或標號的段基址。(3) TYPE。 格式:TYPE 變量或標號 TYPE加在變量前,返回變量的類型屬性,TYPE加在標號前,返回標號的距離屬性。(4) LENGTH。 格式:LENGTH 變量 當變量中使用DUP時,LENGTH返回此變量所包含的單元數,對其他變量則返回1。華中科技大學出版社(5) SIZE。 格式:SIZE 變量 SIZE 運算符加在變量前,返回該變量包含的總字節數。 比較SIZE、LENGTH和TYPE運算符的定義,可知有:SIZE 變量(
21、LENGTH 變量)*(TYPE 變量)華中科技大學出版社【例4.6】如有數據段定義如下:DSEG SEGMENT BUFF DW 10DUP(1234H),10H,00H COUN DD 12345678HDSEG EDNS則:SEG BUFF=DSEG SEG COUN=DSEG ;取段基址OFFSET BUFF0000H OFFSET COUN=0018H ; 取偏移量TYPE BUFF2(字) TYPE COUN4(雙字) ; 取類型LENGTH BUFF10 LENGTH COUN=1 ;取DUP次數SIZE BUFF=2*10:20 SIZE COUN=4*1=4 ; 取字節數華中
22、科技大學出版社5) 合成運算符 合成運算符對已定義的單個操作數重新生成段基址、偏移量相同而類型不同的新操作數。PTR、THIS運算符對變量、標號有效,SHORT運算符僅對標號有效。(1) PTR。 格式:新類型 PTR 原操作數 該表達式代表的新操作數的段基址和偏移量與“原操作數”相同,新操作數的類型為表達式中指定的“新類型”。華中科技大學出版社【例4.7】 DAT1 DB 1 ;定義字節型變量 DAT2 DB 3 MOV AL,DAT1 ;執行后(AL)01H MOV AX,WORD PTR DAT1 ;執行后(AX)=0301H華中科技大學出版社(2) THIS。 格式:變量/標號 EQU
23、 THIS 新類型 THIS的功能是將EQU THIS右邊的類型/距離屬性,賦給左邊的變量。標號,該變量或標號的段地址和偏移地址與下一個存儲單元的地址相同。【例4.8】 FIRST EQU THIS BYTE TABLE DW 200 DUP(?) FIRST的偏移地址值與TABLE的偏移地址相同,區別在于FIRST變量為字節類型,TABLE為字類型。華中科技大學出版社(3) SHORT。 格式:SHORT 標號 SHORT用來說明轉移類指令中轉向地址的屬性,指出轉向的目標地址與本指令之間的距離在128+127之間,即限制在短轉移范圍內。【例4.9】 L1: JMP SHORT L2 L2:
24、MOV AX,0 如前所述,一個匯編語言的源程序是由一條條語句組成的,語句(statements)就是完成一個何種動作的說明。源程序中的語句可分成兩類:指令語句和偽指令語句,其中指令語句為8086微處理器的各種符號指令,匯編程序把它們翻譯成機器代碼,這些代碼命令8086執行某些操作。如MOV、ADD、JMP等。偽指令語句使用的是各種偽操作命令,匯編程序并不把它們(也不可能)翻譯成機器代碼,只是用來指示、引導匯編程序在匯編時進行一些操作,如定義符號、分配存儲單元、初始化存儲器等等,所以偽指令本身不占用存儲單元。4.4 偽操作指令華中科技大學出版社偽指令語句的格式為名稱 偽指令 操作數;注釋 其中
25、,名稱字段對于某些偽指令是必需的,對于另外一些偽指令是可選擇的,還有一些偽指令則不允許有名稱。操作數字段可以是一項或多項,項與項之間用逗號分開。注釋是任選的,用于提高程序的可讀性。 名稱是該偽指令的標識符,當偽指令是數據定義偽指令時,名稱為變量。指令中的名稱和偽指令之間用空格符作為分隔,并且名稱與指令的地址毫無關系。華中科技大學出版社在IBM宏匯編中有以下幾種偽指令語句(Directive Statements): (1) 數據定義偽指令;(2) 符號定義偽指令;(3) 段定義偽指令;(4) 過程定義偽指令;(5) 宏處理偽指令;(6) 其他偽指令。這一類偽指令幫助用戶靈活簡潔地使用匯編語言編
26、程。華中科技大學出版社4.4.1 數據定義偽操作 數據定義偽指令用來為數據分配內存空間,并設置相應內存單元的初始值,其形式為變量名 變量定義符 操作數,操作數 ;注釋 變量名是一個符號地址,表示其后操作數的首地址,多個操作數構成一個數組。變量名是程序員給出的標識符,為可選項,給出變量名只是為了按名存取其對應的內存單元。 華中科技大學出版社變量定義符主要包括下列幾種。 (1) DB(Define Byte):定義字節,后面的每個操作數占1個字節。 (2) DW(Define Word):定義字,后面的每個操作數占1個字。 (3) DD(Define DWord):定義雙字,后面的每個操作數占2個
27、字。 (4) DQ(Define QWord):定義四字,后面的每個操作數占4個字。 (5) DT(Define TByte):定義十字節,后面的每個操作數占10個字節。華中科技大學出版社操作數可以為:(1) 數值表達式;(2) ASC碼字符串;(3) 地址表達式;(4) ?(只保存內存空間,未定義初始值);(5) DUP 子句,其格式為:重復次數 DUP (操作數,操作數),DUP子句可以嵌套。注釋項用來說明偽指令的功能,是任選項。 下面用例題說明偽指令的用法。華中科技大學出版社圖4.2 例4.10 數據存儲格式華中科技大學出版社1. 操作數為常量或數值表達式【例4.10】 DB/DW/DD
28、/DQ的用法。 下列數據段定義和分配了一些存儲單元,其實際分配圖如圖4.2所示。DA1DB 10H,52H;定義2個字節DA2DW 1122H,34H;定義2個字DA3DD 5*20H,0FFEEH;定義1個雙字 2. 操作數為字符串【例4.11】 ST DB ABCDE DB偽指令也可用來定義一個字符串,此語句的含義是把字符串ABCDE中的每個字符的ASCII碼依次存入以變量ST的地址開始的連續字節單元中。華中科技大學出版社3. 操作數為“?” 問號操作數表示預留存儲單元,但不預置具體的數值,以便存放運算結果。【例4.12】 M1 DB ? ;定義變量 M1為不確定字節,保留一字節空間M2
29、DB 0D55H,?;定義變量M2第二個字為不確定字,保留2個字節空間4. 操作數用DUP來定義重復變量 重復操作符DUP可作為操作數的組成部分,其使用格式為變量名 DB/DW/DD/DQ/DT DUP(表達式) 華中科技大學出版社其中,DUP左邊的表達式表示重復的次數,右邊括號中的表達式表示要重復的內容,括號中的表達式可以是一個“?”,表示不置初值,為隨機值;也可以是一個數據表達式,將相應單元初始化。【例4.13】 下面的數據段表示了DUP的用法, DB 100 DUP(0) DW 2 DUP(3 DUP (0,1) 第一條語句定義了100個字節,初值均為0;第二條語句相當于“DW 0,1,
30、0,1,0,1,0,1,0,1,0,1”,即定義了12個字單元,其初值為0、1、0、1、0、1。華中科技大學出版社5. 操作數為地址表達式 DW偽指令用于預置該地址表達式的偏移地址,DD偽指令則用于預置該地址表達式的偏移地址和段基址。【例4.14】 若ARRAY為變量名,AGAIN為標號名,則語句 ADDRN DW ARRAY+2表示將ARRAY+2單元的偏移地址存入ADDRN這個字類型變量中。而語句 ADDRF DD AGAIN則表示將標號AGAIN的段基址和偏移地址存入ADDRF這個雙字類型變量中。其中,低字單元為偏移地址,高字單元中為段基址。華中科技大學出版社4.4.2 符號定義偽操作
31、符號定義偽指令用于為程序中多次出現的同一個常量或表達式定義為一個標識符,以便在源程序中以標識符來代替對應的常量或表達式。符號定義偽指令有以下3種。1. 等價偽指令EQU 格式:符號名 EQU 表達式 功能:為常量或表達式及其他各種符號定義一個等價的符號名,但它不申請分配存儲單元。指令說明如下: (1) 表達式可以是常量或數值表達式;地址表達式;變量、標號或指令助記符。 (2) 符號名不占存儲單元,沒有段、偏移和類型這3種屬性。 華中科技大學出版社(3) 在同一源程序中,使用EQU定義的符號不能與本程序中的其他符號名同名;另外,同一符號不能用EQU偽指令重新定義。EQU偽指令主要有以下3方面應用
32、: (1) 定義符號常量。用符號名表示常量、數值表達式。 (2) EQU與屬性運算符PTR或THIS連用,可以給變量或標號定義新的類型屬性并重新命名。但其段屬性和偏移屬性不變。 (3) 利用EQU可以用一個符號名替代一個復雜的地址表達式和其他一些符號,如指令助記符、變量名、標號、段名、寄存器名、宏定義名等。華中科技大學出版社2. 等號偽指令“=” 格式:符號名 = 表達式 功能:該語句的功能與EQU語句類似,不同的是等號偽指令能對所定義的符號名多次重新定義,且以最后一次定義的值為準。 【例4.15】CN EQU100 ;符號CN等價為100CN1 EQU CN+100;符號CN1等價為表達式C
33、N+100C EQU CX ;符號C等價為寄存器名CXM EQU MOV ;MOV助記符可以由M代替B EQU DS:BP+20;地址表達式DS:BP+20可由符 ;號B代替華中科技大學出版社有了以上定義后,下列語句有效。M C,CN ;等效為MOV CX,100M BX,B ;等效為MOV BX,DS:BP+20 由EQU定義的符號,在整個程序中不可以被再次定義。而對于需要在程序中各處不斷改變其意義的符號,應用“=”偽指令定義。【例4.16】 例如:CN EQU 100CN EQU 200第二個對CN的定義是錯誤的,但是CN = 100CN =200則以第二次對CN的定義為準,CN與200等
34、價。華中科技大學出版社3. 定義偽指令LABEL 格式:變量名或標號名 LABEL 類型 功能:LABEL偽指令用來在某一變量或標號的基礎上定義一個新的類型不同的變量或標號。其中變量的類型可用BYTE、WORD和DWORD;標號的類型有NEAR和FAR。例如:VAR1 LABELWORDVAR2DB 20 DUP(1) 變量VAR1與VAR2具有相同的段基址和偏移量,但VAR2是字節型。L1LABEL FARL2:MOV AX,1000H 標號L1以及L2均為指令MOV AX,1000H的符號地址,但L1具有FAR類型,L2卻是NEAR類型的。 從以上用法可知,LABEL偽指令與前述的綜合運算
35、PTR和THIS功能相似。華中科技大學出版社4.4.3 段定義偽指令 編制一個80X86匯編語言源程序,段是基礎,必須按段來構造程序,在程序執行時,要憑借4個段寄存器對各個段的存儲單元進行訪問。段結構偽指令主要有兩條語句,即段定義偽指令和假定偽指令。1. 段定義偽指令SEGMENT/ ENDS格式:段名 SEGMENT 定位類型 組合類型 類別 段體 段名 ENDS 其中,段名是編程者給該段取的名字。定位類型、組合類型、類別是賦予該段的屬性,當默認時,使用8086/8088宏匯編給定的默認值。華中科技大學出版社 定位類型規定了對該段的起始邊界地址的要求,可以有以下4種選擇: (1) PAGE:
36、段起始地址為一頁(PAGE)的開始,規定256個字節為一頁,頁起始地址為XXXX XXXX XXXX 0000 0000,低8位為0。 (2) PARA:段起始地址為一節(PARAGRAPH)的開始,規定16個字節為一節,節起始地址為XXXX XXXX XXXX XXXX 0000,低4位為0。 (3) WORD:段起始地址為一規則字的開始,即偶地址開始,XXXX XXXX XXXX XXXX XXX0,最低位為0。 (4) BYTE:段起始地址為任意值,即從任何字節開始都行。 PARA定位類型為系統默認。華中科技大學出版社 組合類型表示該段與程序中其他段的關系。可以有以下6種選擇: (1)
37、NONE:該段獨立與其他段無關。 (2) PUBLIC:該段可與其他同名同類別的段相鄰地連接在一起,共同擁有一個段基址。 (3) STACK:與PUBLIC相同,但作為堆棧段處理。 (4) COMMON:該段可能與其他同名同類別的段發生覆蓋,共同擁有一個段基址,段的長度取決于最長的COMMON段。 (5) AT表達式:該段應放在AT后的表達式值(16位)所指定的段地址上。這種方式不能用與代碼段。 (6) MEMORY:該段位于被連接在一起的其他所有段之上。 NONE組合類型為系統默認值。華中科技大學出版社 類別是由編程者賦予該段的與段名不同的另一種名字信息。程序中所有類別相同的段將被組成一個段
38、組,該段組以其們共同的類別作為名字。常使用的類別有“STACK”、“CODE”、“DATA”等。 功能:定義一個邏輯段,指定段的名字和范圍,段在內存中的起始位置、段與段之間的連接關系。說明:(1) 段名由用戶指定,開始與結束的段名須一致;(2) SEGMENT/ ENDS偽指令把程序分成若干邏輯段;(3) 刪節號為段體,段體內為指令和偽指令序列。華中科技大學出版社2. 假定偽指令ASSUME 假定偽指令主要用于指示匯編程序哪些段是當前段以及這些段與段寄存器之間的對應關系。格式:ASSUME 段寄存器名:段名,段寄存器名:段名, 其中,段名是指用SEGMENT/ ENDS語句已定義的段名,也可以
39、是表達式“SEG 變量或標號”,或者是關鍵字NOTHING;段寄存器名可為CS、DS、SS、ES之一。 功能:該語句一般出現在代碼段中,用來設定段寄存器與段之間的對應關系,以便匯編程序知道段的結構和在執行各種指令時知道應訪問哪個段;也可用來取消段寄存器與段之間的對應關系(使用NOTHING時)。說明:華中科技大學出版社 (1) ASSUME偽指令設置在代碼段內,第一個ASSUME語句一般放在段定義語句之后,是說明性語句; (2) 在一個代碼段中,如果沒有另外的ASSUME偽指令重新設置,則原有ASSUME語句的設置一直有效; (3) 不在當前段中的變量和數據存儲單元均是不可訪問的,否則,會在匯
40、編時產生錯誤或運行時造成混亂,產生邏輯上的錯誤,得出錯誤結果。 (4) ASSUME偽指令不產生任何目標代碼,僅僅是告訴匯編程序,哪些段是當前段,而且分別與哪個段寄存器相聯系。華中科技大學出版社 (5) 匯編程序不能檢查在程序運行期間段寄存器內容是否與上述ASSUME語句的設置一致。如果在程序中間用ASSUME語句重建了DS或ES與某段的關系時,就一定要緊跟著將這個新段首地址送入DS或ES中,否則,會因段寄存器的內容未更改而使得后面數據的讀寫仍在原來的數據段中進行,這樣的錯誤,系統是檢查不出來的,即出現邏輯錯誤。 華中科技大學出版社 (6) 宏匯編MASM利用ASSUME給出的信息產生正確的目
41、標代碼。在翻譯過程中,根據ASSUME偽指令產生段寄存器段名對應表,以后根據此表決定在相應指令的代碼之前是否產生段超越前綴。如果某段對應的段寄存器與該指令的默認段寄存器一致,則直接產生機器代碼,否則就產生段超越前綴。因此,每一個匯編源程序必須使用ASSUME偽指令。但ASSUME偽指令并不實際給段寄存器賦值,必須在程序中用指令的實際操作來給段寄存器賦值,例如:MOV AX, DATAMOV DS, AX 這樣的語句才給DS裝入了一個實際的段基址。華中科技大學出版社4.4.4 過程定義偽指令 匯編語言中的子程序是以過程的形式出現的,子程序的調用,即過程的調用。定義過程的格式為過程名 PROC N
42、EAR/FAR 過程中的語句序列 RET 過程中的語句序列過程名 ENDP 其中,過程名由編程者任取;NEAR(默認值)或FAR是過程的類型,當為NEAR型時,可以不寫;RET為過程返回主程序的出口語句。盡管源程序語序中RET的位置可放中間或結尾,但每一個過程最后執行的語句應為RET,否則會出錯。 過程定義偽指令PROC和ENDP必須成對出現,以定義一個完整的過程。華中科技大學出版社4.4.5 宏處理偽操作1宏指令的定義 編程者可以將一組語句用宏指令定義成一條宏指令:宏指令名 MACRO, ;宏體 ENDM 其中宏指令名由編程者自取;形式參數意義同高級語言一樣,在調用宏指令時用實在參數來代替。
43、宏指令也可以不設參數。華中科技大學出版社2宏指令的使用宏調用 經定義的宏指令,可以在程序中像其他指令一樣直接使用。對于出現在程序中的宏指令,匯編程序在翻譯時,按照其定義逐條還原為宏體中的語句。 使用宏指令時,需要將形式參數用一一對應的實在參數代替。當實在參數的個數多于形式參時,忽略多余的實在參數;當實在參數的個數少于形式參數時,多余的形式參數設為空白,這是匯編語言的規定。 宏指令中的參數可以是常數、寄存器名、存儲單元名、地址表達式以及指令的助記符或助記符的一部分。華中科技大學出版社3. 取消宏指令偽指令PURGE 宏指令一經定義,在整個程序中有效。若宏指令名與指令或偽指令助記符相同,則宏指令優
44、先級更高,使同名指令或偽指令失效。在一般情況下,均不使用指令及偽指令助記符作為宏指令名,若出現了這種情況,也應在一定時候取消宏指令,使失效的指令或偽指令助記符恢復功能。取消宏指令偽指令PURGE格式如下:PURGE , 其中,宏指令名1、宏指令名2等是需要被取消的宏指令名。執行此偽指令后,這些宏指令便失效,不能再被調用了。華中科技大學出版社4. 定義局部標號偽指令LOCAL 在定義宏指令時,宏體中有可能出現標號。當宏指令在程序中多次被調用時,這些標號便會在多處出現,匯編程序將指出“標號重復定義”的錯誤。為避免這一錯誤,可以用LOCAL偽指令將宏體中的標號定義為局部標號,當多次調用宏指令時,匯編
45、程序在展開還原宏指令時,將用“?0000?FF”的編號來代替這些局部標號。LCOAL偽指令的格式為LCOAL 標號1,標號2,下面的例題,說明LOCAL的使用。華中科技大學出版社5. 宏指令應用舉例 下面用一簡單例子,來說明宏指令的定義及調用過程。【例4.17】 將對某一寄存器的移位操作定義為一個宏指令,并在程序中使用它。 完成移位操作的宏指令可以靈活地設置一個或多個參數,或不設參數。下面給出幾種定義方式:(1) 不設參數。SHIFTMACROMOV CL,4SHL AX,CLENDM宏指令SHIFT將AX左移4次。華中科技大學出版社(2) 設一個參數,將移位次數設為參數CN。SHIFT MA
46、CRO CNMOV CL,CNSHL AX,CLENDM則SHIFT5 ;將AX左移5次SHIFT4 ;將AX左移4次 用實在參數5和4替代形式參數CN,完成CN次移位。華中科技大學出版社(3) 設兩個參數,將被移位的寄存器和移位次數都設為可替代的參數。SHIFT MACRO CN,R MOV CL,CN SHL R,CL ENDM則:SHIFT 4,AX;將AX左移4次SHIFT 2,BX;將BX左移2次SHIFT 5,DH;將DH左移5次華中科技大學出版社(4) 設三個參數,將移位方向,被移位的對象及以為次數均設為參數。SHIFT MACRO CN,R,SD MOV CL,CN S&SD
47、R,CL ENDM當參數為助記符的一部分時,用&將參數標注出來,以便替換。則SHIFT 4,AX,HL;將AX左移4次SHIFT 7,BX,HR;將BX右移7次華中科技大學出版社 下面的程序說明如何在一個完整的程序中使用宏指令,源程序如下:SHITF MACRO R,CN MOV CL,CN SHL R,CL ENDMDATA SEGMENTX DB 08HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA華中科技大學出版社MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV BX
48、,OFFSET X MOV AL,BX SHIFT AL,4 RETMAIN ENDPCODE ENDS END MAIN華中科技大學出版社4.4.6 其他偽操作程序計數器$和ORG偽指令1. 程序計數器$ 當字符$獨立出現在表達式中時,它的值為程序下一個所能分配的存儲單元的偏移地址。例如:DATA SEGMENTA1 DB 10H,20H,30H;定義3個字節C EQU $A1 ;符號C與表達式$A1等價DATA ENDS 其中表達式 $A1的值為程序下一個所等分配的偏移地址03H減去A1的偏移地址00H,所以,$A1=03H00H=03H。華中科技大學出版社2. ORG偽指令 ORG偽指令
49、用來指定某條語句或某個變量偏移地址。格式為 ORG 數值表達式 ORG后的數值表達式的值將作為下一條指令語句或變量的偏移地址,例如:DATA SEGMENT ORG 2VAR1 DB 2,3,4 ORG $+3VAR2 DW 1234HDATA ENDS 則VAR1和VAR2在存儲器中的分布情況如圖4.3所示。 以上介紹了一些常用偽指令。8086/8088宏匯編還有諸如GROUP、TITLE、PAGE、RAGE、SUBTTL、LIST、XLISL、PUBLIC和EXTFN等偽指令。華中科技大學出版社圖4.3 VAR1和VAR2在存儲器中的分布情況4.5 匯編語言程序設計華中科技大學出版社 本節
50、將介紹程序設計的一般過程,以及一些基本的匯編程序設計方法。匯編語言程序設計步驟歸納如下:1.分析問題2.建立數學模型3.確定算法4.繪制流程圖5.內存空間分配6.編制程序7.程序調試華中科技大學出版社4.5.1 順序程序設計 直線運行程序,又叫順序程序。這種程序的形式最簡單,計算機執行程序的方式是指令逐條依次被執行,不進行判斷和跳轉,直到程序結束。實現直線運行結構程序的指令有數據傳送類、算術運算類、邏輯移位類等。因此,直線運行結構程序只能完成簡單的功能,例如計算表達式的值、順序查表等。【例4.18】 編程計算Z=(x*x3*y)/ 2。設x、y為單字節正整數,結果Z用兩個字節來存放。華中科技大
51、學出版社圖4.4 例4.18 程序流程圖華中科技大學出版社分析:本題采用順序結構,程序框圖如圖4.4所示。源程序如下:DATA SEGMENTX DB 25Y DB 32Z DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAEXPRE PROC FARSTART: PUSH DS ;保護返回地址 SUB AX,AX PUSH AX華中科技大學出版社 MOV AX,DATA ;初始化DS MOV DS,AX MOV AL,X MUL AL ;X2 MOV BL,Y ADDBL,BL ADD BL,Y ;3Y SUB AX,BX ;X23Y SHR AX
52、,1 ;(X23Y)/ 2 MOV Z,AX ;存結果 RET ;返回DOSEXPRE ENDPCODE ENDS END STATR ;匯編結束華中科技大學出版社4.5.2 分支程序設計 分支程序就是根據不同的情況或條件執行不同功能的程序,它具有判斷和轉移功能,在程序中利用條件轉移指令對運算結果的狀態標志進行判斷,以實現轉移功能。匯編語言中實現分支的要素有兩個: (1) 使用能影響狀態標志的指令,如算術邏輯指令、移位指令和位測試指令等,將狀態標志設置為能正確反映條件成立與否的狀態。 (2) 使用條件轉移指令,對狀態位進行測試判斷,確定程序如何轉移,形成分支。分支程序可以有簡單分支結構和多分支
53、結構兩種形式。華中科技大學出版社簡單分支結構 (b) 多分支結構簡單分支和多分支結構的流程圖華中科技大學出版社1. 簡單分支程序設計 簡單分支程序根據條件是否滿足將程序分為兩個分支,按不同條件做出相應處理。這種程序常采用比較和測試的方法,在標志寄存器中設置相應的標志位,然后再選用適當的條件轉移指令,以實現不同情況的分支轉移。2. 多分支程序設計 在程序設計中,有時要求對多個條件同時進行判斷,這樣就可能對多個分支進行處理。連續使用兩條條件轉移指令就可以實現3路分支,依次類推,可完成多路分支。華中科技大學出版社圖4.5 例4.19 的流程圖華中科技大學出版社【例4.19】 編程計算下列函數的值:
54、1(X0) Y= 0(X=0) 1 (X0)X取值范圍:128127。 分析:這是一個3分支問題,用兩個條件轉移指令來實現。源程序框圖如圖4.5所示。源程序如下:DATA SEGMENTX DB 3Y DB DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATATHREE PROC NEARSTART: PUSH DS XOR AX,AX PUSH AX華中科技大學出版社 MOV AX,DATA MOV DS,AX MOVAL,X CMPAL,0 JGEBIGER MOV AL,0FFH ;X0,1送Y單元 JMP NEXTEQUL: MOVY,AL ;X=0
55、,0送Y單元NEXT: RETTHREE ENDPCODE ENDS ENDSTART華中科技大學出版社4.5.3 循環程序設計 在程序中,往往要求某一段程序重復執行多次,這時候就可以利用循環程序結構。這里把能按一定規律,多次重復執行的一串語句,叫作循環程序。 常用的循環控制方法有計數法、條件控制法等。華中科技大學出版社1) 計數控制法 對于循環次數已知的循環程序,一般采用計數法來控制循環。計數法又分為正計數法和倒計數法。正計數法計數器的初值設置為0,每執行一遍循環體,計數器的值加1,然后與已知的循環次數比較,若相等則跳出循環,否則繼續循環;倒計數法將計數器的初值設置為規定的循環次數每執行一遍
56、循環體,計數器的值減1,若計數器的值為0則跳出循環,否則繼續循環。在匯編語言程序設計中常采用CX寄存器作為循環計數器。華中科技大學出版社2) 條件控制法如果循環次數事先無法確定,但與問題的某些條件有關。這些條件通過指令來測試。若測試比較的結果表明滿足循環條件,則繼續循環;否則結束循環。【例4.20】 存儲器數據段存放了100個帶符號數,其首地址為AREA,要求將各數據取絕對值后再送存原來的存儲單元。華中科技大學出版社程序段如下:LEA SI,AREA;SI源地址MOV CX,100;CX循環次數CHECK:MOV AL,SI;取一個帶符號數送ALOR AL,AL;AL內容不變,但影響標志位JN
57、S NEXT;若SF=0,則轉NEXTNEG AL;否則求補MOV SI,AL;負數求補后送回NEXT:INC SI;源地址加1DEC CX;循環次數減1JNZ CHECK;循環次數不為0,轉向CHECKHLT;停止華中科技大學出版社【例4.21】 從頭搜索字符串的結束標志,統計搜索的字符個數。源程序如下:DATASEGMENTSTRINGDBABCDUVWXYZ, 0DHLLDB?CREQU0DHDATAENDSSTACKSEGMENT DB50 DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK STARTPRO
58、CFARBEGIN:PUSH DSMOVAX,0華中科技大學出版社PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEADI,STRING ;設串的地址指針MOVDL,0 ;置串長度初值為0MOVAL,CR ;串結束標志ALAGAIN: SCASB;搜索串JEDONE ;找到結束標志,停止INCDL ;串長度加1JMPAGAINDONE:LEABX,LLMOV BX,DLRETSTARTENDPCODEENDSEND BEGIN 華中科技大學出版社4.5.4 子程序設計 子程序不是一種基本的程序結構,但合理使用子程序是實現模塊化程序設計的重要技巧。子程序通常用于完成一些常用的、
59、需不規則重復進行的操作。編寫好的子程序可構成一個子程序庫,需要時用CALL語句調用即可。華中科技大學出版社圖4.8 子過程嵌套調用示意圖在設計子過程時應仔細考慮如何實現參數傳遞、現場保護及恢復等問題。華中科技大學出版社1參數傳遞 主過程和子過程常常需要交換數據,如:主過程可能需要向子過程傳送處理信息(入口參數),子過程也可能需要向主過程返回處理結果(出口參數)。主過程和子過程之間的參數傳遞通常可以采用以下3種方式之一:(1)使用約定寄存器傳遞參數(2)使用約定存儲單元傳遞參數(3)使用堆棧傳遞參數華中科技大學出版社2現場保護與恢復 這里所說的現場,是指主過程轉向子過程執行時主過程的狀態,主要包
60、括當時的標志寄存器、段寄存器、通用寄存器以及指令指針的內容。 把主過程中各有關參數都備份到堆棧中以后,子程序就可以隨意使用CPU資源了。華中科技大學出版社【例4.22】編寫一個軟件延時子程序SDELAY。該程序具有雙重循環結構:內循環完成約10ms的延時,外循環完成約(DL)*10ms的總延時。源程序如下:SDELAY PROC FARDEL1:MOV CX,2806 ;該指令花費4個時鐘周期DEL2:LOOP DEL2 ;該指令花費175個時鐘周期DEC DL ;該指令花費3個時鐘周期JNZ DEL1 ;該指令花費164個時鐘周期RET ;該指令花費32個時鐘周期SDELAY ENDP華中科
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025臨時用工合同范本
- 農村田地買合同樣本
- 2025蘇州市房屋租賃合同
- 好的畢業設計答辯實施框架
- 2025個體工商戶勞動合同模板
- 農村購房無證合同范例
- 2025版權協議授權播放合同
- 《保險法(第二版)》課件第12章
- 農村土地合作社合同范例
- 2025年信息技術與軟件工程考試題及答案
- 家用掃地機器人機械結構設計
- (高清版)JTGT 5440-2018 公路隧道加固技術規范
- 職場C位指南-大學生職業素養養成智慧樹知到期末考試答案章節答案2024年云南林業職業技術學院
- 2.6高壓電力電容器運行與維護
- 美學與人生智慧樹知到期末考試答案2024年
- GB/T 3953-2024電工圓銅線
- 碘缺乏病知識宣傳課件
- 曙光醫院網上查報告
- (附加條款版)醫院勞務合同書
- GA/T 1093-2023安全防范人臉識別應用出入口控制人臉識別技術要求
- 港口危貨作業單位主要安全管理人員試題及答案(536道)
評論
0/150
提交評論