版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第七章第七章 高級匯編語言技術(shù)高級匯編語言技術(shù)2方法方法2、當這組指令較短或不適合把它寫成一個子程序、當這組指令較短或不適合把它寫成一個子程序時,可以把它義成一個時,可以把它義成一個宏宏,每次需要執(zhí)行時就去調(diào)用,每次需要執(zhí)行時就去調(diào)用這個宏。這個宏。如果在一個程序中多次使用同一組指令時,為了避免如果在一個程序中多次使用同一組指令時,為了避免每次都要重寫,該如何解決?每次都要重寫,該如何解決?方法方法1、把這組指令寫成一個、把這組指令寫成一個子程序子程序,每次需要執(zhí)行時,每次需要執(zhí)行時只要調(diào)用這個子程序就可以了。只要調(diào)用這個子程序就可以了。37.1 7.1 宏匯編宏匯編 為用戶提供更加容易、更
2、加靈活、更加向高級語言靠攏的為用戶提供更加容易、更加靈活、更加向高級語言靠攏的匯編工具。匯編工具。 DEBUG不認識宏指令不認識宏指令宏宏:源程序中一段有獨立功能的程序代碼。:源程序中一段有獨立功能的程序代碼。宏指令宏指令:用戶自定義的指令。在編程時,將:用戶自定義的指令。在編程時,將多次使用的功能多次使用的功能 用一條宏指令來代替。用一條宏指令來代替。 匯編語言程序語句匯編語言程序語句指令指令偽指令(偽操作)偽指令(偽操作)宏指令宏指令4宏定義宏定義 macro_namemacro_name MACRO 啞元表啞元表 ; 形參形參/ /虛參虛參 LOCAL 標號表標號表 ENDM* * ma
3、cro_namemacro_name 宏指令名(宏名),調(diào)用時用。宏指令名(宏名),調(diào)用時用。 第一個符號必須是字母(注意與名稱的差異)第一個符號必須是字母(注意與名稱的差異)* * 啞元表啞元表 形參表,啞元之間用逗號隔開形參表,啞元之間用逗號隔開 * * 如果宏定義體有一個或多個標號,則必須用如果宏定義體有一個或多個標號,則必須用LOCAL偽操作偽操作列出所有的標號。列出所有的標號。(宏定義體)(宏定義體)一段有獨立功一段有獨立功能的程序代碼能的程序代碼5宏調(diào)用宏調(diào)用 macro_namemacro_name 實元表實元表 ; 實參實參* * 實元表中的實元與啞元表中的啞元在位置上一一對應(yīng)
4、實元表中的實元與啞元表中的啞元在位置上一一對應(yīng); ;* * 若實元數(shù)若實元數(shù) 啞元數(shù),則多余的實元無效啞元數(shù),則多余的實元無效; ;* * 若實元數(shù)若實元數(shù) 啞元數(shù),則多余的啞元作啞元數(shù),則多余的啞元作“空空( (NUL)”)”處理處理; ;* * 對宏指令的調(diào)用必須先定義后調(diào)用。對宏指令的調(diào)用必須先定義后調(diào)用。* * 應(yīng)當注意,宏展開后,即用實參取代形式參數(shù)之后,所應(yīng)當注意,宏展開后,即用實參取代形式參數(shù)之后,所得到的語句應(yīng)該是有效的,否則匯編時會出錯得到的語句應(yīng)該是有效的,否則匯編時會出錯。6宏展開宏展開 源程序被匯編時,匯編程序把宏調(diào)用展開。源程序被匯編時,匯編程序把宏調(diào)用展開。把宏定義
5、體復(fù)制到調(diào)用宏指令的位置上,把宏定義體復(fù)制到調(diào)用宏指令的位置上,用實元取代啞元用實元取代啞元由由LOCAL定義的標號也由定義的標號也由?0000?FFFF替代。替代。7宏匯編例子:定義一個把16位通用寄存器壓棧的宏。PUSHRMACROPUSH AXPUSH BXPUSH CXPUSH DXENDM定義二個字存儲變量相加的宏 MADDMMACROOPRD1,OPRD2PUSH AXMOV AX, OPRD2ADDOPRD1, AXPOPAXENDM8例例7.1 兩個字相乘兩個字相乘宏定義:宏定義:multiplymultiply MACROMACRO opr1opr1, ,opr2opr2,
6、,resultresult push dx push dx push ax push ax mov mov ax, ax, opr1opr1 imul imul opr2opr2 mov mov resultresult, ax, ax pop ax pop ax pop dx pop dx ENDMENDM宏調(diào)用:宏調(diào)用: multiplymultiply cxcx, , varvar, , xyzbxxyzbx 宏展開:宏展開: + push dx+ push dx + push ax + push ax + mov + mov ax, ax, cxcx + imul + imul var
7、var + mov + mov xyzbxxyzbx , ax, ax + pop ax + pop ax + pop dx + pop dx9宏調(diào)用與子程序調(diào)用的區(qū)別:宏調(diào)用與子程序調(diào)用的區(qū)別:子程序:在程序執(zhí)行期間被調(diào)用,只占用自身大小的一段空間。子程序:在程序執(zhí)行期間被調(diào)用,只占用自身大小的一段空間。主程序主程序call call sub1sub1call call sub1sub1call call sub1sub1子程序子程序 sub1sub1 ret ret10 宏調(diào)用:在匯編期間被展開宏調(diào)用:在匯編期間被展開,每調(diào)用一次就把宏定義體每調(diào)用一次就把宏定義體 展開一次展開一次。宏定義
8、宏定義宏調(diào)用宏調(diào)用宏展開宏展開Q macro x,yQ macro x,y endmendm Q a,b Q a,b Q c,d Q c,d Q e,f Q e,f 11 (1)子程序調(diào)用是在程序執(zhí)行期間執(zhí)行期間進行的,主程序通過CALL指令轉(zhuǎn)入于程序的入口地址去執(zhí)行子程序,子程序執(zhí)行完后RET指令返回到主程序的調(diào)用處(斷點處);而宏調(diào)用是通過宏指令名和實在參數(shù)(如果有要傳遞的參數(shù)的話)進行調(diào)用的,而且是在匯編期間匯編期間展開宏定義體的。 (2)子程序中的這組指令的機器碼在存儲器中只需要存放一次只需要存放一次;而宏調(diào)用則不同,每調(diào)用一次就把宏定義體展開一次,因而它占有的存儲空占有的存儲空間與調(diào)
9、用次數(shù)有關(guān)間與調(diào)用次數(shù)有關(guān),調(diào)用次數(shù)越多則占有的存儲空間就越大。 (3)子程序調(diào)用時需要用堆棧,調(diào)用子程序和返回主程序都要開銷必開銷必要的時間要的時間;而宏調(diào)用其宏定義體展開是插入在調(diào)用程序中,因此避免了避免了調(diào)用時跳到宏和由宏返回所開銷的時間調(diào)用時跳到宏和由宏返回所開銷的時間。12子程序:子程序:優(yōu)點:模塊化,節(jié)省內(nèi)存,可被多次調(diào)用,編程效率高。優(yōu)點:模塊化,節(jié)省內(nèi)存,可被多次調(diào)用,編程效率高。缺點:額外開銷(保存返回地址,計算轉(zhuǎn)向地址,傳遞參缺點:額外開銷(保存返回地址,計算轉(zhuǎn)向地址,傳遞參 數(shù)等)大,增加了執(zhí)行時間。適用于子功能代碼較數(shù)等)大,增加了執(zhí)行時間。適用于子功能代碼較 長、調(diào)用
10、比較頻繁的情況。長、調(diào)用比較頻繁的情況。宏調(diào)用:宏調(diào)用:優(yōu)點:參數(shù)傳送簡單,執(zhí)行效率高。優(yōu)點:參數(shù)傳送簡單,執(zhí)行效率高。缺點:不節(jié)省空間,適用于子功能代碼較短、傳參較多的缺點:不節(jié)省空間,適用于子功能代碼較短、傳參較多的 情況。情況。13 可以無變元 可以是操作碼 可以是操作碼的一部分,但在宏定義體中必須用 &來分隔。 變元是ASCII串 %操作符7.1.2 宏定義中的參數(shù)宏定義中的參數(shù)14例例7.2 保存寄存器保存寄存器(無變元無變元)宏定義:宏定義:saveregsavereg MACROMACRO push ax push ax push bx push bx push cx push
11、cx push dx push dx push si push si push di push di ENDMENDM宏調(diào)用:宏調(diào)用: saveregsavereg宏展開:宏展開: + push ax+ push ax + push bx + push bx + push cx + push cx + push dx + push dx + push si + push si + push di + push di15例例7.3 變元可以是操作碼變元可以是操作碼宏定義:宏定義: foofoo MACRO p1,p2,p3MACRO p1,p2,p3 mov mov ax,p1 ax,p1 p2
12、 p3 p2 p3ENDMENDM宏調(diào)用:宏調(diào)用: foo word_var,inc,axfoo word_var,inc,ax宏展開:宏展開: + mov ax,word_var+ mov ax,word_var + inc ax + inc ax16宏匯編操作符宏匯編操作符 & ; %符號符號1 & 符號符號2 ; 宏展開時宏展開時, ,合并前后兩個符號形成一個符號。合并前后兩個符號形成一個符號。leap leap macromacro cond cond, lab, lab j j& &condcond lab lab endmendm宏定義:宏定義:宏調(diào)用:宏調(diào)用:leap z, th
13、ereleap z, thereleap nzleap nz, here, here宏展開:宏展開:+ jz+ jz there there + jnz+ jnz here here例例7.47.417例例7.5宏定義:宏定義: fo macro p1 jmp ta&p1 endm宏調(diào)用:宏調(diào)用: fo word_var宏展開:宏展開:jmp taword_var18例例7.6 變元可以是變元可以是ASCII碼碼宏定義:宏定義: msggen macro lab,num,xyz lab&num db HELLO MR.&xyz endm宏調(diào)用:宏調(diào)用: msggen msg,1,taylor宏
14、展開:宏展開:msg1 db HELLO MR.taylor19例例7.7 %的使用的使用宏定義:宏定義: msg macro count,stringmsg macro count,string msg&count msg&count db string db stringendmendm errmsg errmsg macro text macro text cntr cntr=cntr+1=cntr+1 msg % cntr,text msg % cntr,textendmendm宏調(diào)用:宏調(diào)用: cntr=0; errmsg syntax error宏展開:宏展開:msg1 db sy
15、ntax error% 表達式表達式 ; 匯編程序?qū)R編程序?qū)?后面的表達式轉(zhuǎn)換為數(shù)字,并在后面的表達式轉(zhuǎn)換為數(shù)字,并在展開期間用這個數(shù)取代啞元。展開期間用這個數(shù)取代啞元。207.1.3 LOCAL偽操作偽操作宏定義:宏定義:absolabsol MACROMACRO oper oper cmp oper cmp oper, 0, 0 jge jge next next neg oper neg opernextnext: : ENDMENDM宏調(diào)用:宏調(diào)用:absolabsol var varabsolabsol bx bx宏展開:宏展開: cmp var, 0 jge ?0000 neg
16、varnext: cmp bx, 0 jge ?0000 neg bxnext:next多重定義多重定義21在宏定義中允許使用標號。如果在程序中多次使用該宏定義時。展開后會出現(xiàn)標號的多重定義,這是不允許的??梢杂脗沃噶頛OCAL指定局部標號。 格式LOCAL 局部標號表 說明 局部標號表中的各標號之間用逗號分隔。對局部中標號表中的各標號建立唯一的符號(?000一?FFFF)以取代展開后的各局部標號。該偽指令必須是宏定義體中的第一個語句,而且在該偽指令必須是宏定義體中的第一個語句,而且在MACR O和和LOCAL之間還不允許有注釋和分號標志。之間還不允許有注釋和分號標志。22例例 求絕對值求絕對
17、值(使用使用LOCAL偽操作偽操作)宏定義:宏定義:absolabsol MACRO oper MACRO oper LOCAL nextLOCAL next cmp oper cmp oper, 0, 0 jge jge next next neg oper neg opernextnext: : ENDM ENDM宏調(diào)用:宏調(diào)用:absolabsol var varabsolabsol bx bx宏展開:宏展開: + cmp var, 0+ jge ?0000+ neg var+ ?0000: + cmp bx, 0+ jge ?0001+ neg bx+ ?0001: 237.1.4 在
18、宏定義體內(nèi)使用宏在宏定義體內(nèi)使用宏限制條件:必須先定義后調(diào)用限制條件:必須先定義后調(diào)用在宏定義體內(nèi)不僅可以使用宏,也可以包含宏定義(宏定義允許嵌套)24宏定義體內(nèi)引用其它的宏例如:ABSMACRO OPRD1, OPRD2MOPM SUB, OPRD1, OPRD2 ;引用已定義的宏ENDM在定義宏ABS時,引用了前面已定義好的宏MOPM。25宏定義體內(nèi)定義其它的宏 宏的定義體內(nèi)又定義了其它宏,只有在先引用了外層的宏定義,才能引用內(nèi)層的宏,這是因為,當外層宏展開后,內(nèi)層宏的定義才變得有效。 26OPMMMACRONAME, OPNAMEMACROOPRD1, OPRD2, OPRD3PUSH
19、AXMOV AX, OPRD2OPAX, OPRD3MOV OPRD1, AXPOPAXENDMENDM閱讀例7.11277.1.5 列表偽操作列表偽操作.XALL 默認值, 只列出產(chǎn)生目標碼的宏展開.LALL 列出包括注釋在內(nèi)的所有宏展開.SALL 不列出任何展開信息功能: 控制匯編清單匯編清單中宏展開的列出情況.LISTMACROALL.LISTMACRO.NOLISTMACROMASM6.0+源程序源程序(ASM文件文件)經(jīng)匯編程序匯編,主要輸出是經(jīng)匯編程序匯編,主要輸出是OBJ文件和文件和LST文件文件(列表文件列表文件)。LST文件同時列出源程序文件同時列出源程序和機器語言程序清單,
20、并給出符號表。和機器語言程序清單,并給出符號表。28; 注釋注釋 ; 宏展開時,宏展開時,;后面的注釋不予展開。后面的注釋不予展開。 例:例:Q MACRO m ; display a message 每次展開保留此注釋每次展開保留此注釋 ; m is a string 每次展開不保留此注釋每次展開不保留此注釋 ENDM 閱讀例7.12297.1.6 宏庫的建立與調(diào)用宏庫的建立與調(diào)用宏庫宏庫:只包含若干宏定義的文件,擴展名為MAC或LIB宏庫的調(diào)用:宏庫的調(diào)用: 在程序的開始用INCLUDE語句說明,例如 INCLUDE C:MACRO.MAC INCLUDE D:AAAEEE.LIB 注:
21、INCLUDE語句可以不放在程序的最前面 必須放在所有的宏調(diào)用之前宏庫的建立:宏庫的建立: 由定義即可閱讀例子程序P259307.1.7 PURGE偽操作偽操作宏指令名可與指令助記符和偽指令名同名同名,但這時宏指令的優(yōu)先級最高,而同名的指令和偽操作便失效。格式: PURGE 宏指令名,宏指令名, PURGE可取消多個宏定義,而各宏指令名之間應(yīng)以逗號分 隔。功能:取消宏定義,使該宏定義為空。偽指令PURGE可取消宏定義,恢復(fù)指令的原來功效。31例例 宏指令名與指令助記符或偽操作名相同,宏指令宏指令名與指令助記符或偽操作名相同,宏指令 的優(yōu)先級最高。的優(yōu)先級最高。宏定義:宏定義:addadd MA
22、CROMACRO opr1, opr2, result opr1, opr2, result ENDMENDM宏調(diào)用:宏調(diào)用:addadd xx, yy, zz xx, yy, zzpurge purge add add ; ; 取消宏定義取消宏定義327.2 7.2 重復(fù)匯編重復(fù)匯編在編寫匯編語言程序中,有時需要進行在編寫匯編語言程序中,有時需要進行連續(xù)地重復(fù)連續(xù)地重復(fù)完完成相同的或幾乎完全相同的操作,這時可以使用重復(fù)匯成相同的或幾乎完全相同的操作,這時可以使用重復(fù)匯編,使書寫的程序變得相當簡潔。編,使書寫的程序變得相當簡潔。重復(fù)匯編有兩種格式重復(fù)匯編有兩種格式 重復(fù)偽操作重復(fù)偽操作 不定重
23、復(fù)偽操作不定重復(fù)偽操作33 說明 REPT和ENDM為偽指令,它們必須成對出現(xiàn),中間是要重復(fù)的指令體,重復(fù)的次數(shù)重復(fù)的次數(shù)由表達式的值來決定。 注意:重復(fù)偽操作并不一定要用在宏定義體內(nèi)。格式 REPT 表達式 . ENDM7.2.1 重復(fù)偽操作重復(fù)偽操作34例題:7.13X=0 REPT 10X=X+1 DB X ENDM 匯編后產(chǎn)生1DB 11 DB 22DB 3 .1 DB 10 例題:7.14 將字符A-Z填入到數(shù)組TABLECHAR =A TABLE LABLE BYTE REPT 26 DB CHAR CHAR=CHAR+1 ENDM 匯編后產(chǎn)生1DB41H1DB42H1DB5AH閱
24、讀例7.15 7.1635IRP 偽操作格式 IRP 形式參數(shù),參數(shù)表 (指令體) ENDM 說明 IRP和ENDM偽指令必須成對出現(xiàn),其間是要重復(fù)的指令體。重復(fù)的次數(shù)重復(fù)的次數(shù)由參數(shù)表中參數(shù)的個數(shù)所決定,而且每重復(fù)一次,依次用參數(shù)表中的參數(shù)來代替形式參數(shù)。參數(shù)表必須用尖括號尖括號括起來,參數(shù)間用逗號分隔。7.2.2 不定重復(fù)偽操作不定重復(fù)偽操作 IRP偽操作36例題:7.17IRP X, DB XENDM 匯編后1DB 11 DB 2.1 DB 9閱讀例7.1837IPRC偽操作格式 IRPC 形式參數(shù),字符串(或字符串) (指令體) ENDM 說明 偽指令I(lǐng)RPC和ENDM必須成對出現(xiàn),其
25、間是重復(fù)的指令體,重復(fù)的次數(shù)重復(fù)的次數(shù)取決于字符串中字符的個數(shù),在每次重復(fù)時,依次用字符串的字符代替形式參數(shù)。7.2.2 不定重復(fù)偽操作不定重復(fù)偽操作 IPRC偽操作38例題:7.19IRPC X, 01234567DB X+1ENDM 匯編后1DB 11 DB 21 DB 8閱讀例7.2039練習(xí):1、定義100個初值為32的字節(jié)單元,該存儲單元的起始符號地址為TableTableLABELTYPE REPT 100DB32 ENDM 40練習(xí):2、計算1+2+1000,并把其值存入寄存器AX MOVAX, 0 COUNT = 1 REPT 1000 ADDAX, COUNT COUNT =
26、 COUNT + 1 ENDM 41練習(xí):3、定義10個字節(jié)存儲單元,保存數(shù)字09的平方數(shù) IRPCX, 0123456789DB X*XENDM42練習(xí):4、以宏方式,輸出以下圖形43hang macro nlocal nextmmov cx,nmov dl,*mov ah,2nextm:int 21hloop nextmendmcode segmentmain proc farassume cs:codestart:push dssub ax,axpush axmov si,5xh:hang sicall crlfDEC sicmp si,1jae xhretmain endpcrlf p
27、roc nearmov dl,0dhmov ah,2int 21hmov dl,0ahint 21hretcrlf endp;-code endsend start閱讀并匯編li10.asm44練習(xí):5、以宏方式,求兩數(shù)的最大公約數(shù)gys macro m,nlocal xh,nexttmov ax,mmov cx,nxh:mov dx,0div cxcmp dx,0je nextmov ax,cxmov cx,dxjmp xhnext:mov bx,cxcall binidecendm閱讀并匯編gys.asm45練習(xí):6、編寫一個宏,求1-1000之間的水仙花數(shù)例如:370為水仙花數(shù),因為1*
28、1*1+3*3*3+7*7*7=370閱讀并匯編sxh.asm46練習(xí):7、編寫一個宏,實現(xiàn)如下簡單的動圖閱讀并匯編jt.asm47練習(xí):8、編寫宏,實現(xiàn)如下簡單的動圖閱讀并匯編hfk1.asm487.3 7.3 條件匯編條件匯編 匯編語言提供了一組條件偽操作,用來指示編程序?qū)o定的條件進行測試,并根據(jù)測試的結(jié)果有選擇地對一段語句進行匯編處理。換句話說,匯編程匯編程序根據(jù)給定的條件是否為真來決定對一段語句是否序根據(jù)給定的條件是否為真來決定對一段語句是否進行匯編。進行匯編。49格式 IF xxxx 表達式 條件為真匯編此塊 ELSE 條件為假匯編此塊ENDIF 說明其中,IF xxxx表示條件偽操作命令,它必須與ENDIF相配對。匯編程序?qū)τ跅l件偽操作命令中給定的條件進行檢測,若條件成立(真),則匯編整個塊。如果其中有ELSE命令,當條件成立時則只匯編從IF xxxx到ELSE之間的那一塊
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銷售人員入職培訓(xùn)與職業(yè)發(fā)展合同
- 公開課《土地的誓言》課件
- 區(qū)塊鏈在體育領(lǐng)域的應(yīng)用案例考核試卷
- 2025版學(xué)校浴室熱水供應(yīng)設(shè)備采購與安裝合同3篇
- 2025版土地使用權(quán)出讓居間合同(高端定制版)3篇
- 2025年博主合作廣告合同
- 2025年度健康養(yǎng)生門面店鋪轉(zhuǎn)讓及服務(wù)項目合作協(xié)議4篇
- 2025年博物文化貸款合同
- 2025年高校外國文教專家教學(xué)與研究合作合同3篇
- 2025年公司增資協(xié)議書模板
- 乳腺癌的綜合治療及進展
- 【大學(xué)課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識培訓(xùn)課件
- 2024年山東省泰安市初中學(xué)業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 2024安全員知識考試題(全優(yōu))
- 中國移動各省公司組織架構(gòu)
- 昆明手繪版旅游攻略
- 法律訴訟及咨詢服務(wù) 投標方案(技術(shù)標)
- 格式塔心理咨詢理論與實踐
評論
0/150
提交評論