版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,第四章 偽指令及匯編語(yǔ)言源程序程序結(jié)構(gòu),匯編語(yǔ)言語(yǔ)句種類及格式 偽操作 匯編語(yǔ)言的上機(jī)過程,2,匯編程序功能,運(yùn)行匯編語(yǔ)言程序的步驟: (1)用編輯程序建立ASM源文件 (2)用MASM程序把ASM文件轉(zhuǎn)換成OBJ文件 (3)LINK (4)用DOS 命令運(yùn)行,3,匯編語(yǔ)言語(yǔ)句種類及格式,指令語(yǔ)句 偽指令語(yǔ)句 宏指令,4,一、指令語(yǔ)句,使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語(yǔ)句,就是第3章學(xué)習(xí)的指令 書寫格式 標(biāo)號(hào): 指令助記符 DEST ,SRC ;注釋 標(biāo)號(hào):一條指令的符號(hào)地址??梢允÷?,如有必須以“:”作為結(jié)束標(biāo)志。在程序段或子程序段的第一條指令處可使用標(biāo)號(hào),以在程序需要時(shí)轉(zhuǎn)移到該
2、處時(shí),以標(biāo)號(hào)的形式引用。,5,指令語(yǔ)句標(biāo)號(hào)的命名,標(biāo)號(hào)的命名:根據(jù)用途,由字母、數(shù)字、專用符號(hào)? - $ 約定: 最長(zhǎng)31個(gè)字符 第一個(gè)字符不能是數(shù)字 ? - $可出現(xiàn)在標(biāo)號(hào)的任意位置,但? $不能單獨(dú)使用 . 只能出現(xiàn)在起始位置 一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,且不能與任何保留字相同,6,二、偽指令語(yǔ)句,(Directive)不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說明性語(yǔ)句,例如,數(shù)據(jù)說明、變量定義等等 偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān) 名字 偽指令 操作數(shù) ;注釋,7,偽指令語(yǔ)句格式說明,符號(hào)名字段: 與標(biāo)號(hào)相區(qū)別,不帶“:” 可以是常量名、變量名、過程名
3、、結(jié)構(gòu)名、記錄名等 可視為指令語(yǔ)句中的操作數(shù)(如符號(hào)名就表示一個(gè)常量或存儲(chǔ)地址 命名規(guī)則與標(biāo)號(hào)相同 偽指令字段:規(guī)定這條語(yǔ)句要求匯編程序完成的具體操作,8,4.2 偽操作,一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作 二、表達(dá)式賦值偽操作 三、段定義偽操作 四、程序開始和結(jié)束偽操作 五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作 六、基數(shù)控制偽操作 七、處理器選擇偽操作,9,一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作,數(shù)據(jù)是語(yǔ)句中操作數(shù)的基本組成部分 一般來講數(shù)據(jù)具有數(shù)值和屬性兩個(gè)特征 匯編語(yǔ)言能識(shí)別的數(shù)據(jù)項(xiàng)包括:常數(shù)、變量和標(biāo)號(hào),10,一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作,變量:代表存儲(chǔ)在某些存儲(chǔ)單元中的數(shù)據(jù),在程序運(yùn)行期間可以修改;對(duì)變量的
4、訪問以變量名的形式進(jìn)行;可認(rèn)為變量名為存儲(chǔ)單元的符號(hào)地址 變量的定義與預(yù)置 由數(shù)據(jù)定義偽操作完成,分配存儲(chǔ)單元 起名字 賦初值,11,一、數(shù)據(jù)定義偽指令的格式,變量名,DB DW DD DQ,表達(dá)式1,表達(dá)式2,,段屬性(SEG):表示變量存放在哪個(gè)邏輯段中,訪問時(shí)要使之成為當(dāng)前段 偏移量屬性(OFFSET):表示變量在所屬邏輯段中距起始點(diǎn)的距離 類型屬性(TYPE):表示變量所占字節(jié)數(shù),12,一、數(shù)據(jù)定義偽指令(表達(dá)式),數(shù)值表達(dá)式 D1 DB 12H,34H,56H (D1)=12H, (D1+1)=34H, (D1+2)=56H D2 DW 1234H,5678H (D2)=1234H,
5、 (D2+2)=5678H ?表達(dá)式:表示該單元的內(nèi)容任意 D3 DB ?,?;表示分配2個(gè)字節(jié) D4 DW ?,?;表示分配2個(gè)字,13,一、數(shù)據(jù)定義偽指令(表達(dá)式),字符串表達(dá)式 STR1 DB ABCDE ;為每個(gè)字符分配1個(gè)單元,辨析:STR1 DB AB STR2 DW BA,當(dāng)定義字符串中字符多于兩個(gè)時(shí),只能用DB定義,不用DW。,14,一、數(shù)據(jù)定義偽指令(表達(dá)式),帶DUP的表達(dá)式,變量名,DB DW DD DQ,表達(dá)式1 DUP(表達(dá)式2),D1 DB 20H DUP(?) ;預(yù)留20H個(gè)字節(jié),內(nèi)容任意,D2 DB 10H DUP(ABCD) ;重復(fù)10H個(gè)ABCD,共占40H
6、字節(jié),D3 DW 10H DUP(4) ;重復(fù)10H個(gè)字單元,內(nèi)容0004H,共占20H字節(jié),15,一、數(shù)據(jù)定義偽指令(表達(dá)式),帶DUP的表達(dá)式DUP操作符可重復(fù)使用,D4 DB 10H DUP(4 DUP(2),7),;重復(fù)10H個(gè)(2,2,2,2,7),共占50H字節(jié),16,一、數(shù)據(jù)定義偽指令(表達(dá)式),TABLE DW PAR1 DW PAR2 DW PAR3 ;只存儲(chǔ)偏移地址 DATA DD DATA1 DD DATA2 ;第一個(gè)字存偏移地 ; 址,第二個(gè)字存段 ;地址,17,一、數(shù)據(jù)定義偽指令(表達(dá)式),例 OPER1 DB ?,? OPER2 DW ?,? MOV OPER1,
7、0 MOV OPER2, 0,18,一、數(shù)據(jù)定義偽指令(表達(dá)式),OPER1 DB 1,2 OPER2 DW 1234H, 5678H MOV AX, OPER1+1 MOV AL, OPER2,?,MOV AX, WORD PTR OPER1+1 MOV AL, BYTE PTR OPER2,AX=3402 AL=12,19,二、表達(dá)式賦值偽操作,等值語(yǔ)句 符號(hào) EQU 表達(dá)式 ;將表達(dá)式的值賦給左邊的符號(hào),表達(dá)式的形式 1) 常數(shù)或數(shù)值表達(dá)式 CNT EQU 5 NUM EQU 13+5+4,2) 址表達(dá)式 ADR1 EQU DS:BP+14,3) 變量、標(biāo)號(hào)或指令助記符 W0 EQU W
8、ORD PTR DA_BYTE,20,二、表達(dá)式賦值偽操作,AB EQU DATA+2 該指令必須在DATA定義 之后,方可使用。,等值語(yǔ)句僅在匯編源程序時(shí)作為替代符號(hào)用,不產(chǎn)生任何目標(biāo)代碼,不占存儲(chǔ)單元 在同一程序中,同一符號(hào)不能用EQU重復(fù)定義,21,二、表達(dá)式賦值偽操作,等值語(yǔ)句 符號(hào) = 表達(dá)式 ;功能與EQU相同,但可重復(fù)定義,CNT = 5 NUM = 4 NUM = NUM+10H CBD = DDA CBD = ADD,22,表達(dá)式與運(yùn)算符,指令中的操作數(shù)可以以表達(dá)式的形式出現(xiàn),匯編程序在匯編過程中計(jì)算表達(dá)式,最終得到一個(gè)數(shù)值 程序運(yùn)行之前,就已經(jīng)計(jì)算出了表達(dá)式;所以,程序運(yùn)行
9、速度沒有變慢,但增強(qiáng)程序的可讀性 MASM對(duì)除偽指令外各種匯編時(shí)處理的指令統(tǒng)稱為操作符(Operator),23,運(yùn)算符,24,運(yùn)算符算術(shù)運(yùn)算符,+ - * / MOD SHR SHL 實(shí)現(xiàn)加、減、乘、除、取模、移位的運(yùn)算 MOV AX,3*4+5;等價(jià)于 MOV AX,17 其中MOD也稱為取模,它產(chǎn)生除法之后的余數(shù),如19 mod 7 = 5 加+和減-運(yùn)算符還可以用于地址表達(dá)式 表達(dá)式 SHR/SHL CNT 除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù),25,算術(shù)運(yùn)算符例,NUM= 11011011B MOV AL,NUM SHL 3MOV AL,11011000B MOV BL, NUM
10、SHR 2MOV AL,00110110B ADD DL, NUM SHR 6ADD DL,00000011B MOV AL,ARRAYBXSIMOV AL,ARRAYBX+SI,26,運(yùn)算符邏輯運(yùn)算符,AND OR XOR NOT 實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算 OR AL,03H AND 45H0R AL, 01H MOV AX, NOT 0F0HMOV AX,0FF0FH MOV BL, 55H AND 0F0H MOV BL,50H,27,運(yùn)算符關(guān)系運(yùn)算符,EQ LT LE GT GE 用于比較和測(cè)試符號(hào)數(shù)值 表達(dá)式1 關(guān)系運(yùn)算符 表達(dá)式2 表達(dá)式為常數(shù)時(shí),按無符號(hào)數(shù)進(jìn)行比較
11、 表達(dá)式為變量(同段內(nèi))時(shí),比較其偏移量 MASM用0FFH/0FFFFH(補(bǔ)碼 -1)表示條件為真 MASM用0000H表示條件為假,28,運(yùn)算符關(guān)系運(yùn)算符(舉例),MOV AX, 0FH EQ 1111B MOV AX,0FFFFH MOV BX, 0FH NE 1111B MOV BX,0 VAR DW NUM LT 0ABH ;當(dāng)已定義的常數(shù)NUM小于ABH時(shí),則VAR 0FFH,29,運(yùn)算符數(shù)值返回運(yùn)算符,操作對(duì)象:存儲(chǔ)器操作數(shù)(變量/標(biāo)號(hào)) 格式:運(yùn)算符 變量名/標(biāo)號(hào)名,SEG 名字/標(biāo)號(hào) 返回名字或標(biāo)號(hào)的段基值 MOV AX, SEG K1,OFFSET 名字/標(biāo)號(hào) 返回名字或標(biāo)
12、號(hào)的段內(nèi)偏移地址 MOV SI, OFFSET VAR,30,運(yùn)算符數(shù)值返回運(yùn)算符,TYPE 名字/標(biāo)號(hào) 返回名字或標(biāo)號(hào)的類型屬性,以數(shù)字形式表示,31,運(yùn)算符數(shù)值返回運(yùn)算符(例),V1 DB ABCD V2 DW 1234H,5678H V3DD V2 MOV AL, TYPE V1;AL=1 MOV CL, TYPE V2;CL=2 MOV CH, TYPE V3;CH=4,32,運(yùn)算符數(shù)值返回運(yùn)算符,LENGTH 名字/標(biāo)號(hào) 只用于變量,且為DUP所定義 如未用DUP定義則返回值為1 如使用DUP定義則返回最外層之值,33,運(yùn)算符數(shù)值返回運(yùn)算符(例),K1DB 10H DUP(0) K2
13、DB 10H,20H,30H K3DW 20H DUP(0,1,2 DUP(2) K4DB ABCD MOV AL,LENGTH K1;AL=10H MOV BL,LENGTH K2;BL=1 MOV CX,LENGTH K3;CX=20H MOV DX,LENGTH K4;DX=1,34,運(yùn)算符數(shù)值返回運(yùn)算符,SIZE 名字 只用于變量,得到重復(fù)定義的變量的數(shù)組元素所占字節(jié)數(shù)=LENGTH*TYPE,35,K1DB 10H DUP(0) K2DB 10H,20H,30H K3DW 20H DUP(0,1,2 DUP(2) K4DB ABCD MOV AL,LENGTH K1;AL=10H M
14、OV BL,LENGTH K2;BL=1 MOV CX,LENGTH K3;CX=20H MOV DX,LENGTH K4;DX=1 MOV AL,SIZE K1;AL=10H MOV BL,SIZE K2;BL=1 MOV CL,SIZE K3;CL=40H MOV DL,SIZE K4;DL=1,36,運(yùn)算符屬性修改運(yùn)算符,對(duì)存儲(chǔ)器操作數(shù)(名字/標(biāo)號(hào))的屬性修改為指定類型,不管原來是什么類型。 PTR 運(yùn)算符 類型 PTR 地址表達(dá)式,該修改是臨時(shí)的,只在當(dāng)前語(yǔ)句有效,37,運(yùn)算符屬性修改運(yùn)算符(例),DA_BYTE DB 20H DUP(0) DA_WORD DW 30H DUP(0)
15、LEA BX DA_WORD LEA SI,DA_BYTE MOV AX,WORD PTR BA_BYTE10H ADD BYTE PTR DA_WORD20H,BL INC BYTE PTR BX SUB WORD PTR SI,30H AND AX,WORD PTRBXSI JMP FAR PTR SUB1,38,運(yùn)算符THIS運(yùn)算符,THIS 類型名 和PTR類型相似,將變量或標(biāo)號(hào)定義成指定類型,但不分配新的存儲(chǔ)單元,其尋址空間與跟在后面的變量的尋址空間相同。 LABEL偽指令的功能等同于“EQU THIS”,39,D_BYTEEQU THIS BYTE W_WORDDW 20H DUP
16、(0) ;定義20H字單元,該區(qū)域可按字節(jié)訪問,也可以按字訪問 JMP_FAREQU THIS FAR JMP_NEAR: MOV AL,30H,運(yùn)算符THIS運(yùn)算符,40,運(yùn)算符HIGH/LOW運(yùn)算符,操作對(duì)象:常數(shù)/地址表達(dá)式 功能:取其高/低8位 CONST EQU 0ABCDH MOV AH,HIGH CONST ;AH=0ABH,41,運(yùn)算符的優(yōu)先級(jí),1() LENGTH SIZE WIDTH MASK 2PTR OFFSET SEG TPYE THIS : 3HIGE LOW 4* / MOD SHL SHR 5+ - 6EQ NE GT LT GE LE 7NOT 8AND 9O
17、R XOR 10SHORT,建議采用圓括號(hào)“( )”顯式表達(dá),它可以極大地提高程序的可閱讀性,42,程序結(jié)束返回的方法以中斷指令“INT 21H”返回,DOS軟中斷向用戶提供了一組非常有用的系統(tǒng)功能,其中4CH功能結(jié)束當(dāng)前進(jìn)程,控制返回給調(diào)用該程序的進(jìn)程,因此,在程序結(jié)束前加入語(yǔ)句: MOV AH,4CH INT 21H,43,三、段定義偽操作,段結(jié)構(gòu),段定義 段尋址(指定當(dāng)前段) 段寄存器的裝入,44,DATA SEGMENT BUF1 DB 2DH DATA ENDS EXRTA SEGMENT BUF2 DB ? EXRTA ENDS STAK SEGMENT TOP DW 50 DUP
18、(?) STAK ENDS CODE SEGMNET ASSUME CS:CODE, DS: DATA ASSUME ES:EXRTA SS:STAK,START: MOV AX, DATA MOV DS, AX MOV AX, EXRTA MOV ES, AX MOV AX, STAK MOV SS, AX MOV SP ,SIZE TOP MOV AL, BUF1 MOV ES:BUF2,AL MOV AH, 4CH INT 21H CODE ENDS END START,例題:把數(shù)據(jù)段中BUF1單元中的數(shù)據(jù)傳送到附加段BUF2中。,45,三、段定義偽操作完整段定義偽指令,段名SEGMEN
19、T 定位 組合 位數(shù) 類別 ;語(yǔ)句序列 段名ENDS,段定義由SEGMENT和ENDS這一對(duì)偽指令實(shí)現(xiàn),SEGMENT偽指令定義一個(gè)邏輯段的開始,ENDS偽指令表示一個(gè)段的結(jié)束 段定義指令后的4個(gè)關(guān)鍵字用于確定段的各種屬性. 如果不指定,則采用默認(rèn)參數(shù);但如果指定,要注意前后次序,46,三、段定義偽操作段定位(align)屬性,表示對(duì)邏輯段起始邊界的選擇,可為: PAGE 段從一個(gè)頁(yè)邊界開始(XXX00H,256Bytes/Page) PARA段節(jié)邊界開始(XXXX0H) DWORD段從一個(gè)4倍數(shù)地址開始 WORD 段從一個(gè)偶地址開始 BYTE 段可以從任意單元開始 完整段定義偽指令的默認(rèn)定位
20、屬性是PARA,47,三、段定義偽操作段組合(combine)屬性,指定多個(gè)邏輯段之間如何連接與定位,可為: PRIVATE 本段與其他段沒有連接關(guān)系,這是完整段定義偽指令默認(rèn)的段組合方式 PUBLIC 在滿足定位關(guān)系的前提下,連接程序把本段與所有同名段相鄰地連接在一起,形成新的邏輯段。(可在程序的不同位置及不同的文件中使用段定義語(yǔ)句定義一個(gè)邏輯段) COMMON 產(chǎn)生一覆蓋段,兩個(gè)同名段起始地址相同,用較長(zhǎng)的段覆蓋較短的段,48,三、段定義偽操作段組合(combine)屬性,STACK把所有的同類別段連接在一起,段基值SS,且自動(dòng)為SP初始化。在一個(gè)程序中一般應(yīng)該有一個(gè)堆棧段。 AT 表達(dá)式
21、表示本段定位在表達(dá)式所指示的節(jié)的邊界上 AT 0930H 表示本段的物理地址從09300H開始 MEMORY 表示本段定位在所有其它段的最高地址,49,三、段定義偽操作段類別(class)屬性,當(dāng)連接程序組織段時(shí),將所有的同類別段相鄰分配 段類別可以是任意名稱,但必須位于單引號(hào)中 大多數(shù)MASM程序使用 code、data和stack來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù),50,DA1SEGMENT PARA DATA DD1DB 10 DUP(12H) DA1ENDS STA1SEGMENT STACK STACK0 DW 20H DUP(?) STA1ENDS DA2
22、SEGMENT PARA DATA DD2DB 20H DUP(13H) DA2ENDS STA2SEGMENT STACK STACK0 DW 30H DUP(?) STA2ENDS CODE SEGMENT CODE ENDS,51,三、段定義偽操作段尋址,指明當(dāng)前段 ASSUME 段寄存器名:段名,段寄存器名:段名,,在程序運(yùn)行過程中,可重新設(shè)置當(dāng)前段,也可以刪除原有的設(shè)置 ASSUME ES:NOTHING;刪除對(duì)ES的設(shè)置 ASSUME NOTHING ;刪除對(duì)所有段的設(shè)置,52,三、段定義偽操作段寄存器的裝入,ASSUME只說明了已哪些段為當(dāng)前段,具體的段基值并沒有裝入,DS與ES
23、的裝入 用ASSUME將DS/ES與相應(yīng)的段建立聯(lián)系后,用數(shù)據(jù)傳送指令 MOVAX,段名 MOV DS/ES,AX,53,三、段定義偽操作段寄存器的裝入,SS的裝入 在定義段時(shí),用組合類型STACK說明 STACK1SEGMENT PARA STACK DW 20H DUP(0) STACK1ENDS CODESEGEMNT ASSUME CS:CODE,SS:STACK1 ,SS獲得STACK1的段基值,且SP=40H,54,三、段定義偽操作段寄存器的裝入,SS的裝入(類似于DS/ES的方法) STACK1SEGMENT DW 40H DUP(0) TOPLABEL WORD STACK1E
24、NDS CODESEGEMNT ASSUME CS:CODE,SS:STACK1 MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP;SP=80H ,中間不得插入其他指令,55,三、段定義偽操作段寄存器的裝入,CS的裝入 用結(jié)束偽指令:每個(gè)源程序都必須以END偽指令結(jié)束 END 起始地址,標(biāo)號(hào) 表達(dá)式,不一定是指令語(yǔ)句,56,三、段定義偽操作段寄存器的裝入,CS的裝入 CODESEGEMNT ASSUME CS:CODE,SS:STACK1 START: END START,57,四、程序開始和結(jié)束偽操作,開始: NAME modul_name TITLE te
25、xt,程序終止和匯編結(jié)束是兩碼事,結(jié)束: END 起始地址,58,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,地址計(jì)數(shù)器$ :匯編程序在為每條指令或變量分配內(nèi)存時(shí),使用當(dāng)前位置計(jì)數(shù)器來指示下一指令或數(shù)據(jù)的偏移量,用$表示其值。,ARRAY DW 1,2,$+4,3,4,$+4,兩個(gè)$+4的值是不同的, 假設(shè) 當(dāng)前ARRAY的偏移地址為0074,則第一個(gè)$+4為007C,第二個(gè)是0082,59,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,BUF1 DB 1,2,3,4,5 CNT1 EQU $-BUF1 BUF2 DW 1,2,3,4,5 CNT2 EQU ($-BUF2)/2,CNT1 CNT2 分別為執(zhí)行之后BUF1,BU
26、F2中的數(shù)據(jù)元素的個(gè)數(shù),60,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,定位偽指令:ORG 表達(dá)式 將表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器。即該偽指令后的指令或變量以表達(dá)式的值為偏移量,DATA SEGMENT ORG 100H X DB 12H ; X的偏移地址為100H Y DW ? ORG 200H Z DD 9C56H ;Z的偏移地址為0200H DATA ENDS,段內(nèi)偏移地址從0開始順序使用,也可以用ORG偽指令設(shè)置某個(gè)單元的起始地址。,61,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,DATA SEGMENT ORG 100H X DB 12H ; X的偏移地址為100H Y DW ? ORG 200H Z DD 9
27、C56H ;Z的偏移地址為0200H DATA ENDS,62,ORG $+8; 表示從當(dāng)前地址計(jì)數(shù)器值$開始的位移量,可以表示跳過8個(gè)字節(jié)的存儲(chǔ)區(qū)。 BUFFER LABEL BYTE ORG $+8 等同于:BUFFER DB 8 DUP (?),五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,63,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作,EVEN使下一指令或變量的偏移量為偶數(shù) ALIGN 保證雙字?jǐn)?shù)組邊界從4的倍數(shù)開始,64,五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作(例),DATASEGMENT ORG 30H DB1DB 12H,34H ORG $+20H STRDB ABC CNTEQU $-STR EVEN DW1DW 20H
28、 DUP(0) DATAENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ORG 10H START:MOV AX,DATA MOV DS,AX CODE ENDS END START,65,六、基數(shù)控制偽操作,匯編語(yǔ)言源程序默認(rèn)使用十進(jìn)制,其他用標(biāo)注表示(B,O,H) 格式:.RADIX 表達(dá)式 功能:把默認(rèn)的基數(shù)改為2、8、16等 除指定進(jìn)制外,其他加標(biāo)注,MOV BX,0FFH MOV BX,178,.RADIX 16 MOV BX,0FF MOV BX,178D,66,七、過程定義偽指令,過程名PROC NEAR/FAR RET 過程名ENDP,;隱含為
29、NEAR,;必須包含,在同一個(gè)邏輯段中可包含多個(gè)過程,67,八、程序結(jié)束返回的方法,以過程成形式編制的程序 以DOS中斷指令“INT 21H”返回,68,九 簡(jiǎn)化段定義偽指令,.STACK 大小;棧段開始 .DATA;數(shù)據(jù)段開始 .CODE 段名;代碼段開始,簡(jiǎn)化段定義偽指令指明一個(gè)邏輯段的開始,同時(shí)自動(dòng)結(jié)束前面的一個(gè)段 采用簡(jiǎn)化段定義偽指令前,需有.model語(yǔ)句 使用簡(jiǎn)化段定義,各段名稱和其他用戶所需的信息可以使用MASM預(yù)定義符號(hào),例如: data表示由.data等定義的數(shù)據(jù)段的段名,69,九 簡(jiǎn)化段定義偽指令棧段偽指令,.STACK 大小 棧段偽指令.STACK創(chuàng)建一個(gè)棧段,段名是:s
30、tack 它的參數(shù)指定棧段所占存儲(chǔ)區(qū)的字節(jié)數(shù),默認(rèn)是1KB(= 1024 = 400h字節(jié)),70,九 簡(jiǎn)化段定義偽指令數(shù)據(jù)段偽指令,.DATA 數(shù)據(jù)段偽指令.data創(chuàng)建一個(gè)數(shù)據(jù)段,段名是:_DATA。它用于定義具有初值的變量,當(dāng)然也允許定義無初值的變量 無初值變量可以安排在另一個(gè)段中,它用.data?偽指令創(chuàng)建,數(shù)據(jù)段名是:_BSS . const偽指令用于建立只讀的常量數(shù)據(jù)段(段名:CONST),71,九 簡(jiǎn)化段定義偽指令代碼段偽指令,.CODE 段名 代碼段偽指令.code創(chuàng)建一個(gè)代碼段,它的參數(shù)指定該代碼段的段名 如果沒有給出段名,則采用默認(rèn)段名: 在TINY、SMALL、COMPA
31、CT和FLAT模式下,默認(rèn)的代碼段名是:_TEXT 在MEDIUM、LARGE和HUGE模式下,默認(rèn)的代碼段名是:模塊名_TEXT,72,九 簡(jiǎn)化段定義偽指令,1.模式選擇偽指令.MODEL 格式:.MODEL 模式選擇符 功能:指明簡(jiǎn)化段所使用內(nèi)存模式,模式選擇符有TINY、SMALL、MEDIUM、COMPACT、LARGE等,一般選擇SMALL模式。,73,存儲(chǔ)模式偽指令,.MODEL 存儲(chǔ)模式 使用簡(jiǎn)化段定義,必須有存儲(chǔ)模式偽指令 .model語(yǔ)句必須位于所有段定義語(yǔ)句之前 存儲(chǔ)模式?jīng)Q定一個(gè)程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性 MASM有7種不同的存儲(chǔ)模式: T
32、INY SMALL COMPACT MEDIUM LARGE HUGE FLAT,74,存儲(chǔ)模式TINY微型模式,微型模式是MASM 6.0才引入的 用于創(chuàng)建COM類型程序 用微型模式編寫匯編語(yǔ)言程序時(shí),所有的段地址寄存器都被設(shè)置為同一值 這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個(gè)段內(nèi),不大于64KB;訪問操作數(shù)或指令都只需要使用16位偏移地址,75,存儲(chǔ)模式SMALL小型模式,一般的程序(例如本書的絕大多數(shù)程序示例和習(xí)題)都可用這種模式 在小型模式下,一個(gè)程序至多只能有一個(gè)代碼段和一個(gè)數(shù)據(jù)段,每段不大于64KB 這里的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個(gè)段基址,總長(zhǎng)度不可超過
33、64KB;因此小模式下程序的最大長(zhǎng)度為128KB 訪問操作數(shù)或指令都只需要使用16位偏移地址;這意味著諸如指令轉(zhuǎn)移、程序調(diào)用以及數(shù)據(jù)訪問等都是近屬性(NEAR),即小型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為近調(diào)用和近指針,76,存儲(chǔ)模式COMPACT緊湊模式,適合于數(shù)據(jù)量大但代碼量小的程序 緊湊模式下,代碼段被限制在一個(gè)不大于64KB的段內(nèi);而數(shù)據(jù)段則可以有多個(gè),超過64KB 這種模式下的調(diào)用類型缺省仍為近調(diào)用;而數(shù)據(jù)指針缺省為遠(yuǎn)(FAR)指針,因?yàn)楸仨氂枚蔚刂穪韰^(qū)別多個(gè)數(shù)據(jù)段,77,存儲(chǔ)模式MEDIUM中型模式,中型模式是與緊湊模式互補(bǔ)的模式 適合于數(shù)據(jù)量小但代碼量大的程序 中型模式的代碼段可
34、以超過64KB,有多個(gè);但數(shù)據(jù)段只能有一個(gè)不大于64KB的段 這種模式下的數(shù)據(jù)指針缺省為近指針;但調(diào)用類型缺省是遠(yuǎn)(FAR)調(diào)用,因?yàn)橐枚蔚刂穮^(qū)別多個(gè)代碼段,78,存儲(chǔ)模式LARGE大型模式,較大型程序通常采用的存儲(chǔ)模式 大型模式允許的代碼段和數(shù)據(jù)段都有多個(gè),都可以超過64KB;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在64K字節(jié)內(nèi) 大型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為遠(yuǎn)調(diào)用和遠(yuǎn)指針,79,存儲(chǔ)模式HUGE(巨型模式),與大型模式基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64K字節(jié)之內(nèi),80,存儲(chǔ)模式 FLAT平展模式,平展模式用于創(chuàng)建一個(gè)32位的程序, 它只能運(yùn)行在32位x86 CPU上。
35、DOS下不能使用FLAT模式, 而編寫32位Windows 9.x或Windows-NT的程序時(shí),必須采用FLAT模式。,81,九 簡(jiǎn)化段定義偽指令,.STACK 大??;棧段開始 .DATA;數(shù)據(jù)段開始 .CODE 段名;代碼段開始,簡(jiǎn)化段定義偽指令指明一個(gè)邏輯段的開始,同時(shí)自動(dòng)結(jié)束前面的一個(gè)段 采用簡(jiǎn)化段定義偽指令前,需有.model語(yǔ)句 使用簡(jiǎn)化段定義,各段名稱和其他用戶所需的信息可以使用MASM預(yù)定義符號(hào),例如: data表示由.data等定義的數(shù)據(jù)段的段名,82,簡(jiǎn)化段定義偽指令,數(shù)據(jù)段偽指令.DATA 格式:.DATA名字 定義一個(gè)數(shù)據(jù)段,若有多個(gè)數(shù)據(jù)段,則用名字區(qū)別。只有一個(gè)數(shù)據(jù)段
36、時(shí),隱含數(shù)據(jù)段名為DATA。 棧段定義偽指令 .STACK 格式:.STACK 長(zhǎng)度 功能:定義了一個(gè)堆棧段,并形成SS和SP的初值,SP的默認(rèn)值為1024,隱含段名為STACK。,83,簡(jiǎn)化段定義偽指令,代碼段定義偽指令.CODE 格式:.CODE 功能:定義一個(gè)代碼段,若有多個(gè)代碼段,則用名字區(qū)別。只有一個(gè)代碼段時(shí),隱含代碼段名為CODE。,84,程序開始偽指令,.STARTUP 按照CPU類型、存儲(chǔ)模式、操作系統(tǒng)和堆棧類型,產(chǎn)生程序開始執(zhí)行的代碼;同時(shí)還指定程序開始執(zhí)行的起始點(diǎn) 在DOS下,還將設(shè)置DS值,調(diào)整SS和SP值 使用了該偽指令,則程序結(jié)束處的END偽指令不必再指定程序入口處的
37、標(biāo)號(hào),85,程序終止偽指令,.EXIT 返回參數(shù) 產(chǎn)生終止程序執(zhí)行返回操作系統(tǒng)的指令代碼 它的可選參數(shù)是一個(gè)返回的數(shù)碼,通常用0表示沒有錯(cuò)誤。例如.exit 0對(duì)應(yīng)的代碼是: mov ah,4ch int 21h DOS功能調(diào)用的4ch子功能(返回DOS): 入口參數(shù):AH4ch,AL返回?cái)?shù)碼,86,匯編語(yǔ)言程序結(jié)構(gòu),匯編語(yǔ)言源程序有: 完整段定義結(jié)構(gòu)、 簡(jiǎn)化段定義結(jié)構(gòu)、 COM文件結(jié)構(gòu)、 程序段前綴結(jié)構(gòu)。,87,DATA SEGMENT BUF1 DB 35H,78H,0A5H SUM DB ? DATA ENDS CODE SEGMNET ASSUME CS:CODE, DS: DATA
38、START: MOV AX, DATA MOV DS, AX MOV AL,0,MOV SI,OFFSET BUF ADD AL, SI INC SI ADD AL, SI INC SI ADD AL, SI MOV SUM,AL MOV AH,4CH INT 21H CODE ENDS END START,例:三個(gè)數(shù)相加并把結(jié)果放在SUM單元中,下面程序就是一個(gè)完整段定義結(jié)構(gòu)的程序,88,.MODEL SMALL .DATA BUF1 DB 35H,78H,0A5H SUM DB ? .CODE MOV AX, DATA MOV DS, AX MOV AL,0 MOV SI,OFFSET B
39、UF ADD AL,SI,INC SI ADD AL, SI INC SI ADD AL, SI MOV SUM, AL MOV AH, 4CH INT 21H END,例:三個(gè)數(shù)相加并把結(jié)果放在SUM單元中,下面程序就是采用簡(jiǎn)化段定義結(jié)構(gòu)的程序,89,匯編源程序結(jié)構(gòu),COM文件結(jié)構(gòu): 特點(diǎn): 1 整個(gè)程序邏輯段可以有幾個(gè),但物理段只有一個(gè),即整個(gè)程序(包括數(shù)據(jù)和代碼段)在一個(gè)段(64KB)的范圍內(nèi)。 2 程序中的第一條可執(zhí)行指令在段中的0100H處存放。,90,例:三個(gè)數(shù)相加并把結(jié)果放在SUM單元中,下面程序就是COM文件結(jié)構(gòu)實(shí)現(xiàn)程序,CODE SEGMNET ASSUME CS:CODE,
40、 DS: DATA ORG 100H START:JMP BEGIN BUF DB 35H,78H,0A5H SUM DB ? BEGIN: MOV AX, CS MOV DS, AX MOV AL,0,MOV SI,OFFSET BUF ADD AL, SI INC SI ADD AL, SI INC SI ADD AL, SI MOV SUM,AL MOV AH,4CH INT 21H CODE ENDS END START,91,例:三個(gè)數(shù)相加并把結(jié)果放在SUM單元中,下面程序就是程序段前綴結(jié)構(gòu)的程序,DATA SEGMENT BUF1 DB 35H,78H,0A5H SUM DB ? DATA ENDS CODE SEGMNET ASSUME CS:CODE, DS: DATA ASUM PROC FAR ;把程序定義成過程的形式。 START: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA MOV DS, AX MOV AL,0,MOV SI,OFFSET BUF ADD AL, SI INC SI ADD AL, SI INC SI ADD AL, SI MOV SUM,AL RET ASUM ENDP
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年牙科材料銷售合同范本:專業(yè)供應(yīng)鏈服務(wù)協(xié)議3篇
- 二零二五版fsc木材加工銷售采購(gòu)合同模板3篇
- 基于云計(jì)算的2025年度教育平臺(tái)開發(fā)與運(yùn)營(yíng)合同2篇
- 2025年信貸款質(zhì)押協(xié)議
- 2025年合作交通運(yùn)輸書籍出版協(xié)議
- 二零二五版參考文化項(xiàng)目居間合作協(xié)議書2篇
- 2025年連帶責(zé)任保證合同(廣告公司)
- 2025年增資協(xié)議委托管理
- 二零二五年餐飲合伙企業(yè)股份權(quán)益共享管理服務(wù)協(xié)議6篇
- 2025年私人學(xué)校物業(yè)設(shè)施設(shè)備安全評(píng)估與監(jiān)控服務(wù)合同模板3篇
- 蔣詩(shī)萌小品《誰(shuí)殺死了周日》臺(tái)詞完整版
- TB 10010-2008 鐵路給水排水設(shè)計(jì)規(guī)范
- 黑色素的合成與美白產(chǎn)品的研究進(jìn)展
- 建筑史智慧樹知到期末考試答案2024年
- 金蓉顆粒-臨床用藥解讀
- 社區(qū)健康服務(wù)與管理教案
- 2023-2024年家政服務(wù)員職業(yè)技能培訓(xùn)考試題庫(kù)(含答案)
- 2023年(中級(jí))電工職業(yè)技能鑒定考試題庫(kù)(必刷500題)
- 藏歷新年文化活動(dòng)的工作方案
- 果酒釀造完整
- 第4章-理想氣體的熱力過程
評(píng)論
0/150
提交評(píng)論