版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、匯編語言程序設(shè)計,Assembly Language Programming,第七章 高級匯編語言技術(shù),2,教學(xué)重點:在掌握基本的匯編語言程序設(shè)計方法之后進(jìn)一步學(xué)習(xí)如何提高編程效率的各種實用方法: 宏匯編 重復(fù)匯編 條件匯編 ——統(tǒng)稱宏結(jié)構(gòu),宏(Macro)是匯編語言的一個特點,它是與子程序類似又獨具特色的另一種簡化源程序的方法。,3,宏——具有宏名的一段匯編語
2、句序列——宏定義時書寫宏指令——這段匯編語句序列的縮寫——宏調(diào)用時書寫宏展開——宏指令處用宏體代替的過程——宏匯編時實現(xiàn),7.1 宏匯編,宏的使用有三個步驟: 宏定義、宏調(diào)用、宏展開。,4,macro_name MACRO [啞元表] (宏定義體) ENDM,宏定義,啞元 相當(dāng)于C語言函數(shù)定義中形參,宏的參數(shù) 功能強大,頗具特色; 宏定義體 可以是任何合法
3、的匯編語句,既可以是硬指令序列,又可以是偽指令序列, 也可以使用已經(jīng)定義過的宏指令或者嵌套進(jìn)行宏定義; 配合宏,還有宏操作符和與宏有關(guān)的偽指令。,7.1.1 宏的使用過程,5,宏定義,mainbegin MACRO ;;定義名為mainbegin的宏,無參數(shù) mov ax,@data;;宏定義體 mov ds,ax ENDM;;宏定義結(jié)束mainend MACRO retnum ;;帶有啞元
4、retnum mov al,retnum ;;宏定義中使用參數(shù) mov ah,4ch int 21h ENDM,宏注釋符,7.1.1 宏的使用過程,6,macro_name [實元表],宏調(diào)用,start:mainbegin;宏調(diào)用,建立DS內(nèi)容dispmsg string;宏調(diào)用,顯示字符串mainend 0;宏調(diào)用,返回DOSend start 宏調(diào)用的實質(zhì)——在匯編過
5、程中進(jìn)行宏展開; 實元 相當(dāng)于C語言函數(shù)調(diào)用中的實參; 對宏指令的調(diào)用必須先定義后調(diào)用。,7.1.1 宏的使用過程,7,——在匯編時,用宏定義體的代碼序列替代宏指令的過程,宏展開,宏展開的具體過程——當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時,即用相應(yīng)的宏定義體取代源程序的宏指令,同時用位置匹配的實參對形參進(jìn)行取代; 若實元數(shù)>啞元數(shù),則多余的實元無效; 若實元數(shù)<啞元數(shù),則多余的啞元作“空NULL”處理。,7.
6、1.1 宏的使用過程,8,宏展開 舉例,start: mainbegin;宏指令 1 mov ax,@data;宏展開 1 mov ds,ax mainend 0;宏指令 1 mov al,0;宏展開 1 mov ah,4ch 1 int 21,7.1.1 宏的使用過程,9,——宏的參數(shù)使用非常靈活,宏的參數(shù),宏定義時, 可以無參數(shù),例如:mainbegin
7、可以帶有一個參數(shù),例如:mainend 也可以具有多個參數(shù), 例如:例7.1 實際參數(shù)可以是常數(shù)、變量、存儲單元、指令(操作碼)或它們的一部分,也可以是表達(dá)式。,7.1.2 宏的參數(shù),10,multiply MACRO opr1,opr2,result push dx push ax mov ax, opr1 imul opr2
8、 mov result, ax pop ax pop dx ENDM,宏展開: 1 push dx 1 push ax 1 mov ax, cx 1 imul var 1 mov xyz[bx],ax 1 pop ax 1 pop dx,例7.1 兩
9、個字相乘(多個變元),,,multiply cx, var, xyz[bx],7.1.2 宏的參數(shù),宏定義:,宏調(diào)用:,11,,savereg MACRO push ax push bx push cx push dx push si push di ENDM,宏調(diào)用: s
10、avereg宏展開: 1 push ax 1 push bx 1 push cx 1 push dx 1 push si 1 push di,例7.2保存寄存器(無參數(shù)),,,,7.1.2 宏的參數(shù),宏定義:,12,,宏定義:shrot MACRO op,od,num push cx mo
11、v cl,num op od,cl pop cx ENDM,宏展開: 1 push cx 1 mov cl,7 1 shl ax,cl 1 pop cx 1 push cx 1 mov cl,6 1 ror ax,cl 1 pop cx,例7.3統(tǒng)一循環(huán)移位和移位指令
12、 (變元是操作碼),宏調(diào)用: shrot shl, ax,7 shrot ror,x,6,,,7.1.2 宏的參數(shù),,13,,宏定義:shift MACRO op,od,num push cx mov cl,num s&op od,cl pop cx ENDM,例7.4 統(tǒng)一移位指令(變元是操作碼的一部分),宏調(diào)用: shift al, ax
13、,4 shift hr ax,4,,,宏展開: 1 push cx 1 mov cl,4 1 sal ax,cl 1 pop cx 1 push cx 1 mov cl,4 1 shr ax,cl 1 pop cx,,7.1.2 宏的參數(shù),14,與宏有關(guān)的偽操作,局部標(biāo)號偽操作——LOCAL
14、 標(biāo)號列表宏定義體采用了標(biāo)號,應(yīng)使用LOCAL加以說明,它必須是宏定義MACRO語句之后的第一條語句,宏展開時, LOCAL定義的標(biāo)號也由??0000~??FFFF替代宏定義刪除偽操作——PURGE 宏名表不需要某個宏定義時,可以把它刪除宏定義退出偽操作——EXITM偽指令EXITM表示結(jié)束當(dāng)前宏調(diào)用的展開,7.1.3與宏有關(guān)的偽操作,15,宏定義:absol MACRO oper LOCAL
15、next cmp oper, 0 jge next neg opernext: ENDM宏調(diào)用:absol var……absol bx,宏展開:1 cmp var, 01 jge ??00001 neg var??0000:
16、 ……1 cmp bx, 01 jge ??00011 neg bx1 ??0001: ……,例7.5 求絕對值(使用LOCAL偽操作),,7.1.3與宏有關(guān)的偽操作,16,宏定義:add MACRO opr1, opr2, result …… …… ENDM宏調(diào)用:……add xx, yy,
17、zzpurge add ; 取消宏定義……,宏指令名與指令助記符或偽操作名相同,宏指令的優(yōu)先級最高。,7.1.3與宏有關(guān)的偽操作,17,;;——宏注釋符,用于表示在宏定義中的注釋。采用這個符號的注釋,在宏展開時不出現(xiàn)。&——替換操作符,用于將參數(shù)與其他字符分開。如果參數(shù)緊接在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該偽操作符。%——表達(dá)式操作符,用在宏調(diào)用中,表示將后跟的一個表
18、達(dá)式的值作為實參,而不是將表達(dá)式本身作為參數(shù)。,宏操作符,7.1.4 宏操作符,18,——字符串傳遞操作符,用于括起字符串。在宏調(diào)用中,如果傳遞的字符串實參數(shù)含有逗號、空格等間隔符號,則必須用這對操作符,以保證字符串的完整。!——轉(zhuǎn)義操作符,用于指示其后的一個字符作為一般字符,不含特殊意義。,宏操作符,7.1.4 宏操作符,19,,例7.6 ( 使用 ;; 注釋),Q MACRO m ; display a
19、message 每次展開保留此注釋 ;; m is a string 每次展開不保留此注釋 …… ENDM,7.1.4 宏操作符,20,,leap macro cond, lab j&cond lab endm,,宏定義:,宏調(diào)用:,leap z, there……leap nz, here,,宏展開:,1
20、 jz there ……1 jnz here,,例7.7(變元是操作碼的一部分),7.1.4 宏操作符,21,msggen macro lab,num,xyz lab&num db ‘Hello MR. &XYZ’ endm,,宏定義:,宏調(diào)用:,Msggen msg,1,Wang,,宏展開:,例7.8(變元是ASCII串),msg1 db ‘Hello MR.
21、Wang’,,7.1.4 宏操作符,22,,,宏定義DATA1 MACRO A,B DW A,B ENDM宏調(diào)用 X=10 Y=20 DATA1 %X,%Y DATA2 X,Y,例7.9(使用 %),宏展開 1 DW 10,20 1 DW X,Y,,,,7.1.4 宏操作符,23,,dstringmacro string
22、db ’&string&’,0dh,0ah,’$’endm,,,宏定義:,宏調(diào)用:,dstringdstring,,宏展開:,1 db ’This is a example.’, 0dh,0ah,’$’1 db ’0 < Number < 10’, 0dh,0ah, ’$’,,例7.10 (使用和!),傳遞操作符,,!轉(zhuǎn)義操作符,,,,7.1.4 宏操作符,24,7.1.5 在宏定義內(nèi)使用宏
23、,宏定義體中可以使用宏,有兩種情形:宏定義中可以使用宏調(diào)用,前提是必須先定義后調(diào)用宏體中包含宏定義,25,例7.11 在宏定義內(nèi)使用宏調(diào)用,宏定義:dif MACRO x, y mov ax,x sub ax,y ENDMdifsqr MACRO x, y, z push dx push ax dif x,y imul ax
24、 mov z,ax pop ax pop dx ENDM,宏調(diào)用: difsqr v1, v2, v3宏展開: 1 push dx 1 push ax 2 mov ax,v1 2 sub ax,v2 1 imul ax 1 mov z,ax 1
25、 pop ax 1 pop dx,,,,26,例7.12 在宏定義內(nèi)使用宏調(diào)用,宏定義:dfmac MACRO mnam, op mnam MACRO x, y, z push ax mov ax,x op ax,y mov z,ax pop ax
26、 ENDM ENDM,宏調(diào)用: dfmac addition, add dfmac logor, or,,,則形成兩條宏指令:addition, logor,,宏調(diào)用宏展開: addtion x,y,z1 pushax1 movax,x1 addax,y1 movz,ax1 popax logorx,
27、y,z1 pushax1 movax,x1 orax,y1 movz,ax1 popax,,,,27,源程序(ASM文件)經(jīng)匯編程序匯編,主要輸出是OBJ文件和LST文件(列表文件)。LST文件同時列出源程序和機器語言程序清單,并給出符號表。.LALL—在LST清單中列出宏展開后的全部語句.SALL—在LST清單中不列出任何宏展開后的語句.XALL—只
28、列出產(chǎn)生目標(biāo)代碼的語句Page256~257 例7.12,列表偽操作,7.1.6 列表偽操作,28,1.縮短源代碼2.擴(kuò)充指令集3.改變某些助記符的意義,匯編語言程序指令,指令偽指令(偽操作)宏指令,,宏指令的用途,7.1 宏匯編,29,,子程序:在程序執(zhí)行期間被調(diào)用,只占用自身大小的一段空間,主程序,……call sub1……call sub1……call sub1……,子程序 sub1,…
29、… …… …… ret,,,,,,,宏調(diào)用與子程序調(diào)用的區(qū)別,7.1 宏匯編,30,,宏定義,宏調(diào)用,宏展開,Q macro x,y endm,,,…… Q a,b …… Q c,d …… Q e,f ……,…… …… …… ……,,,,,,,,,宏調(diào)用:在匯編期間被展開,每調(diào)用一次就把宏定義體展開一次。,7.1 宏匯編,31,比較,僅是源程
30、序級的簡化:宏調(diào)用在匯編時進(jìn)行程序語句的展開,不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒有改變通過形參、實參結(jié)合實現(xiàn)參數(shù)傳遞,簡捷直觀、靈活多變,還是目標(biāo)程序級的簡化:子程序調(diào)用在執(zhí)行時由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲單元或堆棧等傳遞參數(shù),宏,子程序,,,7.1 宏匯編,32,7.2 重復(fù)匯編,重復(fù)匯編指在匯編過程中,重復(fù)展開一段(基本) 相同的語句重復(fù)匯編沒有名字
31、,不能被調(diào)用重復(fù)匯編常用在宏定義體中,也可以在一般匯編語句中使用,重復(fù)匯編偽指令有三個: REPT——按參數(shù)值重復(fù) IRP——按參數(shù)個數(shù)重復(fù) IRPC——按參數(shù)的字符個數(shù)重復(fù)最后,用ENDM結(jié)束,7.2 重復(fù)匯編,33,,REPT格式: REPT 表達(dá)式 …… ; 重復(fù)塊 ENDM,例7.13X=0
32、 REPT 10X=X+1 DB X ENDM,,1 DB 11 DB 21 DB 3 ……1 DB 10,,匯編后:,7.2.1 重復(fù)偽操作REPT,7.2 重復(fù)匯編,34,CHAR=‘a(chǎn)’TABLE LABEL BYTE REPT 26
33、 DB CHARCHAR=CHAR+1 ENDM,,1 DB 61H1 DB 62H1 DB 63H ……1 DB 7AH,,匯編后:,例7.14 把字符‘A’到‘Z’的 ASCII 碼填入數(shù)組TABLE,35,IRP格式: IRP 啞元, …… ; 重復(fù)塊
34、 ENDM 每次重復(fù)用自變量表中的一項取代啞元,重復(fù)次數(shù)由自變量的個數(shù)決定。,例7.15 IRP REG, PUSH REGENDM,,1 PUSH AX1 PUSH BX1 PUSH CX1 PUSH DX,,匯編后:,7.2.2 不定重復(fù)偽操作 IRP,,36,data segment array la
35、bel byte IRP K, db ‘NO.&K’ ENDMdata ends,data segment array label byte 1 db ‘NO.1’ 1 db ‘NO.2’ 1 db ‘NO.3’ 1 db ‘NO.4’
36、 1 db ‘NO.5’data ends,,匯編后:,例7.16:在數(shù)據(jù)段產(chǎn)生字符區(qū)array,包括5個字符串‘NO.K’,37,IRPC格式: IRPC 啞元,字符串 …… ; 重復(fù)塊 ENDM 每次重復(fù)用字符串中的一個字符取代啞元,重復(fù)次數(shù)等于字符串中的字符數(shù)。例:在數(shù)據(jù)段產(chǎn)生字符區(qū)arra
37、y,包括5個字符串‘NO.K’,7.2.3 不定重復(fù)偽操作 IRPC,38,按參數(shù)字符個數(shù)重復(fù),IRPC regad,dcba pop ®ad&xENDM,1pop dx 1pop cx 1pop bx 1pop ax,39,data segment array label byte IRPC K, 12345
38、 db ‘NO.&K’ ENDMdata ends,data segment array label byte 1 db ‘NO.1’ 1 db ‘NO.2’ 1 db ‘NO.3’ 1 db ‘NO.4’ 1 db ‘NO.5’data ends,,匯
39、編后:,例7.17:在數(shù)據(jù)段產(chǎn)生字符區(qū)array,包括5個字符串‘NO.K’,,40,根據(jù)條件把一段源程序包括在匯編語言范圍內(nèi),或者排除在外 一般格式: IF?? 自變量 ; ??為條件 …… ; 自變量滿足條件則匯編此塊 [ELSE] …… ; 自變量不滿足條件
40、則匯編此塊 ENDIF,7.3 條件匯編,41,,IF 表達(dá)式IFE 表達(dá)式IFDEF 符號IFNDEF 符號IFB IFNB IFIDN ,IFDIF ,,詳見Page 266,常見條件匯編語句,42,pdatamacro num IF num lt 100;;如果num < 100,則匯編如下語句db num d
41、up (?) ELSE;;否則,匯編如下語句db 100 dup (?) ENDIFendmpdata 12 ;宏調(diào)用①db 12 dup(?) ;宏匯編結(jié)果①pdata 102 ;宏調(diào)用②db 100 dup(?) ;宏匯編結(jié)果②,例7.18,,,43,宏結(jié)構(gòu)的作用,宏匯編、重復(fù)匯編和條件匯編為源程序的編寫提供了很多方便,靈活運用它們可以編寫出非常
42、良好的源程序來匯編系統(tǒng)中有些以圓點起始的 偽指令(如.startup、.exit等)實際上是一種宏結(jié)構(gòu),44,dstringMACRO string;;定義字符串db '&string&',0dh,0ah,'$'ENDMmainbeginMACRO dsseg;;設(shè)置數(shù)據(jù)段地址mov ax,dssegmov ds,axENDMd
43、ispmsgMACRO messagemov dx,offset messagemov ah,09hint 21hENDM,45,mainendMACRO retnum;;返回DOS,可不帶參數(shù)ifb mov ah,4ch;;沒有參數(shù)else mov ax,4c00h+(retnum AND 0ffh);; 有參數(shù)endifint 21hENDM,46,.model smal
44、l.stack 256.datamsg1equ this bytedstringmsg2equ this bytedstring.codestart:mainbegin @data;建立DS內(nèi)容dispmsg msg1;顯示msg1字符串dispmsg msg2;顯示msg2字符串mainend;返回DOSend start,47,宏定義:MAX MACRO K, A,
45、B, C LOCAL NEXT, OUT MOV AX, A IF K-1 IF K-2 CMP C, AX JLE NEXT MOV AX, C ENDIFNEXT: CMP B, AX
46、JLE OUT MOV AX, B ENDIFOUT: ENDM,宏調(diào)用:MAX 1, PMAX 2, P, QMAX 3, P, Q, R,1 MOV AX, P1 ??0002: CMP Q, AX1 JLE ??00031 MOV AX, Q
47、1 ??0003:,1 MOV AX, P1 CMP R, AX1 JLE ??00041 MOV AX, R1 ??0004: CMP Q, AX1 JLE ??00051 MOV AX, Q1 ??0005:,,1 MOV
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- asm04 匯編語言程序格式
- asm05匯編器設(shè)計和實現(xiàn)
- 第七章 高級匯編語言技術(shù)
- ASM05匯編器的設(shè)計與實現(xiàn).pdf
- mt初級、高級試題匯編
- asm心得
- asm10 匯編語言與c、c++混合編程
- 高級無損檢測技術(shù)資格人員-磁粉檢驗考題匯編
- asm.DWG
- 高考?xì)v史試題匯編(07—17年)
- asm.DWG
- asm.DWG
- asm.DWG
- C#環(huán)境下的ASM高級頻譜管理仿真系統(tǒng)的研究與實現(xiàn).pdf
- 高級無損檢測技術(shù)資格人員滲透檢測培訓(xùn)復(fù)習(xí)題匯編
- 高級滲透檢測培訓(xùn)復(fù)習(xí)題匯編
- drill_asm.rar
- asm1.DWG
- duizhuang_asm.DWG
- asm2.DWG
評論
0/150
提交評論