第13章高級宏匯編語言技術(shù)_第1頁
第13章高級宏匯編語言技術(shù)_第2頁
第13章高級宏匯編語言技術(shù)_第3頁
第13章高級宏匯編語言技術(shù)_第4頁
第13章高級宏匯編語言技術(shù)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第1 1頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 第第13章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 13.1 結(jié)構(gòu)結(jié)構(gòu) 13.2 記錄記錄 13.3 宏匯編宏匯編 13.4 重復(fù)匯編重復(fù)匯編 11.5 條件匯編條件匯編第第2 2頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 13.1 結(jié)構(gòu)結(jié)構(gòu) MASM支持結(jié)構(gòu),其直接引用高級語言的結(jié)構(gòu)數(shù)據(jù)概念。支持結(jié)構(gòu),其直接引用高級語言的結(jié)構(gòu)數(shù)據(jù)概念。 13.1.1 結(jié)構(gòu)的定義結(jié)構(gòu)的定義 結(jié)構(gòu)名結(jié)構(gòu)名 STRUC 結(jié)構(gòu)名結(jié)構(gòu)名 ENDS【例】【例】 定

2、義一個與時間有關(guān)的結(jié)構(gòu)。定義一個與時間有關(guān)的結(jié)構(gòu)。TIMERS STRUC YEAR_STR DB CURRENT DATE:,$ YEAR DW ? MONTH DB ? DAY DB ? TIME_STR DB CURRENT TIME:,$ HOUR DB ? MINUTE DB ? SEC DB ?TIMERS ENDS第第3 3頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.1.2 結(jié)構(gòu)的預(yù)置與存儲單元的分配結(jié)構(gòu)的預(yù)置與存儲單元的分配 結(jié)構(gòu)變量預(yù)置語句的格式:結(jié)構(gòu)變量預(yù)置語句的格式: 結(jié)構(gòu)變量名結(jié)構(gòu)變量名 結(jié)構(gòu)名結(jié)構(gòu)名 【例】【例】

3、 TIMERS結(jié)構(gòu)進(jìn)行引用。結(jié)構(gòu)進(jìn)行引用。 STR1 TIMERS STR2 TIMERS 所有字段都不修改。所有字段都不修改。修改前兩個字段。修改前兩個字段。注意注意:只有簡單結(jié)構(gòu)字段(用:只有簡單結(jié)構(gòu)字段(用DB、DW、DD定義的單項變量)和字定義的單項變量)和字符串字段的初值可以修改。符串字段的初值可以修改。第第4 4頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.1.3 結(jié)構(gòu)變量使用舉例結(jié)構(gòu)變量使用舉例 【例】【例】 寫一個程序,獲取系統(tǒng)日期和時間,并顯示。寫一個程序,獲取系統(tǒng)日期和時間,并顯示。TIMERS STRUC DATE_S

4、TR DB The current date is : ,$ YEAR DW ? MONTH DB ? DAY DB ? TIME_STR DB The current time is ,$ HOUR DB ? MINUTE DB ? SEC DB ?TIMERS ENDS第第5 5頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)INCLUDE USER.MAC DISP_T MACRO X ;以十進(jìn)制輸出字節(jié)內(nèi)容 DISP_CHAR : MOV AL,X MOV AH,0 MOV BX,10 CALL NUM_DECENDMDATA SEGMEN

5、T TIMES TIMERS DATA ENDS第第6 6頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX CALL GET_DATE ;獲取系統(tǒng)日期 CALL DISP_DATE ;顯示系統(tǒng)日期 CRLF ;回車換行 CALL GET_TIME ;獲取系統(tǒng)時間 CALL DISP_TIME ;顯示系統(tǒng)時間 MOV AX,4C00H INT 21H 第第7 7頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級

6、宏匯編語言技術(shù)高級宏匯編語言技術(shù)GET_DATE PROC NEAR ;取系統(tǒng)日期 MOV AH,2AH INT 21H MOV TIMES.YEAR,CX ;年信息 MOV TIMES.MONTH,DH ;月 MOV TIMES.DAY,DL ; 日 RETGET_DATE ENDP GET_TIME PROC NEAR ;取系統(tǒng)時間 MOV AH,2CH INT 21H MOV TIMES.HOUR,CH MOV TIMES.MINUTE,CL MOV TIMES.SEC,DH RETGET_TIME ENDP 第第8 8頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編

