計(jì)算機(jī)組成原理與匯編語言第8章.ppt
《計(jì)算機(jī)組成原理與匯編語言第8章.ppt》由會員分享,可在線閱讀,更多相關(guān)《計(jì)算機(jī)組成原理與匯編語言第8章.ppt(80頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
第八章匯編語言,一、概述 1.高級語言與匯編語言比較,高級語言:語句 變量說明/定義 int y,a=25,b=43,c=76; 給變量賦值 y=2(a+b)-c,匯編語言:指令 分配寄存器 分配存儲單元 數(shù)據(jù)傳遞,2.匯編程序結(jié)構(gòu) 數(shù)據(jù)段 堆棧段 代碼段,;設(shè)置數(shù)據(jù)段 DATA SEGMENT A DB 25 ;數(shù)據(jù)A B DB 43 ;數(shù)據(jù)B C DB 76 ;數(shù)據(jù)C Y DB ? ;存放結(jié)果 DATA ENDS ;設(shè)置堆棧段 STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS,示例:,y=2(a+b)-c,;設(shè)置代碼段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA ;裝填段寄存器DS MOV DS , AX MOV AL , A ;取數(shù)據(jù)A ADD AL , B ;計(jì)算(A+B) SAL AL , 1 ;計(jì)算 2(A+B) SUB AL , C ;計(jì)算 2(A+B)-C MOV Y , AL ;存結(jié)果 MOV AH,4CH ;結(jié)束用戶程序,返回操作系統(tǒng) INT 21H COSEG ENDS END START,示例:,y=2(a+b)-c,匯編語言: 是匯編格式指令,偽指令的集合及其表示,使用這些指令的一組規(guī)則。 機(jī)器語言: 用二進(jìn)制編碼的機(jī)器指令的集合及一組使用規(guī)則,它是CPU能直接識別的唯一語言。 MOV DS,AX —— 匯編語言 8E D8 —— 機(jī)器語言(目標(biāo)代碼),匯編語言與機(jī)器語言,匯編語言與目標(biāo)代碼的對應(yīng),與機(jī)器語言相關(guān) 效率高 編寫源程序繁瑣 調(diào)試?yán)щy,匯編語言特點(diǎn),對軟件的執(zhí)行時(shí)間或存儲容量有較高要求的場合,如操 作系統(tǒng)的內(nèi)核、工業(yè)控制領(lǐng)域、實(shí)時(shí)系統(tǒng)等。 在大型軟件中某些影響系統(tǒng)性能的瓶頸程序或者頻繁 使用的子程序可以采用匯編語言編程。 與硬件資源密切相關(guān)的軟件程序,如設(shè)備驅(qū)動(dòng)程序。 沒有合適的高級語言去開發(fā)的程序。,匯編語言的用途,二、匯編語言語句種類,語句種類 指令語句: 又叫可執(zhí)行語句,在匯編時(shí)產(chǎn)生一個(gè)目標(biāo)代碼, 對應(yīng)機(jī)器的一種操作。 偽指令語句:又叫命令語句。用于指示匯編程序如何匯編源程序,除了數(shù)據(jù)定義語句之外,沒有目標(biāo)代碼與之對應(yīng)。 宏指令語句:由用戶自定義的指令。(指令的擴(kuò)展),格式: 名字 操作符 操作數(shù) ; 注釋 指令語句: [標(biāo)號:] 助記符 [操作數(shù)[,操作數(shù)]][;注釋] 偽指令語句:[名字] 定義符 [參數(shù),.,參數(shù)] [;注釋] 命名規(guī)則: 可以用 ?,@,_$,數(shù)字和英文字符。 名字的第一個(gè)字符不能是數(shù)字。 名字的長度不受限制,但只有前31個(gè)字符有效。 不允許用保留字作名字(指令、偽指令、寄存器名)。,二、匯編語言語句格式,MASM宏匯編保留字,MASM宏匯編保留字,三、符號定義語句,1. 等值語句 格式: 符號 EQU 表達(dá)式 表達(dá)式:常數(shù)或數(shù)值表達(dá)式 地址表達(dá)式 變量或標(biāo)號 CONST EQU 10 ADR1 EQU DS:[BP+14H] ADR2 EQU CONST +10 COUN EQU VAR 為變量名VAR另定義一個(gè)別名 同一符號不能用EQU重新定義。 匯編時(shí),作為替代符號用,不產(chǎn)生目標(biāo)代碼,不占 有存儲單元。,2. 等號語句 格式: 符號 = 表達(dá)式 CONT=5 NUM=10H NUM=NUM+20H COUNT=VAR ;COUNT是變量VAR的別名 COUNT=NUM ;COUNT是常數(shù)NUM的別名 表達(dá)式形式同上,但可多次重新定義同一符號。,三、符號定義語句,四、數(shù)據(jù)定義語句,字節(jié) BYTE 1 字 WORD 2 雙字 DWORD 4 四字 QWORD 8 十字節(jié) TBYTE 10,DB DW DD DQ DT,例: DATA SEGMENT DA1 DB 9AH DA2 DW 5678H DA3 DD 12345678H DATA ENDS,變量的屬性: 段屬性 偏移屬性 類型屬性,四、數(shù)據(jù)定義語句,格式: 變量名 DB/DW/DD 表達(dá)式1,表達(dá)式2,.,格式: 變量名 DB/DW/DD 表達(dá)式1,表達(dá)式2,. 表達(dá)式: (1)數(shù)值 DA_BYTE1 DB 50H DA_BYTE2 DB 10H,20H,30H,40H DA_WORD1 DW 0A34H DA_WORD2 DW 1234H,5678H,9ABCH DA_DWORD DD 12345678H,9ABCDEFH,四、數(shù)據(jù)定義語句,格式: 變量名 DB/DW/DD 表達(dá)式1,表達(dá)式2,. 表達(dá)式: (2)字符/字符串 字符串必須用引號括起來 DB時(shí)一個(gè)字符串可以連續(xù)書寫小于255個(gè)字; DW、DD時(shí)每一個(gè)字符串表達(dá)式由1~2個(gè)字符構(gòu)成; STRING1 DB ‘STRING’ STRING2 DW ‘ST’,‘RI’,‘NG’ STRING3 DD ‘ST’,‘RI’,‘NG’,四、數(shù)據(jù)定義語句,STRING1 DB‘STRING’ STRING2 DW‘ST’,‘RI’,‘NG’ STRING3 DD ‘ST’,‘RI’,‘NG’,字符串定義舉例,格式: 變量名 DB/DW/DD 表達(dá)式1,表達(dá)式2,. 表達(dá)式: (3)?表達(dá)式:分配相應(yīng)數(shù)量的存儲單元,但不初始化。 DA_BYTE3 DB ?,? DA_WORD3 DW ?,?,四、數(shù)據(jù)定義語句,格式: 變量名 DB/DW/DD 表達(dá)式1,表達(dá)式2,. 表達(dá)式: (4)帶DUP的表達(dá)式 DA_B1 DB 10H DUP(?) DA_B2 DB 20H DUP(‘ABCD’) DA_W1 DW 10 DUP(4) DA_W2 DW 10 DUP(-1,1) 操作符DUP可以嵌套使用: DA_B3 DB 10H DUP(4 DUP(3),8),四、數(shù)據(jù)定義語句,1.常數(shù) 數(shù)值常數(shù):二、八、十、十六進(jìn)制 B,O,D,H 字符串常數(shù) (1)在指令語句的原操作數(shù)中作立即數(shù). MOV AL, 0A9H MOV BX, ‘AB’ (2) 存儲器操作數(shù)的尋址方式中作位移量。 MOV AL, DS: [340H] (3)在數(shù)據(jù)定義語句中,對存儲單元預(yù)置初值。 DB 12H, 34H,五、匯編語言數(shù)據(jù)與運(yùn)算符,2. 變量 (1) 用數(shù)據(jù)定義語句定義并預(yù)置初值后,變量代表存儲單元的數(shù)據(jù),并作為該單元的符號地址。 例如在某數(shù)據(jù)段已定義一變量: DATA_VAR DB 40H DUP (?) 幾種含有變量名的地址表達(dá)式為: 直接尋址: DATA_VAR+08H 基址變址尋址: DATA_VAR [BX] [DI] 地址表達(dá)式的值:存放操作數(shù)的存儲單元偏移量。 地址表達(dá)式的類型:同變量名的類型。,五、匯編語言數(shù)據(jù)與運(yùn)算符,2. 變量 (2)在用DW或DD的數(shù)據(jù)定義語句中,若操作數(shù)字段引用了變量名,則在分配的存儲單元中,預(yù)置被引用的變量名的地址部分:偏移量、段基值 NUM1 DB 10H DUP (?) NUM2 DW 10H DUP (?) ARRAY DB 10H DUP (‘ABCD’) ADR1 DW ARRAY ADR2 DD ARRAY,五、匯編語言數(shù)據(jù)與運(yùn)算符,3. 標(biāo)號:一條指令的符號地址。 段屬性 偏移屬性 類型屬性 NEAR:段內(nèi)轉(zhuǎn)移,作為標(biāo)號所在段的轉(zhuǎn)移、調(diào)用指令的目標(biāo)地址。 FAR:段間轉(zhuǎn)移,作為其他段的轉(zhuǎn)移、調(diào)用指令的目標(biāo)地址。 類型屬性設(shè)置: (1)隱含方式:NEXT:MOV AX, 3000,五、匯編語言數(shù)據(jù)與運(yùn)算符,(2)用LABEL偽指令設(shè)置類型屬性: 標(biāo)號偽指令LABEL格式: 名字 LABEL 類型 與指令語句配合使用: 名字(新標(biāo)號) LABEL 類型(NEAR/FAR) SUB1_FAR LABEL FAR SUB1: MOV AX,1234H 與數(shù)據(jù)定義語句配合使用: 名字(新變量名)LABEL 類型(DB/DW/DD) DATA _BYTE LABEL BYTE DATA _WORD DW 20H DUP(563H),五、匯編語言數(shù)據(jù)與運(yùn)算符,(1)算術(shù)運(yùn)算符,4. 運(yùn)算符,只有減法運(yùn)算可以用同一段內(nèi)的兩個(gè)變量相減,五、匯編語言數(shù)據(jù)與運(yùn)算符,NUM = 15*5 ;NUM=75 NUM = NUM/8 ;NUM=9 NUM = NUM MOD 5 ;NUM=4 NUM = -NUM-6 ;NUM= -10 NUM = -NUM ;NUM= 10 ORG 30H ;下面定義數(shù)據(jù)的起始偏移是30H DA1 DB ‘ABCDEFGH’ DA2 DB ‘IBM PC COMPUTER’ COUNT EQU DA2 - DA1 ;38H-30H=8 DA3 EQU DA2+4,NUM=11011011B DATA1 DW NUM SHL 3 , NUM SHR 2 . MOV AX , NUM SHL 3 MOV BX , NUM SHR 2 MOV CX , NUM SHL 8 MOV CX , NUM SHL 16 MOV DX , NUM SHR 8 MOV DX , NUM SHR 16,DATA1 DW 6D8H , 36H . MOV AX , 011011011000B MOV BX , 00110110B MOV CX , 1101101100000000B MOV CX , 0 MOV DX , 0 MOV DX , 0,算術(shù)運(yùn)算符,移位運(yùn)算符和移位指令區(qū)別 移位運(yùn)算符不能對寄存器或存儲單元進(jìn)行移位運(yùn)算 MOV AX,CX SHL 5 MOV DX,DATA1 SHR 3,五、匯編語言數(shù)據(jù)與運(yùn)算符,(2)邏輯運(yùn)算符,五、匯編語言數(shù)據(jù)與運(yùn)算符,4. 運(yùn)算符,MOV AL , NOT 0F0H MOV DX , NOT 0F0H MOV BL , 55H OR 0F0H AND BH , 55H AND 0F0H XOR CX , 55H XOR 50H,MOV AL , 0FH MOV DX , 0FF0FH MOV BL , 0F5H AND BH , 50H XOR CX , 5,(3)關(guān)系運(yùn)算符,全1為真,全0為假 比較時(shí),若為常數(shù)按無符號數(shù)比較,如果是變量按偏移量比較,五、匯編語言數(shù)據(jù)與運(yùn)算符,DATA SEGMENT ORG 10H NUM1=1234 NUM2=1234H DA_BYTE DB 10H DUP(0) DA_WORD DW 10H DUP(0) DA_VAR1 DW NUM2+DA_BYTE GT NUM1+DA_WORD DA_VAR2 DB NUM1 LE NUM2 DATA ENDS . MOV AX , NUM1 LT NUM2 MOV BL , NUM1 GE NUM2 MOV CX , DA_WORD GT DA_BYTE,. DA_VAR1 DW 0FFFFH DA_VAR2 DB 0FFH . MOV AX , 0FFFFH MOV BL , 0 MOV CX , 0FFFFH .,可以對兩個(gè)常數(shù)進(jìn)行比較,不能用常數(shù)與偏移量進(jìn)行比較,格式: 運(yùn)算對象是存儲器操作數(shù),由變量名或標(biāo)號組成地址表達(dá)式 SEG : 返回變量所在的段值 OFFSET:返回變量所在偏移 TYPE:返回變量的類型 LENGTH:返回?cái)?shù)組變量的元素個(gè)數(shù) SIZE:返回?cái)?shù)組變量所占的總字節(jié)數(shù) SIZE= TYPE* LENGTH,(4)數(shù)值返回運(yùn)算符,五、匯編語言數(shù)據(jù)與運(yùn)算符,假設(shè)DATA的段基值是7A4EH DATA SEGMENT ORG 30H DA1 DB 20H DUP(12H) DA2 DW DA1 . DATA ENDS . MOV AX , SEG DA1 MOV BX , SEG DA2 MOV SI , OFFSET DA1 MOV CX , DA2 MOV DI , OFFSET DA2 MOV DX , OFFSET DA1+4,MOV AX , 7A4EH MOV BX , 7A4EH MOV SI , 30H MOV CX , DA2 MOV DI , 50H MOV DX , 34H,用數(shù)字形式表示變量和標(biāo)號的類型屬性,五、匯編語言數(shù)據(jù)與運(yùn)算符,(4)數(shù)值返回運(yùn)算符,DA_BYTE DB 12H DA_WORD DW 3456H DA_DWORD DD 789AH . MOV AL , TYPE DA_BYTE MOV BL , TYPE DA_WORD MOV CL , TYPE DA_DWORD . MOV AL , 1 MOV BL , 2 MOV CL , 4,LENGTH與SIZE運(yùn)算符,LENGTH運(yùn)算符 返回?cái)?shù)組變量的元素個(gè)數(shù) 如果變量用DUP定義,Length為外層DUP的值 如果沒有DUP定義,結(jié)果為1 SIZE運(yùn)算符 數(shù)組變量所占的總字節(jié)數(shù) SIZE是LENGTH和TYPE的乘積,五、匯編語言數(shù)據(jù)與運(yùn)算符,(4)數(shù)值返回運(yùn)算符,DATA SEGMENT VAR1 DB 10H DUP(0) VAR2 DB 10H, 20H, 30H, 40H VAR3 DW 10H DUP(‘A’, 4 DUP(3)) VAR4 DB ‘COMPUTER’ DATA ENDS . MOV AL , LENGTH VAR1 ; MOV AH , SIZE VAR1 ; MOV BL , LENGTH VAR2 ; MOV BH , SIZE VAR2 ; MOV CL , LENGTH VAR3 ; MOV CH , SIZE VAR3 ; MOV DL , LENGTH VAR4 ; MOV DH , SIZE VAR4 ;,(AL)=10H (AH)=10H (BL)=1 (BH)=1 (CL)=10H (CH)=20H (DL)=1 (DH)=1,求數(shù)組ARRAY的各數(shù)據(jù)項(xiàng)的累加和,從數(shù)組最后一個(gè)數(shù)據(jù)項(xiàng)開始進(jìn)行累加。 ARRAY DW 20H DUP(4) . XOR AX , AX MOV SI , OFFSET ARRAY ADD SI , SIZE ARRAY-TYPE ARRAY MOV CX , LENGTH ARRAY LOP: ADD AX , [SI] SUB SI , TYPE ARRAY LOOP LOP,例:,(5)屬性運(yùn)算符 PTR: 類型 PTR 地址表達(dá)式 類型可以是:BYTE ,WORD,DWORD 或NEAR FAR 僅在當(dāng)前語句中有效,是一種臨時(shí)設(shè)置。 DA_BYTE DB 20H DUP(0) DA_WORD DW 10H DUP(0) MOV WORD PTR DA_BYTE [10], AX ADD BYTE PTR DA_WORD [DI], BL INC BYTE PTR [SI] SUB WORD PTR[BX],30H JMP FAR PTR SUB1,五、匯編語言數(shù)據(jù)與運(yùn)算符,THIS:THIS 類型 THIS常與等值語句EQU一起用,形成新變量名或標(biāo)號,使它們具有THIS后所指的類型,而段基值和偏移量與緊接的變量名或標(biāo)號相同。 例: DATA _BYTE EQU THIS BYTE DATA _WORD DW 20H DUP(0) JUMP_FAR EQU THIS FAR JUMP_NEAR : XOR AX, AX,五、匯編語言數(shù)據(jù)與運(yùn)算符,(5)屬性運(yùn)算符,(6)分離字節(jié)運(yùn)算符 HIGH 表達(dá)式 LOW 表達(dá)式 分離運(yùn)算對象的高字節(jié)和低字節(jié)部分 表達(dá)式必須具有常量值,如常數(shù)、地址表達(dá)式, 不能是存儲器操作數(shù)或寄存器內(nèi)容,五、匯編語言數(shù)據(jù)與運(yùn)算符,DATA SEGMENT ORG 20H CONST EQU 0ABCDH DATA1 DB 10H DUP(?) DATA2 DW 20H DUP(?) . DATA ENDS . MOV AH , HIGH CONST MOV AL , LOW CONST MOV BH , HIGH (OFFSET DATA1) MOV BL , LOW (OFFSET DATA2) MOV CL , LOW (CONST SHL 3),MOV AH , 0ABH MOV AL , 0CDH MOV BH , 0 MOV BL , 30H MOV CL , 68H,(7)運(yùn)算符的優(yōu)先級,五、匯編語言數(shù)據(jù)與運(yùn)算符,六、段結(jié)構(gòu)偽指令,1. 段定義偽指令 段名 SEGMENT [定位類型] [組合類型] [‘類別名’] . 段名 ENDS 定位類型(Align Type): PAGE(頁):本段從一個(gè)頁的邊界開始,起始地址能被 256整除。 PARA(節(jié)):本段從一個(gè)節(jié)的邊界開始,起始地址能被 16整除。 WORD(字):本段從偶字節(jié)地址開始。 BYTE(字節(jié)):本段從任意地址開始。,組合類型(Combine Type): NONE:本段與其它段無連接關(guān)系,是獨(dú)立的。 PUBLIC:本段與其它同段名同類型的段相連接在一起,然后為所有這些段指定一個(gè)共同的段基地址,形成一個(gè)新的邏輯段。 COMMON:本段與其它同段名同類型的段設(shè)置相同的段基址,共享相同的存儲區(qū),段長度由同名段中最大的段確定。(覆蓋段),六、段結(jié)構(gòu)偽指令,1. 段定義偽指令,組合類型(Combine Type):,STACK:與PUBLIC段相似,但此段為堆棧段,系統(tǒng)自動(dòng)對SS寄存器和SP指針初始化。 AT表達(dá)式:本段的起始單元可以定位在表達(dá)式所示的節(jié)邊界上。 MEMORY:本段定位在所有其它段的最高地址,有多個(gè)段,只把第一遇到的當(dāng)作此段。 類別名(Class),六、段結(jié)構(gòu)偽指令,1. 段定義偽指令,,2. 段尋址偽指令 ASSUME 段寄存器名:段名,段寄存器名:段名,. DS_DATA SEGMENT VAR1 DB 12H DS_DATA ENDS ES_DATA SEGMENT VAR2 DB 34H ES_DATA ENDS CODE SEGMENT VAR3 DB 56H,六、段結(jié)構(gòu)偽指令,,,ASSUME CS:CODE , DS:DS_DATA START: . INC VAR1 INC VAR2 INC VAR3 . CODE ENDS END START,可用關(guān)鍵字NOTHING取消前面的某些設(shè)置。 例: ASSUME DS:NOTHING;取消對DS的設(shè)置 ASSUME NOTHING; 取消全部4個(gè)段R的設(shè)置,接上篇,3.段寄存器的裝入 DS,ES的裝入 DATA_DS SEGMENT DB1 DB 10H DUP(?) DATA_DS ENDS CODE SEGMENT ASSUME CS:CODE , DS:DATA_DS , ES:DATA_ES START: MOV AX , DATA_DS ;設(shè)置DS MOV DS , AX MOV AX , DATA_ES ;設(shè)置ES MOV ES , AX . CODE ENDS,六、段結(jié)構(gòu)偽指令,DATA_ES SEGMENT DB2 DB 20H DUP(?) DATA_ES ENDS,,SS的裝入 (1) STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS (2) STACK2 SEGMENT DW 30H DUP(?) TOP LABEL WORD STACK2 ENDS . CODE SEGMENT . MOV AX , STACK2 ;設(shè)置SS MOV SS , AX MOV SP , OFFSET TOP ;修改SP,六、段結(jié)構(gòu)偽指令,CS的裝入 . CODE SEGMENT ASSUME CS:CODE , . START: . CODE ENDS END START,六、段結(jié)構(gòu)偽指令,過程名 PROC [NEAR/FAR] . RET 過程名 ENDP 有三個(gè)屬性 一個(gè)過程內(nèi),至少有一條返回指令RET 調(diào)用過程使用CALL 過程名 段內(nèi)返回與段間返回,七、過程定義偽指令,八、其它偽指令,1. ORG , $ ORG 表達(dá)式 將表達(dá)式的值賦給位置計(jì)數(shù)器 $ 存放位置計(jì)數(shù)器的當(dāng)前值,ORG , $舉例,DATA SEGMENT ORG 30H DB1 DB 12H , 34H ORG $+20H STRING DB ‘STRING’ DATA ENDS,八、其它偽指令,1. ORG , $,ORG , $舉例,DATA SEGMENT DA1 DB 10H DUP(?) DA2 DB 12H , 34H DA3 DW 56H , $+10H , 78H , $+20H . DATA ENDS,CODE SEGMENT . ORG 50H MOV AX , OFFSET $ MOV BX , OFFSET $ . CODE ENDS,MOV AX , 0050H MOV BX , 0053H,八、其它偽指令,1. ORG , $,ORG , $舉例,八、其它偽指令,2. EVEN 偽指令 定位偶地址 3. INCLUDE偽指令 INCLUDE 文件名 例: INCLUDE FILE.MAC INCLUDE B:\MASM\ABC.ASM,4. PUBLIC PUBLIC 符號1,符號2, ,5. EXTRN 偽指令 EXTRN 符號 1:類型 ,符號 2: 類型, .,PUBLIC NUM1 , STRING , SUB1 , LOOP1 DATA1 SEGMENT NUM1 EQU 1234H . STRING DB ‘CHARACTER STRING’ . DATA1 ENDS . CODE1 SEGMENT . SUB1 PROC FAR . SUB1 ENDP,LOOP1: . . CODE1 ENDS END,,EXTRN NUM1:ABS , STRING:BYTE EXTRN SUB1:FAR , LOOP1:NEAR : CODE2 SEGMENT : MOV AX , NUM1 LEA BX , STRING : CALL SUB1 : JMP FAR PTR LOOP1 : CODE2 ENDS END,八、其它偽指令,5. TITLE (標(biāo)題)偽指令,指定一個(gè)標(biāo)題 格式:TITLE 文本 字符不超過80個(gè) 例: TITLE EXAMPLE PROGRAM,九、宏指令,例: MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM,九、宏指令,EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,1. 宏定義 宏名 MACRO [形參1,形參2,.] . ENDM,2. 宏調(diào)用 宏名 [實(shí)參1,實(shí)參2,.] EXCHANGE DA_BY1 , DA_BY2 , AL 3. 宏展開,九、宏指令,;宏定義 MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM ;------------------------------------------------------------ EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,;設(shè)置數(shù)據(jù)段 DATA SEGMENT DA_W01 DW 1234H DA_W02 DW 5678H DATA ENDS ;設(shè)置堆棧段 STACK1 SEGMENT PARA STACK DW 20H PUP(?) STACK1 ENDS ;設(shè)置代碼段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA MOV DS , AX . MULTAX10 ;宏指令語句 + PUSH BX + SAL AX , 1,+ MOV BX , AX + SAL AX , 1 + SAL AX , 1 + ADD AX , BX + POP BX . EXCHANGE DA_W01 , DA_W02 , CX :宏指令語句 + MOV CX , DA_W01 + XCHG CX , DA_W02 + MOV DA_W01 , CX . COSEG ENDS END START,4. 宏操作符 連接操作符 & 定義:SHIFT_VAR MACRO R_M , DIRECT, COUNT MOV CL , COUNT S&DIRECT R_M , CL ENDM 調(diào)用:SHIFT_VAR AX,HL,2 SHL AX,CL SHIFT_VAR AX,HR,2 SHR AX,CL,SHIF0 MACRO CNT MOV CL , CNT ENDM SHIF1 MACRO REG , DIRECT , NUM COUNT=NUM SHIF0 %COUNT S宏調(diào)用 SHIF1 AX , HL , 2 SHIF1 BL , AR , 3,表達(dá)式操作符 % 格式:%表達(dá)式;獲取表達(dá)式的值(出現(xiàn)在宏調(diào)用中),;宏展開 SHIF1 AX , HL , 2 + MOV CL , 2 + SHL AX , CL SHIF1 BL , AR , 3 + MOV CL , 3 + SAR BL , CL,文本操作符 EXCHANGE ,,AL 宏展開 MOV AL , BYTE PTR DA_WORD1 XCHG AL , BYTE PTR DA_WORD2 MOV BYTE PTR WORD1 , AL 字符操作符 ! 格式: !字符 宏定義:PROMPT MACRO NUM , TEXT PROMP,5. LOCAL偽指令,LOCAL 在匯編過程中,宏定義中的內(nèi)容會在每一次宏調(diào)用處展開。因此當(dāng)多次調(diào)用一個(gè)宏時(shí),宏定義中的標(biāo)號會造成標(biāo)號重復(fù)定義。 在宏定義中使用LOCAL偽指令可以使標(biāo)號被局部化,從而避免重復(fù)定義。 LOCAL偽指令只能用在宏定義中,并且它必須是宏定義中緊跟在MACRO偽指令之后的第一個(gè)語句。,用連續(xù)相加的辦法實(shí)現(xiàn)無符號數(shù)乘法運(yùn)算 MULTIP MACRO MULT1 , MULT2 , MULT3 LOCAL LOP , EXIT0 MOV DX , MULT1 MOV CX , MULT2 XOR BX , BX XOR AX , AX JCXZ EXIT0 LOP: ADD BX , DX ADC AX , 0 LOOP LOP EXIT0: MOV MULT3 , BX MOV MULT3+2 , AX ENDM,設(shè)數(shù)據(jù)段有如下定義的變量: DA1 DW 1234H , 5678H DA2 DW 120H , 210H DA3 DW 4 DUP(?),宏展開: . MULTIP DA1 , DA2 , DA3 + MOV DX , DA1 + MOV CX , DA2 + XOR BX , BX + XOR AX , AX + JCXZ ??0001 +??0000:ADD BX , DX + ADC AX , 0 + LOOP ??0000 +??0001: MOV DA3 , BX,,+ MOV DA3+2 , AX . MULTIP DA1+2 , DA2+2 , DA3+4 + MOV DX , DA1+2 + MOV CX , DA2+2 + XOR BX , BX + XOR AX , AX + JCXZ ??0003 +??0002:ADD BX , DX + ADC AX , 0 + LOOP ??0002 +??0003: MOV DA3+4 , BX + MOV DA3+6 , AX .,6. 宏嵌套 宏定義嵌套 嵌套的宏定義: JUMP MACRO COND J&COND&S MACRO DEST LOCAL NEXT , EXIT J&COND NEXT JMP EXIT NEXT: JMP DEST EXIT: ENDM ENDM,外層宏調(diào)用為: JUMP E JUMP NE JUMP G JUMP GE 內(nèi)層宏調(diào)用為: : JES SUB1 ;等于0轉(zhuǎn)移 : JGES SUB2 ;大于或等于轉(zhuǎn)移 :,當(dāng)宏匯編程序?qū)?nèi)層宏展開后,可得到如下結(jié)果: JE ?? 0000 JMP ?? 0001 ?? 0000: JMP SUB1 ?? 0001: : JGE ?? 0002 JMP ?? 0003 ?? 0002: JMP SUB2 ?? 0003: :,兩個(gè)宏定義: 對32位數(shù)左移一位 SHIFT MACRO NUM1 , NUM2 SAL NUM2 ,1 RCL NUM1 ,1 ENDM 對32位數(shù)乘以12 MULT12 MACRO M_R1 , M_R2 , REG1 , REG2 PUSHF PUSH REG1 PUSH REG2 SHIFT M_R1 , M_R2 SHIFT M_R1 , M_R2 MOV REG1 , M_R1 MOV REG2 , M_R2,宏定義內(nèi)嵌套宏調(diào)用,SHIFT M_R1 , M_R2 ADD M_R2 , REG2 ADC M_R1 , REG1 POP REG2 POP REG1 POPF ENDM 某數(shù)據(jù)段已定義變量: 在程序中可以編寫宏指令語句: : MULT12 DA_WORD+2,DA_WORD,AX,BX : MULT12 AX,BX,CX,DX : 7. 宏庫的建立與使用,- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 計(jì)算機(jī) 組成 原理 匯編語言
鏈接地址:http://www.820124.com/p-2888353.html