




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 匯編語(yǔ)言程序設(shè)計(jì),主要內(nèi)容:,基本概念,匯編程序的格式和基本語(yǔ)法,偽操作命令和宏指令,DOS和BIOS調(diào)用,匯編語(yǔ)言程序設(shè)計(jì),程序:為解決某一具體問(wèn)題或?yàn)檫_(dá)到某些目的,將指令和數(shù) 據(jù)編寫(xiě)成一個(gè)相互聯(lián)系的序列,稱(chēng)之為程序。 機(jī)器語(yǔ)言(Machine Language):計(jì)算機(jī)能直接理解和執(zhí)行的 語(yǔ)言,是直接采用二進(jìn)制代碼表示的程序設(shè)計(jì)語(yǔ)言。 匯編語(yǔ)言(Assembly Language):是一種采用助記符表示的 程序設(shè)計(jì)語(yǔ)言,即用助記符來(lái)表示指令的操作碼和操 作數(shù),用標(biāo)號(hào)或符號(hào)表示地址、常量或變量,是一種 面向機(jī)器的語(yǔ)言。,4.1 基本概念,用匯編語(yǔ)言編寫(xiě)的源程序在交付計(jì)算機(jī)執(zhí)行前,需要
2、翻譯成目標(biāo)程序,機(jī)器方能執(zhí)行。這個(gè)翻譯過(guò)程稱(chēng)為匯編,完成匯編任務(wù)的程序稱(chēng)為匯編程序,如下圖所示。,匯編程序是最早也是最成熟的一種系統(tǒng)軟件。它除了能夠?qū)R編語(yǔ)言源程序翻譯成機(jī)器語(yǔ)言程序這一主要功能外,還有如下功能:,1. 能夠根據(jù)用戶的要求自動(dòng)分配存儲(chǔ)區(qū)域(包括程序區(qū)、數(shù) 據(jù)區(qū)和暫存區(qū)等); 2. 可以自動(dòng)地把各種進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),把字符轉(zhuǎn)換成 ASCII碼,計(jì)算表達(dá)式的值等; 3. 可以自動(dòng)對(duì)源程序進(jìn)行檢查,給出錯(cuò)誤信息(如非法格式 、未定義的助記符、標(biāo)號(hào)、漏掉的操作數(shù)等); 4. 允許在源程序中把一個(gè)指令序列定義為一條宏指令(即自 定義語(yǔ)句); 5. 具有結(jié)構(gòu)和記錄等高級(jí)匯編語(yǔ)言功能。,
3、高級(jí)語(yǔ)言(High Level Language):如:BASIC語(yǔ)言 、FORTRAN語(yǔ)言、C語(yǔ)言、PASCAL語(yǔ)言等。,4.2 匯編程序的格式和基本語(yǔ)法,示例:編程實(shí)現(xiàn)多字節(jié)加法,如:S=3B74AC60F8H+20D59E36C1H,CODE SEGMENT ;代碼段定義 ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX ;初始化段寄存器 MOV CX, 5 MOV SI, 0 CLC ;清進(jìn)位標(biāo)志 LOOPER:MOV AL, DATA2SI ADC DATA1SI,AL INC SI DEC CX JNZ LOOPER MOV
4、 AH, 4CH ;程序運(yùn)行結(jié)束,返回DOS狀態(tài) INT 21H CODE ENDS,END START ;整個(gè)源程序匯編結(jié)束,DATA SEGMENT ;數(shù)據(jù)段定義 DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATA ENDS,data segment message db Hello World!,$ data ends code segment assume cs:code,ds:data begin:mov ax,data mov ds,ax mov dx,offset message m
5、ov ah,9 ;待顯示的字符串符號(hào)(ASCII碼),定義DS段且以“$”字符結(jié)束, ;把段地址放入DS中,偏移地址放入DX中,利用9號(hào)功能鍵,可以把字符串顯示;在屏幕上。 int 21h mov ah,4ch; int 21h code ends end begin,匯編語(yǔ)言源程序采用分段結(jié)構(gòu),即一個(gè)匯編語(yǔ)言源程序由若干段組成(一般由數(shù)據(jù)段和代碼段組成),每一個(gè)段以SEGMENT語(yǔ)句開(kāi)始,以ENDS語(yǔ)句結(jié)束,整個(gè)程序的結(jié)尾是END語(yǔ)句。在代碼段中下面的內(nèi)容是不可缺少的: (1)定義段(使用SEGMENT/ENDS語(yǔ)句定義) (2)約定段寄存器和段的關(guān)系(即明確段與段寄存器的關(guān)系,使用一個(gè)或多
6、個(gè)ASSUME語(yǔ)句實(shí)現(xiàn)) (3)裝填段寄存器(只裝填數(shù)據(jù)型段寄存器) (4)設(shè)置返回DOS的方法,一、匯編語(yǔ)言程序的分段結(jié)構(gòu),例如: MYDATA SEGMENT; 定義數(shù)據(jù)段起始語(yǔ)句 ; 定義數(shù)據(jù) MYDATA ENDS; 定義數(shù)據(jù)段終止語(yǔ)句 MYCODE SEGMENT ; 定義代碼段起始語(yǔ)句 ASSUME CS:MYCODE,DS:MYDATA;約定段寄存器和段的 ;關(guān)系 START: MOV AX,MYDATA; 裝填相應(yīng)的段寄存器 MOV DS,AX ; 完成所需功能的程序段 MOV AH,4CH; 設(shè)置返回DOS INT 21H MYCODE ENDS; 定義代碼段終止語(yǔ)句 END
7、 START; 程序結(jié)束,1.語(yǔ)句分類(lèi) 指令性語(yǔ)句:也稱(chēng)指令語(yǔ)句,指8086的指令系統(tǒng),匯編后產(chǎn)生目標(biāo)代碼。 標(biāo)號(hào) 操作碼/助記符 操作數(shù) ;注釋區(qū) 指示性語(yǔ)句:包括偽操作命令和偽操作符,也稱(chēng)偽指令語(yǔ)句,告訴匯編程序如何匯編,匯編后不產(chǎn)生目標(biāo)代碼。 符號(hào)名 定義符 參數(shù)1,參數(shù)2,,參數(shù)n ;注釋區(qū) 宏指令語(yǔ)句:以某個(gè)宏指令名定義一段指令序列,在程序中用一條宏指令語(yǔ)句代替一段程序。凡是有宏指令的程序,在匯編時(shí),用相應(yīng)的目標(biāo)代碼序列代替,插入到對(duì)應(yīng)的程序中,不展開(kāi)時(shí)不產(chǎn)生目標(biāo)代碼。,二、匯編語(yǔ)言語(yǔ)句的類(lèi)型和格式,2.語(yǔ)句格式 匯編語(yǔ)言是由一條條的語(yǔ)句組成的,語(yǔ)句格式如下: 名字 助記符 操作數(shù)
8、;注釋 其中帶方括號(hào)的部分為任選項(xiàng),可以有,也可以沒(méi)有。 (1)名字 “名字”是語(yǔ)句的符號(hào)地址,對(duì)于指令語(yǔ)句,“名字”稱(chēng)為標(biāo)號(hào),其后必須加冒號(hào)“:”;對(duì)于偽指令語(yǔ)句,“名字”可以是變量名、段名、過(guò)程名等,其后不能加冒號(hào)“:”。 “名字”一般都有三個(gè)屬性:段屬性、偏移屬性和類(lèi)型屬性。 段屬性:表示“名字”所在段的起始地址(即段地址)。 偏移屬性:表示“名字”所在段的起始地址到定義該“名字”的地址之間的字節(jié)數(shù)(即偏移量)。偏移量是一個(gè)16位無(wú)符號(hào)數(shù)。,類(lèi)型屬性:表示名字的數(shù)據(jù)或地址的類(lèi)型。 對(duì)于標(biāo)號(hào)和過(guò)程名:類(lèi)型屬性有NEAR和FAR兩種,表示只能在段內(nèi)被引用還是可以在其它段被引用; 對(duì)于變量:類(lèi)
9、型屬性有BYTE(字節(jié))、WORD(字)、DWORD(雙字)、QWORD(四字)、TBYTE(10個(gè)字節(jié))等,表示數(shù)據(jù)區(qū)中所存取的操作數(shù)的大小。 對(duì)于段名:只有段屬性,表示段的起始地址(段地址),沒(méi)有偏移屬性和類(lèi)型屬性。,(2)助記符 指系統(tǒng)提供的有關(guān)指令的助記符。在指令語(yǔ)句中,表示該指令語(yǔ)句的操作碼,在偽指令語(yǔ)句中稱(chēng)為定義符,它們指出語(yǔ)句的功能。 (3)操作數(shù) 操作數(shù)即為操作的對(duì)象。在指令語(yǔ)句中,可能有單操作數(shù)、雙操作數(shù),也可能無(wú)操作數(shù)或隱含操作數(shù);而在偽指令中可能有更多個(gè)操作數(shù)。當(dāng)操作數(shù)有多個(gè)時(shí),要用逗號(hào)隔開(kāi)。 可以作為操作數(shù)的有:常量、寄存器、標(biāo)號(hào)、變量和表達(dá)式等。 (4)注釋 以“;”
10、開(kāi)始,是對(duì)匯編語(yǔ)句的功能或匯編程序的說(shuō)明。,第三節(jié) 匯編語(yǔ)言運(yùn)算符,匯編語(yǔ)言運(yùn)算符:是編譯程序在編譯時(shí)計(jì)算的,與運(yùn)算指令不同,指令是在程序運(yùn)行時(shí)計(jì)算的。 一、算術(shù)運(yùn)算符 ,*, / , MOD , SHL , SHR MOV AX, A+B 二、邏輯運(yùn)算符 AND, OR, XOR, NOT C EQU B-A AND AX, C AND OFH,三、關(guān)系運(yùn)算符 EQ、NE、LT、GT、LE、GE運(yùn)算符分別實(shí)現(xiàn)等于、不等于、小于、大于、小于等于、大于等于運(yùn)算。 由關(guān)系運(yùn)算符連接兩個(gè)操作數(shù)構(gòu)成關(guān)系表達(dá)式,其值為邏輯值。當(dāng)關(guān)系表達(dá)式成立時(shí),其值為真,關(guān)系值為0FFFFH;關(guān)系表達(dá)式不成立時(shí),其值為
11、假,關(guān)系值為0。 示例:MOV AX,PORT LT 5 當(dāng)PORT5時(shí),匯編成:MOV AX,0 示例:MOV BX,(PORT LT 5) AND 20H) OR (PORT GE 5) AND 30H) 當(dāng)PORT5時(shí),匯編成:MOV AX,30H,注意: 算術(shù)運(yùn)算符總可以用于數(shù)字操作,其結(jié)果也是數(shù)字的。當(dāng)應(yīng)用于存儲(chǔ)器操作數(shù)時(shí),只有+, -運(yùn)算符有意義; 邏輯運(yùn)算符的操作數(shù)也必須是數(shù)字,存儲(chǔ)器操作數(shù)不能進(jìn)行邏輯運(yùn)算; 關(guān)系運(yùn)算符連接的兩個(gè)操作數(shù),必須都是數(shù)字的或是在同一段內(nèi)的存儲(chǔ)器地址。,四、值返回符 1) $運(yùn)算符 $:當(dāng)前地址偏移量的值,BLOCK DB HELLO! NUM EQU
12、 $-BLOCK,;NUM為 6,STR1 DW AB STR2 DB 16 DUP(?) CNT EQU $-STR1 MOV CX, CNT MOV AX, STR1 HLT,; CX為 18,; AX為4142H,STR1 DW 4142H,STR1 DB 41H, 42H,DATA SEGMENT NA EQU 15 NB EQU 10 NC DB 2 DUP(4, 2 DUP(5, 2) CNT DB $-NC CWT DW $-CNT ND DW NC DATA ENDS,設(shè)數(shù)據(jù)段定義如下:,從DS:0000H開(kāi)始至CNT單元之前存放的數(shù)據(jù)依次為:_;ND單元中的值為_(kāi);CWT單元
13、中的值為_(kāi); CNT單元中的值為_(kāi)。,4,5,2,5,2,4,5,2,5,2,0000H,1,0AH,SEG 和OFFSET SEG: 求標(biāo)號(hào)或變量的段基址 OFFSET: 求標(biāo)號(hào)或變量的距段首址的偏移量,DATA SEGMENT A DB 12 B DW 23, 25 DATA ENDS MOV BX, OFFSET B MOV AX, SEG B LEA BX, B,; BX: 0001H,; AX: DS值,; BX: 0001H ;與 MOV BX, OFFSET B,DATA SEGMENT TABLE DW 10, 20, 30, 40, 50 ENTRY DW 3 DATA EN
14、DS MOV BX, OFFSET TABLE ADD BX, ENTRY MOV AX, BX,;0000H,;BX: 3,;AX: 1E00H,注意以下兩個(gè)語(yǔ)句 B DB 5 DUP(2, 3 DUP(0) ; B DW 5 DUP(2, 3 DUP(0) ;,3) TYPE 標(biāo)號(hào)或符號(hào)的類(lèi)型值 對(duì)變量 :表示變量的字節(jié)數(shù) DB 1, DW 2, DD 4 對(duì)標(biāo)號(hào):表示過(guò)程或指令地址的調(diào)用類(lèi)型(NEAR) -1或(FAR) -2,DATA SEGMENT A DB 12 B DW 23, 25 DATA ENDS MOV AX, TYPE A MOV BX, TYPE B,;AX: 000
15、1H,;BX: 0002H,4) LENGTH 和 SIZE,LENGTH: 對(duì)DUP情況下, 變量的項(xiàng)數(shù)或元素個(gè)數(shù), 在其他情況下該項(xiàng)屬性為1; SIZE:對(duì)操作數(shù)分配的字節(jié)數(shù)。 SIZE=LENGTH TYPE,A DB 1234 B DW 5 DUP(2, 3 DUP(0) ; C DW AB, C, D L1: MOV AL, TYPE B MOV BL, LENGTH B MOV AH, SIZE A MOV BH, SIZE C MOV CL, TYPE L1 MOV CH, SIZE B,; AL: 2,; BL: 5,; AH: 1,; BH: 2,; L1為標(biāo)號(hào) CL: 0F
16、FH,; CH: 0AH,對(duì)于下面的數(shù)據(jù)定義,各條MOV指令單獨(dú)執(zhí)行后,請(qǐng)?zhí)畛溆嘘P(guān)寄存器的內(nèi)容:,TABLE1 DB ? TABLE2 DW 20 DUP(?) TABLE3 DB ABCD MOV AX, TYPE TABLE1 MOV BX, TYPE TABLE2 MOV CX, LENGTH TABLE2 MOV DX, SIZE TABLE2 MOV SI, LENGTH TABLE3,; AX: 1,; BX: 2,; CX: 20,; DX: 40,; SI: 1,5) HIGH 和LOW,HIGH: 對(duì)操作數(shù)取高字節(jié); LOW: 對(duì)操作數(shù)取低字節(jié)。,NUM EQU 0CDEFH
17、 MOV AH, HIGH NUM MOV AL, LOW NUM,; AH: 0CDH,; AL: 0EFH,五、屬性運(yùn)算符,用來(lái)給指令中的操作數(shù)指定一個(gè)臨時(shí)的屬性,而暫時(shí)忽略操作數(shù)定義時(shí)的屬性。,1) PTR 定義操作數(shù)為新的類(lèi)型,新類(lèi)型 PTR 操作數(shù),操作數(shù)可以是存儲(chǔ)器的地址或標(biāo)號(hào)名,F1 DW 1234H F2 DB 23H, 56H, 18H MOV AL, BYTE PTR F1 MOV AX, WORD PTR F2,; AL: 34H,; AX: 5623H,DAT1 DB 12H, 34H DAT2 DB 56H, 78H MOV AX, WORD PTR DAT1 ; A
18、X: 3412H CMP AX, WORD PTR DAT2 ; 7856H JA L1 MOV BX, WORD PTR DAT2; BX:5678H MOV WORD PTR DAT2, AX; MOV WORD PTR DAT1, BX L1: HLT,DAT2單元的值是:_,56H,DAT1單元的值是:12H,2) THIS 指定新類(lèi)型,像PTR一樣可用來(lái)建立一個(gè)特殊類(lèi)型的存儲(chǔ)器地址操作數(shù),而沒(méi)有為它分配存儲(chǔ)器。新的存儲(chǔ)器操作數(shù)的段和偏移量部分就是下一個(gè)能分配的存儲(chǔ)單元的段和偏移量。,F1 EQU THIS BYTE F2 DW 4321H, 2255H MOV AL, F1 MOV
19、AX, F2,THIS 類(lèi)型名,F1,; AL: 21H,; AX: 4321H,F1和F2具有相同的段基地址和偏移地址,但類(lèi)型不同。,1.算術(shù)運(yùn)算符 、和MOD(取余,即兩個(gè)整數(shù)相除后取余數(shù))、SHR(右移)、SHL(左移)等。 例如:MOV AX,2*0101H MOV AX,STA+2 MOV AL,NUM SHL 1 ;將NUM左移1位再保存結(jié)果 2.邏輯運(yùn)算符 AND、OR、XOR、NOT運(yùn)算符分別實(shí)現(xiàn)邏輯與、或、異或、取反運(yùn)算。 例如:MOV AL,77H AND 84H ;AL=04H MOV AX,00FFH OR 1783H ;AX=17FFH MOV AH,NOT 0FFH
20、 ;AH=00H,三、匯編語(yǔ)言中的運(yùn)算符,4.分析運(yùn)算符 SEG:返回一個(gè)變量或標(biāo)號(hào)所在段的段地址 OFFSET:取標(biāo)號(hào)或者變量在段內(nèi)的偏移地址 TYPE:返回一個(gè)變量或者標(biāo)號(hào)的類(lèi)型屬性值,示例:MOV SI,TYPE ARRAY MOV AH,TYPE TABL,變量的類(lèi)型屬性值,標(biāo)號(hào)的類(lèi)型屬性值,5.LENGTH運(yùn)算符 返回變量或結(jié)構(gòu)的數(shù)據(jù)區(qū)的數(shù)據(jù)總數(shù),只對(duì)DUP定義的變量才有意義,給出分配給變量的基本單位的數(shù)目(字節(jié)數(shù)、字?jǐn)?shù)或雙字?jǐn)?shù)),對(duì)于未使用DUP定義的變量則返回1。 格式: LENGTH 變量 例如:ARR DW 20 DUP(18H) DAT DB 12,25,AB . MOV
21、AL,LENGTH ARR ;AL-20 MOV AH,LENGTH DAT ;AH-1,6.SIZE運(yùn)算符 分配字節(jié)長(zhǎng)度操作符。若使用DUP操作符,則SIZE操作符返回得到分配給該變量數(shù)據(jù)區(qū)的字節(jié)總數(shù);若未使用DUP符號(hào),則返回值為T(mén)YPE運(yùn)算的結(jié)果。 格式: SIZE 變量 例如: TAB DW 100 DUP(?) TABLL1 DB 12H,34H . MOV AL,SIZE TABLL1 ;AL-1 MOV AH,SIZE TAB ;AH-200 MOV BL,LENGTH TAB ;BL-100 MOV BH,TYEP TAB ;BH-2 結(jié)論: SIZE=LENGTH*TYPE,
22、7.PTR運(yùn)算符 指定建立存儲(chǔ)器操作數(shù)的類(lèi)型屬性(一個(gè)變量或標(biāo)號(hào)) 格式: 類(lèi)型 PTR 表達(dá)式 注意:類(lèi)型可為:BYTE、WORD、DWORD、NEAR、FAR,表達(dá)式可為地址表達(dá)式或標(biāo)號(hào)。 例如: MOV AH,BYTE PTR VARWDI JMP DWORD PTR BX;段間間接轉(zhuǎn)移: CALL WORD PTR BXSI;子程序段內(nèi)調(diào)用指令 DATA1 DB 100 DUP(?) ;DATA1為字節(jié)類(lèi)型 DATA2 EQU WORD PTR DATA1 ;DATA2為字型變量 DATA3 EQU DWORD PTR DATA1 ;DATA3為雙字型變量,8.THIS指定屬性操作符
23、用以指定存儲(chǔ)器操作數(shù)或地址的類(lèi)型屬性。 格式: THIS 類(lèi)型 注意: (1)類(lèi)型可為:BYTE、WORD、DWORD、NEAR、FAR (2)該操作符對(duì)應(yīng)的語(yǔ)句放在DB、DW等偽指令前邊(或標(biāo)號(hào)定義的前邊),規(guī)定一個(gè)新變量(或新標(biāo)號(hào))的屬性,其段地址和偏移地址即為緊跟在后面用DB、DW定義(或標(biāo)號(hào)定義)的變量(或標(biāo)號(hào))的段地址和偏移地址。,(3)一般通過(guò)EQU偽指令為符號(hào)名賦予THIS指定的類(lèi)型。 例如: FIRST_BYTE EQU THIS BYTE WORD_TABLE DW 3275H,08ABH 以上定義結(jié)果:FIRST_BYTE為字節(jié)型變量,WORD_TABLE為字型變量,兩者的
24、段地址和偏移地址相同,但類(lèi)型屬性不同。對(duì)變量FIRST_BYTE只能字節(jié)訪問(wèn),對(duì)WORD_TABLE只能字訪問(wèn),9.其他操作符及運(yùn)算符 方括號(hào)對(duì)通常用以表示存儲(chǔ)單元的地址。 “:”段越符放在CS、DS、ES、SS后面,表示段超越。 例如:MOV AL,BX MOV DX,SI+5 MOV AX,ES:SI MOV AL,ES:BX,數(shù)據(jù)定義偽指令的作用是定義存儲(chǔ)變量的類(lèi)型,給存儲(chǔ)器賦初值,或者僅僅給變量分配存儲(chǔ)單元,而不賦予特定的值。常用的數(shù)據(jù)定義偽指令有:DB、DW、DD、DQ、DT等。數(shù)據(jù)定義偽指令的一般格式為: 變量名 偽指令 操作數(shù)1,操作數(shù)2,操作數(shù)n 方括號(hào)中的變量名為任選項(xiàng),變量
25、名后面不跟冒號(hào)。偽指令定義符后面的操作數(shù)可以不止一個(gè)。如有多個(gè)操作數(shù),互相之間應(yīng)該用逗號(hào)分開(kāi)。,一、數(shù)據(jù)定義偽指令,3.常量 指在指令中出現(xiàn)的固定值,可分為數(shù)值型常量和字符型常量?jī)深?lèi)。 (1)數(shù)值型常量 二進(jìn)制常量:由0和1組成的序列,后綴為B。 十六進(jìn)制常量:由0-9和A-F組成的數(shù)字序列,后綴為H,凡是以字母打頭的常量,必須在字母前面加0,否則會(huì)被編譯成地址。 十進(jìn)制常量:即十進(jìn)制數(shù),后綴為D(可省略)。 八進(jìn)制常量:即八進(jìn)制數(shù),后綴為Q。 (2)字符型常量 用單引號(hào)括起來(lái)的一個(gè)或多個(gè)字符(字符串)。,4.變量 是存儲(chǔ)器中某個(gè)數(shù)據(jù)區(qū)的名字,在指令中可以作為存儲(chǔ)器操作數(shù)。 5.表達(dá)式 使用運(yùn)
26、算符把常數(shù)、寄存器、標(biāo)號(hào)、變量等連接起來(lái)的運(yùn)算式??煞譃閿?shù)值表達(dá)式和地址表達(dá)式兩種。,一、常量、變量及標(biāo)識(shí)符,常量:二進(jìn)制(B),八進(jìn)制(Q),十六進(jìn)制(H), 十進(jìn)制(D)(默認(rèn)),100 01100100B 244Q 64H,變量:代表存放在某些存儲(chǔ)單元的數(shù)據(jù),這些數(shù)據(jù)在程序的運(yùn)行期間隨時(shí)可以修改。 在程序中以變量名的形式出現(xiàn)。,定義變量:給變量分配存儲(chǔ)單元, 為這個(gè)單元起名字(變量名), 可以同時(shí)將這些存儲(chǔ)單元預(yù)置初值。,每個(gè)變量都有三個(gè)屬性,段屬性(SEG) 變量所在的存儲(chǔ)單元的段基址 偏移量屬性(OFFSET) 變量所在的存儲(chǔ)單元距段起點(diǎn)的字節(jié)數(shù) 類(lèi)型屬性(TYPE) 一個(gè)單位變量占
27、用存儲(chǔ)單元的字節(jié)數(shù),分為: DB(1個(gè)字節(jié)) DW(2個(gè)字節(jié)) DD(4個(gè)字節(jié)),DATA SETMENT X DB 5, 4 Y DW 40H Z DD 2030H DATA ENDS,DS:0000H,X,Y,Z,X,Y,Z分別都有三個(gè)屬性: 段基址,偏移量,類(lèi)型值 這三個(gè)屬性都有固定的值。,標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字。 標(biāo)識(shí)符由下列字符組成: 字母: AZ, az; 數(shù)字: 09; 特殊字符: ? . _ $,數(shù)字不能作標(biāo)識(shí)符的第一個(gè)字符,. 必須作標(biāo)識(shí)符的第一個(gè)字符,標(biāo)識(shí)符最長(zhǎng)為31個(gè)字符。,標(biāo)識(shí)符后面跟冒號(hào)時(shí),表示標(biāo)號(hào),代表該行指令的起始地址, 標(biāo)號(hào)可以被轉(zhuǎn)移、調(diào)用指
28、令直接引用。 標(biāo)識(shí)符后面不帶冒號(hào)時(shí),表示變量。,標(biāo)號(hào):代碼段中某一條指令的地址。,標(biāo)號(hào)有3個(gè)屬性: 段屬性(SEG) 該條指令所在段的段基址 偏移量屬性(OFFSET) 該指令的偏移地址(距段起點(diǎn)的字節(jié)數(shù)) 距離屬性 表示該標(biāo)號(hào)是作為段內(nèi)還是段間被調(diào)用或轉(zhuǎn)移的,該屬性有兩個(gè)值: NEAR(FFFFH, -1): 本標(biāo)號(hào)只能被標(biāo)號(hào)所在段的轉(zhuǎn)移或調(diào)用指令所訪問(wèn)(段內(nèi)轉(zhuǎn)移),標(biāo)號(hào)后有冒號(hào); FAR (FFFEH, -2): 本標(biāo)號(hào)可被其他段(不是標(biāo)號(hào)所在段)的轉(zhuǎn)移或調(diào)用指令訪問(wèn)(段間轉(zhuǎn)移)。,標(biāo)號(hào)名 LABEL FAR,1定義字節(jié)命令DB(Define byte) DB定義的變量類(lèi)型為BYTE,給其
29、后的每個(gè)操作數(shù)分配1個(gè)字節(jié)。若操作數(shù)是字符串,必須用單引號(hào)括起來(lái),每個(gè)字符本身用其ASCII碼表示。 2定義字命令DW(Define word) DW定義的變量類(lèi)型為WORD。DW偽指令定義符后面的操作數(shù)每個(gè)占有1個(gè)字,即2個(gè)字節(jié)。在內(nèi)存中存放時(shí),低位字節(jié)在前,高位字節(jié)在后。 3定義雙字命令DD(Define double word) DD定義的變量類(lèi)型為DWORD。DD后面的操作數(shù)每個(gè)占有2個(gè)字,即4個(gè)字節(jié)。在內(nèi)存中存放時(shí),低位字在前,高位字在后。,4定義四個(gè)字的命令DQ(Define Quadword) DQ定義的變量類(lèi)型為QWORD,給其后的每個(gè)操作數(shù)分配4個(gè)字,即8個(gè)字節(jié)。在內(nèi)存中存放
30、時(shí),低位數(shù)據(jù)放低地址,高位數(shù)據(jù)放高地址。 5定義十個(gè)字節(jié)命令DT(Define Tenbytes) DT定義的變量類(lèi)型為T(mén)BYTE。DT偽指令定義符后面的操作數(shù)每個(gè)占有10個(gè)字節(jié)。在內(nèi)存中存放時(shí),低位字節(jié)在前,高位字節(jié)在后。 6重復(fù)定義偽操作命令DUP 當(dāng)操作數(shù)重復(fù)定義多次時(shí),可使用重復(fù)定義偽操作符“DUP”表示,其形式為: n DUP(初值,初值) ;n為重復(fù)定義的次數(shù),數(shù)據(jù)定義偽操作后面的操作數(shù)可以是常數(shù)、表達(dá)式或字符串,但每項(xiàng)操作數(shù)的值不能超過(guò)由偽指令定義符所定義的數(shù)據(jù)類(lèi)型限定的范圍。字符串必須放在單引號(hào)中。 除了常數(shù)、表達(dá)式和字符串外,問(wèn)號(hào)“?”也可以作為數(shù)據(jù)定義偽指令的操作數(shù),此時(shí)僅
31、給變量保留相應(yīng)的存儲(chǔ)單元,而不賦與變量某個(gè)確定的初值。,例: 畫(huà)圖說(shuō)明下列偽指令所定義的數(shù)據(jù)在內(nèi)存中的存放形式。 ARV1 DB 3+4,43H,-2 ARV2 DW 474FH,1,? COUNT EQU 2;EQU定義的是常量,不占用內(nèi)存單元 ARV3 DB 2 DUP(1,COUNT DUP(2) ARV4 DD ARV3;定義為ARV3 32位的地址,低位字存放的是AVR3的偏移地址,高位字存放的是AVR3的段地址 ARV5 DB AB;此語(yǔ)句等價(jià)于 ARV5 DB A,B; 字符串只能用DB,DW偽操作指令定義,若字符串的個(gè)數(shù)超過(guò)兩個(gè),只能用DB來(lái)定義。字符串必須用括起來(lái),操作數(shù)中?
32、號(hào),只能表明預(yù)留出一定的存儲(chǔ)單元數(shù)量,在匯編時(shí)不能寫(xiě)入任何數(shù)據(jù)。 ARV6 DW AB 解:假設(shè)此數(shù)據(jù)段的段地址為1234H,即DS1234H,則有存儲(chǔ)器分配圖如右邊:,符號(hào)定義偽指令的用途是給一個(gè)符號(hào)重新命名,或定義新的類(lèi)型屬性等。符號(hào)名包括匯編語(yǔ)言的變量名、標(biāo)號(hào)名、過(guò)程名、寄存器名以及指令助記符等。 常用的符號(hào)定義偽指令有:EQU、(等號(hào))和LABLE 1. EQU 格式如下:符號(hào)名 EQU 表達(dá)式 EQU偽指令將表達(dá)式的值賦予一個(gè)符號(hào)名,以后可用這個(gè)符號(hào)名來(lái)代替表達(dá)式。格式中的表達(dá)式可以是一個(gè)常量、變量、標(biāo)號(hào)、數(shù)值表達(dá)式或地址表達(dá)式等。例如:,二、符號(hào)定義偽指令,CR EQU 0DH ;
33、 常數(shù) LF EQU 0AH A EQU ASCII-TABLE ; 變量 STR EQU 64*1024 ; 數(shù)值表達(dá)式 ADR EQU ES:BP+DI+5 ; 地址表達(dá)式 CBD EQU AAM ; 指令助記符 DAT1 EQU WORD PTR DAT DAT2 EQU DWORD PTR DAT 利用EQU偽指令,可以用一個(gè)名字代表一個(gè)數(shù)值, 或用一個(gè)較簡(jiǎn)短的名字來(lái)代替一個(gè)較長(zhǎng)的名字。 注意:EQU偽指令不允許對(duì)同一符號(hào)重復(fù)定義。,2. (等號(hào)) 格式如下:符號(hào)名表達(dá)式 “”(等號(hào))偽指令的功能與EQU偽指令基本相同,主要區(qū)別在于它可以對(duì)同一個(gè)名字重復(fù)定義。例如: COUNT1 EQ
34、U 20H COUNT=10 MOV CX, COUNT ;(CX)10 COUNT=COUNT-1 MOV BX, COUNT ;(BX)9 ,3. LABEL LABEL偽指令的用途是定義標(biāo)號(hào)或變量的類(lèi)型,格式如下: 名字 LABEL 類(lèi)型 變量的類(lèi)型可以是BYTE、WORD、DWORD。標(biāo)號(hào)的類(lèi)型可以是NEAR或FAR。利用LABEL偽指令可以使同一個(gè)數(shù)據(jù)區(qū)兼有BYTE和WORD兩種屬性,這樣在以后的程序中可根據(jù)不同的需要分別以字節(jié)為單位,或以字為單位存取其中的數(shù)據(jù)。例如:,AREAW LABEL WORD ; 變量AREAW類(lèi)型為WORD AREAB DB 100 DUP(?) ; 變
35、量AREAB類(lèi)型為BYTE MOV AREAW, AX ; AX送兩個(gè)單元中 MOV AREAB49, AL ; AL送一個(gè)單元中 LABEL偽指令也可以將一個(gè)屬性已經(jīng)定義為NEAR,或者后面跟有冒號(hào)的標(biāo)號(hào)(隱含屬性為NEAR)再定義為FAR。例如: AGAINF LABEL FAR ; 定義標(biāo)號(hào)AGAINF的屬性為FAR AGAIN: PUSH AX ; 標(biāo)號(hào)AHAIN的屬性為NEAR 上面的過(guò)程既可以用標(biāo)號(hào)AGAIN在本段內(nèi)被調(diào)用,也可以利用標(biāo)號(hào)AGAINF被其他段調(diào)用。,一、段定義,一般的源程序分為4個(gè)段:代碼段Code、數(shù)據(jù)段Data、堆棧段Stack、附加段Extra。 各個(gè)段從段定
36、義語(yǔ)句開(kāi)始,到段結(jié)束語(yǔ)句ENDS結(jié)束。,段名 SEGMENT 定位類(lèi)型 組合類(lèi)型 類(lèi)別, 段體 ,段名 ENDS,用戶指定,可任選定義,段名必須是合法是標(biāo)識(shí)符。,定位類(lèi)型:,內(nèi)存可以看成是一本書(shū),將其分成頁(yè),段,字,和字節(jié)。 每256個(gè)地址為一頁(yè)(PAGE),每頁(yè)的起始地址為二進(jìn)制: * * * 0000 0000 16進(jìn)制:*00H,第一頁(yè) (256個(gè)地址),第二頁(yè) (256個(gè)地址),00000H,000FFH,00100H,00200H,001FFH,每16個(gè)地址為一段(PARA),每段的起始地址為二進(jìn)制: * * * * 0000 16進(jìn)制:*0H,第一段 (16個(gè)地址),第二段 (16
37、個(gè)地址),*00H,*0FH,*10H,*1FH,*20H,段(節(jié))是默認(rèn)的定位類(lèi)型。,每2個(gè)地址為一個(gè)字(WORD),每個(gè)字的起始地址為偶數(shù); 最基本的類(lèi)型是字節(jié)(BYTE),字節(jié)只包含一個(gè)地址,可以是內(nèi)存的任何空間。,定位類(lèi)型表示所定義的段存放在內(nèi)存空間時(shí),段首地址對(duì)內(nèi)存空間的要求,即段起始點(diǎn)是放在一頁(yè)的起點(diǎn)上(PAGE)還是一段的起點(diǎn)上(PARA)等,如果不定義定位類(lèi)型,編譯程序?qū)⒛J(rèn)其為段類(lèi)型,即將段首地址放在從*0H開(kāi)始的內(nèi)存空間。,BYTE: 表示本段起始單元可以從任一地址開(kāi)始; WORD: 表示本段起始單元從一個(gè)偶地址開(kāi)始; PARA: 表示本段起始單元從一個(gè)段的邊界開(kāi)始(默認(rèn))
38、; PAGE: 表示本段起始單元從一個(gè)頁(yè)的邊界開(kāi)始。,組合類(lèi)型,組合類(lèi)型是告訴編譯程序,所定義的段與其他段的關(guān)系,即將該段存放內(nèi)存時(shí),是否將該段與其他段在物理上或邏輯上放在一起。 常常一個(gè)匯編程序可以有很多代碼段、數(shù)據(jù)段或堆棧段,這時(shí),就要綜合考慮各段的組合類(lèi)型。,NONE: 表示本段與其他段不發(fā)生任何關(guān)系,該段有自己的基地址,是默認(rèn)的組合關(guān)系。,PUBLIC:在滿足定位類(lèi)型的前提下與其他模塊的同名段連接在一起,形成一個(gè)新的邏輯段,共用一個(gè)段基址。,COMMON: 表示產(chǎn)生一個(gè)覆蓋段。連接時(shí),把本段與其他也用COMMON說(shuō)明的同名段置成相同的起始地址,重疊在一起,共享相同的存儲(chǔ)區(qū),其段長(zhǎng)度由最
39、長(zhǎng)的段確定。,STACK: 在每個(gè)匯編程序中,只能必須有一個(gè)堆棧段,連接時(shí),將本段與其他也用STACK說(shuō)明的同名段連接成一個(gè)連續(xù)的大的STACK段,編譯程序自動(dòng)初始化SS和SP寄存器,使SS的內(nèi)容為該連續(xù)段的首址,SP指向堆棧底部加1的存儲(chǔ)單元。,MEMORY: 表示本段在存儲(chǔ)器中應(yīng)定位在所有其他段的最高地址。,AT: 表示本段從表達(dá)式指定的地址處開(kāi)始裝入,這樣,在程序中用戶就可以直接定義段地址,這種方式不適用于代碼段。,類(lèi)別:是用單引號(hào)括起來(lái)的字符串,連接時(shí),LINK程序把類(lèi)別相同的段放在連續(xù)的存儲(chǔ)區(qū)中(可以不同名)。類(lèi)別名可以任意,但一般為CODE , STACK, DATA等,表明該段的
40、類(lèi)型。,例如:定義堆棧段如下: ST SEGMENT PARA STACK STACK DB 100 DUP(?) ST ENDS,段名,組合類(lèi)型,類(lèi)別,定位類(lèi)型,堆棧長(zhǎng)度,段結(jié)束,通過(guò)定義,自動(dòng)初始化了SS和SP。,SS:0000H,SS:0063H,SS:0064H,100字節(jié),SP,連接兩個(gè)匯編語(yǔ)言目標(biāo)程序時(shí),它們的數(shù)據(jù)段同名,組合類(lèi)型為PUBLIC,定位類(lèi)型為PARA。連接后第一個(gè)目標(biāo)程序的數(shù)據(jù)段的起始物理地址是01010H,長(zhǎng)度為17AH,則第二個(gè)目標(biāo)程序數(shù)據(jù)段的起始物理地址為多少?,01010H + 17AH= 0118AH,因?yàn)榈诙€(gè)數(shù)據(jù)段的定位類(lèi)型為PARA,故應(yīng)從節(jié)(段)的邊
41、界開(kāi)始,01190H,因?yàn)榻M合類(lèi)型為PUBLIC,所以共用一個(gè)段基址,在內(nèi)存中順序存放。,現(xiàn)有匯編目標(biāo)程序A和B,它們的數(shù)據(jù)段類(lèi)別名相同,組合類(lèi)型皆為COMMON,若A程序數(shù)據(jù)段中有字符串ABC,B程序數(shù)據(jù)段中有字符DEF,則執(zhí)行連接操作 LINK A+B 后,產(chǎn)生目標(biāo)程序的數(shù)據(jù)段中偏移地址為0000H單元的內(nèi)容是什么?,因?yàn)镃OMMON類(lèi)型為覆蓋,所以組合后B覆蓋A,44H,二、過(guò)程定義,過(guò)程的含義和子程序是一樣的,一個(gè)碼段中可以包含一個(gè)或許多過(guò)程。,碼段名 SEGMENT 過(guò)程名1 PROC FAR RET 過(guò)程名1 ENDP 過(guò)程名2 PROC NEAR RET 過(guò)程名2 ENDP 碼段
42、名 ENDS,FAR: 該過(guò)程為遠(yuǎn)過(guò)程,調(diào)用該過(guò)程時(shí)為段間調(diào)用,即CS和IP均要重新賦值; NEAR: 該過(guò)程為近過(guò)程,調(diào)用該過(guò)程時(shí)為段內(nèi)調(diào)用,只賦值IP。(默認(rèn)),過(guò)程名1 PROC FAR RET 過(guò)程名1 ENDP,過(guò)程名是合法的標(biāo)識(shí)符; 一個(gè)程序的主過(guò)程(起始指令所在的過(guò)程)應(yīng)是FAR過(guò)程,因?yàn)樵撨^(guò)程是DOS調(diào)用的。過(guò)程中應(yīng)有RET指令,以便返回到調(diào)用處。過(guò)程可以嵌套調(diào)用,但不可以嵌套定義。,過(guò)程開(kāi)始,過(guò)程結(jié)束,例:延時(shí)100ms的子程序,編程如下:,DELAY PROC MOV BL, 10 AGAIN: MOV CX, 2801H WAIT: LOOP WAIT DEC BL JN
43、Z AGAIN RET DELAY ENDP,三、段尋址,雖然定義了段,但由于段名是任意的,編譯程序仍然不知道哪個(gè)段是碼段,哪個(gè)段是數(shù)據(jù)段等,所以在碼段中要用ASSUME偽指令進(jìn)行說(shuō)明,告訴編譯器不同的段寄存器分別對(duì)應(yīng)哪個(gè)段地址。,ASSUME 段寄存器: 段名,段寄存器: 段名,,當(dāng)匯編程序遇到一個(gè)段名時(shí),就自動(dòng)地引用給出的段寄存器對(duì)段名加以匯編。,但匯編程序?qū)S和ES的值賦為PSP首址的值,在程序中還要由MOV指令重新對(duì)DS賦值。,正確的DS地址,MOV AX, 數(shù)據(jù)段名 MOV DS, AX,四、結(jié)束語(yǔ)句 END,ENDS : 段結(jié)束 ENDP:過(guò)程結(jié)束 END: 整個(gè)匯編源程序結(jié)束(
44、不配對(duì)使用) 匯編程序在編譯時(shí)遇到END,便得知源程序已經(jīng)結(jié)束。,END 表達(dá)式,表達(dá)式為可執(zhí)行程序運(yùn)行的起始位置,一般為主過(guò)程名。,五、ORG,ORG 表達(dá)式,指定了在其后的指令或數(shù)據(jù)存放的偏移地址。,ORG 0100H MOV AX, 0,表明該指令放在碼段,其偏移地址為0100H。碼段的首地址從CS:0000H處開(kāi)始。,六、完整結(jié)構(gòu),DATA SEGMENT X DB 3 Y DB 5 DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA, SS
45、:STACK BEGIN PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX RET BEGIN ENDP CODE ENDS END BEGIN,將PSP首址壓棧,以便返回DOS,設(shè)置DS段寄存器內(nèi)容,源程序結(jié)束,第一條指令的地址,分配段寄存器,主過(guò)程名,數(shù)據(jù)段,堆棧段,返回DOS,段定義偽指令的用途是在匯編語(yǔ)言源程序中定義邏輯段,常用的段定義偽指令有SEGMENT/ENDS和ASSUME等。 1. SEGMENT/ENDS偽指令 段名 SEGMENT 定位類(lèi)型組合類(lèi)型類(lèi)別 段名 ENDS 定位類(lèi)型。定位類(lèi)型給出一個(gè)段在內(nèi)存
46、中起始的物理地址所具有的特性,即起始邊界地址的要求。有:PAGE(頁(yè)類(lèi)型)、PARA(節(jié)類(lèi)型)、WORD(字類(lèi)型)、BYTE(字節(jié)類(lèi)型)四種類(lèi)型。其中PARA為默認(rèn)值。,三、段定義偽指令, 組合類(lèi)型。組合類(lèi)型在多模塊程序設(shè)計(jì)中表示該段和其它同名段間的組合連接方法。組合類(lèi)型有PUBLIC、COMMON、AT、MEMORY、STACK等。 類(lèi)別。類(lèi)別名是程序員任選的一個(gè)字符串,使用時(shí)必須用單引號(hào)括起來(lái)。其作用是在連接時(shí)決定各邏輯段的裝入順序。 2. ASSUME偽指令 用來(lái)說(shuō)明段和段寄存器關(guān)系的偽指令,即告訴匯編程序在指令執(zhí)行期間內(nèi)存的哪一段是數(shù)據(jù)段,哪一段是堆棧段,哪一段是代碼段,格式如下: A
47、SSUME 段寄存器:段名,段寄存器:段名, 注意:段寄存器在CS、DS、ES、SS中選擇。,3. ORG偽指令 用來(lái)指示其后的程序段或數(shù)據(jù)塊存放的起始地址偏移量。格式如下: ORG 數(shù)值表達(dá)式 例如: ORG 0100H 4.模塊定義偽操作NAME/END 用于定義一個(gè)匯編語(yǔ)言源程序模塊,該程序進(jìn)行匯編時(shí),匯編到END結(jié)束。格式如下: NAME 模塊名 模塊語(yǔ)句 END 表達(dá)式 注意: (1)模塊名由程序員命名,以字母開(kāi)頭,最多可有6個(gè)字符,可缺省,缺省時(shí)以源程序的文件名(.ASM文件)為模塊名。 (2)表達(dá)式為模塊執(zhí)行時(shí)的起始地址(標(biāo)號(hào)表示)。,例如:一個(gè)源程序的結(jié)構(gòu)框架如下。 NAME
48、PROG ;模塊命名為PROG,可缺省 DATA SEGMENT ;數(shù)據(jù)段定義 . DATA ENDS STACK SEGMENT ;堆棧段定義 . STACK ENDS CODE SEGMENT ;代碼段定義 . START: MOV AX,DATA . CODE ENDS END START ;程序結(jié)束,過(guò)程定義偽指令用來(lái)定義一個(gè)過(guò)程,即定義一個(gè)子程序。格式如下: 過(guò)程名 PROC NEAR/FAR RET 過(guò)程名 ENDP 其中,PROC偽指令定義一個(gè)過(guò)程的開(kāi)始,賦予過(guò)程一個(gè)名字,并指出該過(guò)程的類(lèi)型屬性為NEAR或FAR,如果沒(méi)有特別指明類(lèi)型,則認(rèn)為過(guò)程的類(lèi)型是NEAR;偽指令ENDP標(biāo)
49、志過(guò)程的結(jié)束。 上述兩個(gè)偽指令語(yǔ)句前面的過(guò)程名必須一致。,四、過(guò)程定義偽指令,當(dāng)一個(gè)程序段被定義為過(guò)程后,程序中其他地方就可以用CALL語(yǔ)句調(diào)用這個(gè)過(guò)程。調(diào)用一個(gè)過(guò)程的格式如下: CALL 過(guò)程名 過(guò)程名實(shí)質(zhì)上是過(guò)程入口的符號(hào)地址,與標(biāo)號(hào)一樣,也有3種屬性:段、偏移量和類(lèi)型。過(guò)程的類(lèi)型屬性可以是NEAR或FAR。 一般來(lái)說(shuō),被定義為過(guò)程的程序段中應(yīng)該有返回語(yǔ)句RET,但不一定是最后一條語(yǔ)句,也可以有不止一條RET語(yǔ)句。執(zhí)行RET語(yǔ)句后,控制返回到原來(lái)調(diào)用語(yǔ)句的下一條語(yǔ)句。 過(guò)程的定義和調(diào)用均可嵌套。例如:,NAME1 PROC FAR CALL NAME2 RET NAME2 PROC NEA
50、R RET NANE2 ENDP NAME1 ENDP 上面過(guò)程中,NAME1的定義中包含著另一個(gè)過(guò)程N(yùn)AME2的定義。NAME1本身是一個(gè)可以被調(diào)用的過(guò)程,而它也可以調(diào)用其他過(guò)程。,MY_CODE SEGMENT UP_COUNT PROC NEAR ADD CX,1 RET UP_COUNT ENDP START: . CALL UP_COUNT . CALL UP_COUNT . MY_CODE ENDS END START,SEGA SEGMENT . SUBT PROC FAR . RET SUBT ENDP . CALL FAR PTR SUBT . SEGA ENDS SEGB
51、SEGMENT . CALL FAR PTR SUBT . SEGB ENDS,保護(hù)現(xiàn)場(chǎng): 通常,主程序和過(guò)程的設(shè)計(jì)是分開(kāi)的,因而它們所使用的寄存器往往會(huì)發(fā)生沖突。為避免沖突,應(yīng)在進(jìn)入過(guò)程時(shí),將該過(guò)程所用到的寄存器內(nèi)容保護(hù)起來(lái),稱(chēng)為保護(hù)現(xiàn)場(chǎng)。 恢復(fù)現(xiàn)場(chǎng): 從過(guò)程返回主程序前,將原先保護(hù)起來(lái)的寄存器的內(nèi)容恢復(fù),稱(chēng)為恢復(fù)現(xiàn)場(chǎng)。 保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)通常分別用堆棧壓入指令和彈出指令來(lái)實(shí)現(xiàn)。如下所示:,SUBPR PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX RET SUBPR ENDP,PUSH AX PUSH
52、 BX PUSH CX PUSH DX CALL SUBP POP DX POP CX POP BX POP AX,一個(gè)子程序調(diào)用另一個(gè)子程序稱(chēng)為子程序的嵌套調(diào)用。由于調(diào)用子程序時(shí),斷點(diǎn)地址保存在堆棧中,因此只要有足夠的堆??臻g,嵌套的層次(也稱(chēng)深度)是不受限制的。如下圖所示:,五、宏指令及其使用,宏指令是源程序中具有獨(dú)立功能的一段程序代碼。在匯編語(yǔ)言中,如果在源程序中需要多次使用同一個(gè)程序段,可以將這個(gè)程序段定義為一個(gè)宏指令,每次需要時(shí),即可簡(jiǎn)單地用宏指令名來(lái)進(jìn)行宏調(diào)用,從而避免了重復(fù)書(shū)寫(xiě),使源程序更加簡(jiǎn)潔、易讀。 宏定義由MASM宏匯編程序提供的偽指令實(shí)現(xiàn)。,1.宏定義 宏指令名 MACR
53、O 形式參數(shù) ENDM 2. 宏調(diào)用 宏指令名 實(shí)際參數(shù) 只要在源程序中寫(xiě)上已定義過(guò)的宏指令名就算是調(diào)用該宏指令了。 3. 宏展開(kāi), ,宏體,具有宏調(diào)用的源程序被匯編時(shí),每個(gè)宏調(diào)用將被MASM進(jìn)行宏展開(kāi)。 宏展開(kāi)實(shí)際上是用宏定義時(shí)設(shè)計(jì)的宏體去代替相應(yīng)的宏指令,并用實(shí)際參數(shù)一一取代形式參數(shù)。 由此可見(jiàn),使用宏的過(guò)程共有三步:首先進(jìn)行宏定義;然后可以進(jìn)行宏調(diào)用;最后,匯編時(shí)由MASM進(jìn)行宏展開(kāi)。,例 若源程序中多處需要將AL和CL寄存器中的兩位壓縮型的BCD數(shù)相加,并將和送回CL寄存器,則可以定義宏指令,然后在需要的地方進(jìn)行調(diào)用。 DECADD MACRO ADD AL,CL DAA MOV CL
54、,AL ENDM 顯而易見(jiàn),這是一個(gè)沒(méi)有形式參數(shù)的宏定義。,如果對(duì)分別存放在任意8位寄存器或存儲(chǔ)單元中的兩個(gè)壓縮型的BCD數(shù)進(jìn)行加法運(yùn)算,則可將上例宏定義改寫(xiě)為 DECADD1 MACRO OPR1,OPR2 ;帶參數(shù)的宏定義 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 這是一個(gè)帶有兩個(gè)形式參數(shù)的宏定義。宏指令為 DECADD1。宏調(diào)用如下:,DECADD1 DL, BUFFER DECADD1 AREA1, AREA2 在匯編時(shí)進(jìn)行宏展開(kāi),得到以下指令: DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFF
55、ER + DAA + MOV DL, AL DECADD1 AREA1, AREA2 + MOV AL, AREA1 + ADD AL, AREA2 + DAA + MOV AREA1, AL,4.宏指令與子程序(過(guò)程) 在匯編語(yǔ)言程序設(shè)計(jì)中,宏指令和子程序都給設(shè)計(jì)者提供了很大方便。它們都是可被程序多次調(diào)用的程序段,并且調(diào)用前必須由設(shè)計(jì)者根據(jù)需要按一定格式進(jìn)行定義。然而,宏指令和子程序由于定義方法和其格式不同,因此,使用中有許多不同之處,主要是空間和時(shí)間的差異。,子程序由CALL指令調(diào)用,由RET指令返回,匯編后子程序的機(jī)器碼只占有一個(gè)程序段,不管調(diào)用多少次均如此,較為節(jié)約內(nèi)存。宏指令在每次宏
56、調(diào)用處宏展開(kāi)時(shí),宏體都要占一個(gè)程序段,調(diào)用次數(shù)愈多,占用內(nèi)存愈多。因此從內(nèi)存空間開(kāi)銷(xiāo)來(lái)說(shuō),子程序優(yōu)于宏指令。,從程序的執(zhí)行時(shí)間來(lái)分析,每調(diào)用一次子程序都要保護(hù)和恢復(fù)返回地址(斷點(diǎn))及寄存器內(nèi)容(現(xiàn)場(chǎng))等,要消耗較多的時(shí)間。宏指令調(diào)用時(shí)不需要這個(gè)過(guò)程,執(zhí)行時(shí)間較短。因此,從執(zhí)行時(shí)間來(lái)分析,宏指令優(yōu)于子程序。 綜上所述,當(dāng)某一個(gè)需要多次訪問(wèn)的程序段較長(zhǎng),訪問(wèn)次數(shù)又不是太多時(shí),選用子程序結(jié)構(gòu)較好。當(dāng)某一需多次訪問(wèn)的程序段較短,訪問(wèn)次數(shù)又很頻繁時(shí),選用宏指令結(jié)構(gòu)要更好些。,DSEG SEGMENT STRING1 DB 1,2,3,4,5 DSEG ENDS ESEG SEGMENT STRING2
57、DB 5 DUP(?) ESEG ENDS SSEG SEGMENT STACK STACK DW 10 DUP(?) TOP LABEL WORD SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME ES:ESEG,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX,MOV SP,OFFSET TOP LEA SI,STRING1 LEA DI,STRING2 MOV CX,5 CLD REP MOVSB MOV AH,4CH INT 21H CSEG ENDS END START,第五節(jié) DOS功能調(diào)用,操作系統(tǒng)管理計(jì)算機(jī),為用戶提供與CPU對(duì)話的接
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年高考語(yǔ)文作文模擬題4篇
- 2025年晉中市稅務(wù)系統(tǒng)遴選面試真題帶詳解含答案
- 綿竹市文職輔警招聘考試真題
- 臨沂市費(fèi)縣文職輔警招聘考試真題
- 海洋企業(yè)品牌形象塑造
- 老年護(hù)理講課課件
- 老年護(hù)理便秘課件教學(xué)
- 老年健康講座課件
- 2025年百貨商業(yè)市場(chǎng)調(diào)查報(bào)告
- 2025年安全門(mén)行業(yè)市場(chǎng)趨勢(shì)分析報(bào)告
- 食品化學(xué)課件
- 國(guó)家統(tǒng)計(jì)局征信行業(yè)報(bào)告
- 不良資產(chǎn)盡職調(diào)查工作底稿表
- 甩手運(yùn)動(dòng)原理課題研究報(bào)告
- 皮膚腫物培訓(xùn)演示課件
- 糖尿病胃輕癱的護(hù)理查房課件
- 冬蟲(chóng)夏草的人工栽培程序
- 太陽(yáng)完整分享
- 多孔硅酸鈣材料的制備
- (完整)工程竣工驗(yàn)收單-范本
- 游戲俱樂(lè)部群公告范本
評(píng)論
0/150
提交評(píng)論