7、語言技術(shù)高級宏匯編語言技術(shù)DISP_DATE PROC NEAR ; 顯示系統(tǒng)日期 DISP_STR TIMES.DATE_STR MOV AX,TIMES.YEAR MOV BX,10 CALL NUM_DEC ;輸出年份 DISP_T TIMES.MONTH ;輸出月 DISP_T TIMES.DAY ;輸出日 RETDISP_DATE ENDP 第第9 9頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)DISP_TIME PROC NEAR ; 顯示系統(tǒng)時間 DISP_STR TIMES.TIME_STR DISP_T TIMES.HOUR

8、DISP_T TIMES.MINUTE DISP_T TIMES.SEC RETDISP_TIME ENDPINCLUDE NUM_DEC.ASMCODE ENDS第第1010頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)宏匯編的意義:宏匯編的意義:避免了重復(fù)編寫,使源程序更加簡潔、易讀。避免了重復(fù)編寫,使源程序更加簡潔、易讀。 13.3.1 13.3.1 宏功能的使用過程宏功能的使用過程1.宏定義 宏指令宏指令:將在源程序中多次使用到同一個程序段定義成一個將在源程序中多次使用到同一個程序段定義成一個“指令指令”格式不帶參數(shù) 宏名 MACRO 宏

9、體 ENDM帶參數(shù) 宏名 MACRO 形參1,形參2,. 宏體 ENDM不可缺省,不可缺省,且名字唯一且名字唯一語句序列語句序列【例】【例】對兩個存儲單元(字節(jié)/字)的內(nèi)容相互交換的程序段進(jìn)行宏定義:EXCHANGE MACROMACRO MEM1,MEM2,REGMOV REG,MEM1XCHG REG,MEM2MOV MEM1,REGENDMENDM 形參形參13.3 宏匯編宏匯編第第1111頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)2.2.宏調(diào)用宏調(diào)用含義:用宏指令名來代替原來的程序段 格式不帶參數(shù) 宏名帶參數(shù) 宏名 實參1,實參2,.

10、 數(shù)字,符號名等。第第1212頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)3.3.宏展開宏展開含義:宏匯編程序在匯編源程序時自動用宏指令的內(nèi)容代替宏指令 注意:注意:宏指令的使用不會減少程序的目標(biāo)代碼長度 【例】【例】宏指令使用的過程:;宏定義 PUSH4 MACROMACRO PUSH AX PUSH BX PUSH CX PUSH DX ENDMENDM EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDMENDM;設(shè)置數(shù)據(jù)段DATASEGMENT

11、DA_W01DW 1234HDA_W02DW 5678HDATAENDS;設(shè)置堆棧段STACK1 SEGMENT PARA STACKDW 20H DUP(?)STACK1ENDS;設(shè)置代碼段COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX PUSH4 ;宏指令語句 + PUSH AX + PUSH BX + PUSH CX + PUSH DX EXCHANGE DA_W01,DA_W02,CX ;宏指令語句 + MOV CX, DA_W01 + XCHG CX, DA_W02 + MOV DA

12、_W01,CX COSEG ENDS END START第第1313頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 1.連接操作符連接操作符& 13.3.2 宏操作符宏操作符含義:宏展開時,對應(yīng)形參的實參就與它前后的符號連接在一起用途:修改某些符號【例】【例】連接符連接符&的使用的使用: :SHIFT_VAR MARCO R_M,DIRECT,COUNT MOV CL,COUNT S&DIRECT R_M, CL ENDMSHIFT_VAR AX,HL,2的宏展開為:的宏展開為:+ MOV CL,2+ SHL AX,CL

13、SHIFT_VAR BX,HR,3的宏展開為:的宏展開為: + MOV CL,3 + SHR BX,CL第第1414頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 2.表達(dá)式操作符表達(dá)式操作符%含義:告訴宏匯編程序獲取表達(dá)式的值,而不是獲取表達(dá)式文本本身 格式:%表達(dá)式 注意:注意:這個操作符一般是出現(xiàn)在宏調(diào)用中,不允許出現(xiàn)在形參的前面。 【例】【例】表達(dá)式%的使用:;宏定義SHIF0 MACRO CNT MOV CL,CNT ENDMSHIF1 MACRO REG,DIRECT,NUM COUNT=NUM SHIF0 %COUNT S&

14、DIRECT REG,CL ENDM ;宏調(diào)用 SHIF1 AX,HL,2 SHIF1 BL,AR,3;宏展開 SHIF1 AX,HL,2 + MOV CL,2 + SHL AX,CL SHIF1 BL,AR,3 + MOV CL,3 + SAR BL,CL第第1515頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)3.文本操作符文本操作符含義:把一個完整的實參括起來,作為一個單一的實參 ?!纠俊纠浚篍XCHANGE ,AL 宏展開時,替換的三條指令是: MOV AL,BYTE PTR DA_WORD1 XCHG AL,BYTE PTR DA_

15、WORD2 MOV BYTE PTR WORD1,AL 注意注意: :文本操作符還可以用來處理某些特殊字符:如“;”和“&”。 【例】【例】:就表示一個分號“;”的實參,而不是注釋符。 第第1616頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)4.字符操作符!字符操作符! 含義: “!” 后的字符不作特別的操作符使用,而是以字符本身的意義進(jìn)行處理。如: “!&” 表示 & 不作連接操作符用,只作符號 & 使用?!埃?” 表示 % 不作表達(dá)式操作符使用,只作百分號用。 【例】【例】字符操作符!的使用字符操作符!的使用

16、:;宏定義:;宏定義: PROMPT MACRO NUM ,TEXT PROMP&NUM DB & TEXT & ENDM宏調(diào)用:宏調(diào)用:PROMPT 23, 255宏展開:宏展開:PROMP23 DB Expression 2555.5.宏注解符;宏注解符; 含義:說明后面的文本是注解。第第1717頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.3.3 LOCAL偽指令偽指令意義:在宏定義中使用變量名和標(biāo)號,為了避免在宏展開時產(chǎn)生多個相同的變量名或標(biāo)號。 格式格式: LOCAL 在宏定義中定義的變量名和標(biāo)號,在宏定義

17、中定義的變量名和標(biāo)號,多個符號之間用逗號間隔多個符號之間用逗號間隔 注意注意:宏展開時,LOCAL偽指令指定的變量、標(biāo)號自動生成格式為“??” 的符號,其中后四位順序使用0000FFFF的十六進(jìn)制數(shù)字。 第第1818頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)【例】【例】用連續(xù)相加的辦法實現(xiàn)無符號數(shù)乘法運(yùn)算,編制宏定義MULTIPMULTIP MACRO MULT1,MULT2,MULT3 LOCAL LOP,EXIT0 MOV DX,MULT1 ;乘數(shù)1 MOV CX,MULT2 ;乘數(shù)2 XOR BX,BX XOR AX,AX JCXZ E

18、XIT0 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(?)在代碼段中:如有兩次宏調(diào)用,則兩次的宏展開如下: MULTIP DA1,DA2,DA3MULTIP DA1,DA2,DA3+ MOV DX,DA1+ MOV CX,DA2+ XOR BX,BX+ XOR AX,AX+ JCXZ ? 0001? 0001 +?00000000:ADD BX,DX+ ADC AX,0+

19、LOOP ?0000?0000 +?00010001:MOV DA3,BX+ MOV DA3+2,AX MULTIP DA1+2,DA2+2,DA3+4MULTIP DA1+2,DA2+2,DA3+4+ MOV DX,DA1+2+ MOV CX,DA2+2+ XOR BX,BX+ XOR AX,AX+ JCXA ?00030003 +?0002:ADD BX,DX ADC AX,0 LOOP ?00020002 +?0003:MOV DA3+4,BX+ MOV DA3+6,AX第第1919頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.3.4

20、 宏嵌套宏嵌套1.1.宏定義嵌套宏定義嵌套含義:一個宏定義中包含另一個宏定義 【例】【例】嵌套的宏定義: JUMP MACRO COND ;外層宏定義 J&COND&S MACRO DEST ;內(nèi)層宏定義 LOCAL NEXT,EXIT J&COND NEXT JMP EXIT NEXT:JMP DEST EXIT ENDM ENDM應(yīng)用:常常用這種宏定義嵌套來產(chǎn)生一些新的宏定義 例如外層宏調(diào)用為: JUMP E JUMP NE JUMP G JUMP GE分別形成內(nèi)層宏定義的宏名:JES,JNES,JGS,JGES。 如有兩個條件轉(zhuǎn)移的目標(biāo)地址分別是SUB1和SUB2

21、,這時內(nèi)層宏調(diào)用為: JES SUB1 ;等于0轉(zhuǎn)移 JGES SUB2 ;大于或等于0轉(zhuǎn)移 當(dāng)宏匯編程序?qū)?nèi)層宏展開后,得如下結(jié)果: JE ? 0000 JMP ? 0001? 0000:JMP SUB1? 0001: JGE ? 0002 JMP ? 0003 ?0002:JMP SUB2 ?0003: 第第2020頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù) 2.2.宏定義內(nèi)嵌套宏調(diào)用宏定義內(nèi)嵌套宏調(diào)用 含義:在一個宏定義的宏體內(nèi)有宏調(diào)用 注意:被調(diào)用的宏指令必須是已定義的 【例】【例】SHIFT是對32位數(shù)左移一位的宏定義,其中NUM1

22、是高16位數(shù),NUM2是低16位數(shù)。MULT12是對一個32位數(shù)乘以12的宏定義,其中M_R1是存放高16位數(shù)的存儲單元或寄存器,M_R2是存放低16位數(shù)的存儲單元或寄存器。在乘法的過程中,要使用寄存器暫存32位數(shù),REG1和REG2就是指定用來暫存數(shù)據(jù)的兩個寄存器。在MULT12的宏定義中,當(dāng)需要對32位數(shù)進(jìn)行左移時,就調(diào)用SHIFT的宏定義。 現(xiàn)有兩個宏定義:SHIFT MACRO NUM1,NUM2 SAL NUM2,1 RCL NUM1,1 ENDMMULT12 MACRO M_R1,M_R2,REG1,REG2 PUSHF PUSH REG1 PUSH REG2 SHIFT M_R1

23、,M_R2 某數(shù)據(jù)段已定義變量: DA_WORD DW 123H ,456H 程序中可以編寫宏指令語句: MULT12 DA_WORD+2,DA_WORD,AX,BX MULT12 AX,BX,CX,DX SHIFT M_R1,M_R2 MOV REG1,M_R1 MOV REG2,M_R2 SHIFT M_R1,M_R2 ADD M_R2,REG2 ADC M_R1,REG1 POP REG2 POP REG1 POPF ENDM第第2121頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.3.5 宏程序庫宏程序庫含義:若干個宏定義以文件的形

24、式組成一個宏庫,供其他源程序使用。 調(diào)用:在新編制的源程序中使用INCLUDE偽指令 宏指令與子程序的區(qū)別宏指令與子程序的區(qū)別 相同點:(1)簡化源程序的書寫。 (2)節(jié)省編程工作量。不同點: (1)宏指令并不節(jié)省目標(biāo)程序,子程序節(jié)省目標(biāo)代碼和存儲空間 (2)宏指令的功能靈活,執(zhí)行速度快;子程序的靈活性差些,執(zhí)行 速度也不如宏指令快 第第2222頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)【例12-10】用IRP重復(fù)匯編偽指令定義一個保存寄存器信息的宏定義: PUSHREG MACRO TEXT IRP REG, PUSH REG ENDM E

25、NDM【例】【例】用重復(fù)匯編可以在9*9個字節(jié)存儲單元中存放一個乘法九九表的數(shù)值: N=0 REPT 9 N=N+1 M=0 REPT 9 M=M+1 DB N*M ENDM ENDM 13.4 重復(fù)匯編重復(fù)匯編類型REPT偽指令 格式:REPT 表達(dá)式 ENDM重復(fù)語句序列 含義:將重復(fù)語句序列重復(fù)匯編,表達(dá)式的值為重復(fù)匯編的次數(shù)。 重復(fù)匯編語句序列等效:DB 1,2,3,4,5,6,7,8,9DB 2,4,6,8,10,12,14,16,18DB 3,6,9,12,15,18,21,24,27DB 4,8,12,16,20,24,28,32,36DB 5,10,15,20,25,30,35

26、,40,45DB 6,12,18,24,30,36,42,48,54DB 7,14,21,28,35,42,49,56,63DB 8,16,24,32,40,48,56,64,72DB 9,18,27,36,45,54,63,72,81IRP偽指令 格式: IRP 形參, ENDM 含義:將重復(fù)語句序列重復(fù)匯編,次數(shù)由實參個數(shù)所決定。 重復(fù)語句序列IRPC偽指令 格式: IRPC 形參,字符串 ENDM 含義:將重復(fù)語句序列重復(fù)匯編,次數(shù)由字符串中字符個數(shù)決定重復(fù)語句序列對上述宏定義的宏調(diào)用: PUSH REG 在匯編源程序時,宏展開可得: + PUSH AX + PUSH BX + PUSH CX + PUSH DX對上述宏定義的宏調(diào)用: POPREG DCBA在匯編期間,宏展開可得:+ POP DX+ POP CX+ POP BX+ POP AX例:編制一個用IRPC偽指令從堆棧中恢復(fù)寄存器內(nèi)容的宏定義: POPREG MACRO STRING IRPC REG,STRING POP REG&X ENDM ENDM 第第2323頁頁 匯編語言程序設(shè)計匯編語言程序設(shè)計 第第 13 章章 高級宏匯編語言技術(shù)高級宏匯編語言技術(shù)13.5 條件匯編條件匯編含義:匯編程序根據(jù)條件的不同匯編不同的程序段。 格式:IFIF 表達(dá)式 ; 為條

溫馨提示

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

評論

0/150

提交評論