




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章宏匯編及其它高級(jí)偽操作
宏匯編語(yǔ)言提供了類(lèi)似于高級(jí)語(yǔ)言的某些復(fù)雜功能,如宏匯編、重復(fù)匯編與條件匯編,提高了使用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的質(zhì)量和效率。9.1宏匯編宏是源程序中一段有獨(dú)立功能的程序代碼。它只需要在源程序中定義一次,就可以多次調(diào)用,調(diào)用時(shí)只需要用一個(gè)宏指令語(yǔ)句就可以了。宏功能既可以實(shí)現(xiàn)程序復(fù)用,又能方便的傳遞多個(gè)參數(shù)。子程序優(yōu)點(diǎn):省存儲(chǔ)空間優(yōu)化程序結(jié)構(gòu)便于調(diào)試和修改子程序缺點(diǎn):調(diào)用、返回、保存、恢復(fù)需花開(kāi)銷(xiāo)參數(shù)傳遞復(fù)雜因此,在程序較短,或需要傳送的參數(shù)較多的情況下,用宏匯編更加有利。9.1.1宏定義、宏調(diào)用和宏展開(kāi)宏定義:宏指令名MACRO[形參1,形參2,…]<宏定義體>ENDM宏定義體是一組有獨(dú)立功能的程序代碼。宏指令名給出宏定義的名稱(chēng),調(diào)用時(shí)就使用宏指令名來(lái)調(diào)用宏定義。第一個(gè)符號(hào)必須是字符。啞元表給出了宏定義中所用到的形式參數(shù),每個(gè)啞元之間用逗號(hào)隔開(kāi)。宏調(diào)用:宏指令名[實(shí)參1,實(shí)參2,…]宏指令被定義后,在源程序中就可以直接調(diào)用,稱(chēng)為宏調(diào)用。一般說(shuō)來(lái),實(shí)參的個(gè)數(shù)應(yīng)和形參的個(gè)數(shù)相等,但匯編程序并不要求它們必須相等。若實(shí)參個(gè)數(shù)大于形參個(gè)數(shù),則多余的實(shí)參不予考慮,若實(shí)參個(gè)數(shù)小于形參個(gè)數(shù),則多余的形參取空值。宏展開(kāi):在對(duì)源程序的匯編階段,匯編程序?qū)υ闯绦蛑械拿總€(gè)宏調(diào)用都進(jìn)行了宏展開(kāi),即用宏定義體取代源程序中宏指令名,用實(shí)參取代形參。應(yīng)該注意,用實(shí)參取代形參后,所得到的語(yǔ)句應(yīng)該是有效的,否則匯編程序?qū)?huì)指示出錯(cuò)。例9.1用宏指令實(shí)現(xiàn)兩數(shù)的相加。宏定義:sumnMACROx,y,result movax,x
addax,y
movresult,ax ENDMsumnMACROx,y,result
movax,x
addax,y
movresult,ax
ENDM宏展開(kāi):1movax,341addax,251movbx,ax
宏調(diào)用:sumn34,25,bx
例9.2用宏指令實(shí)現(xiàn)兩個(gè)八位有符號(hào)數(shù)的乘法。宏定義:imultiplyMACROx,y,result pushax moval,x
imuly
movresult,ax popax ENDM宏展開(kāi):1pushax1moval,cl1imuldl1mov[bx],ax1popax┇1pushax1moval,ary1imulvar1movsave,ax1popax宏調(diào)用:imultiplycl,dl,[bx]…imultiplyary,var,save例9.3某工廠工人的周工資由計(jì)時(shí)工資和計(jì)件工資組成,計(jì)時(shí)工資按每小時(shí)工資率RATE乘以工作小時(shí)數(shù)計(jì)算;計(jì)件工資按超定額部分乘以SUP計(jì)算(超定額=實(shí)際完成的工件數(shù)MADE-定額工件數(shù)PART),工資總額放在WAGE中。宏定義如下:
wagesmacrorate,hour,made,part,supwage=rate*hour+(made-part)*supendmrate=5part=100sup=4宏調(diào)用:wagesrate,40,120,part,sup宏展開(kāi)為:wage=rate*40+(120-part)*sup從以上兩個(gè)例子可以看出,子程序和宏指令具有類(lèi)似的功能,但又有以下區(qū)別:空間的區(qū)別:宏指令并不節(jié)省目標(biāo)程序的空間,而子程序在目標(biāo)程序中只有一段;時(shí)間的區(qū)別:宏指令在運(yùn)行時(shí)不需要其他額外的CPU開(kāi)銷(xiāo),而子程序的調(diào)用、返回和保護(hù)現(xiàn)場(chǎng)、恢復(fù)現(xiàn)場(chǎng)需要占用時(shí)間;參數(shù)的區(qū)別:宏調(diào)用可實(shí)現(xiàn)多個(gè)參數(shù)的直接代換,方式簡(jiǎn)單靈活,而子程序參數(shù)傳遞麻煩。
9.1.2宏定義的嵌套這種嵌套結(jié)構(gòu)的特點(diǎn)是外層宏定義的宏體中又有宏定義,只有調(diào)用外層宏定義一次后,才能調(diào)用內(nèi)層宏指令。例9.4用嵌套的宏定義實(shí)現(xiàn)兩個(gè)八位數(shù)的算術(shù)運(yùn)算。宏定義:mathMACROmathname,action,nummathnameMACROx,y,result pushax movnum,x actiony movresultax popax ENDMENDM宏調(diào)用:
mathimultiply,imul,al宏展開(kāi):imultiplyMACROx,y,resultpushaxmoval,ximulymovresult,axpopax ENDM宏調(diào)用:
mathdivide,div,ax宏展開(kāi):divideMACROx,y,resultpushax movax,xdivy movresult,ax popax ENDM接下來(lái)可使用宏調(diào)用:divideary,var,save則宏展開(kāi)如下:1pushax1movax,ary1divvar1movsave,ax1popax9.1.3宏定義中使用宏調(diào)用宏定義中使用的宏調(diào)用必須已經(jīng)定義。例9.5用宏指令實(shí)現(xiàn)顯示字符。宏定義:INT21MACROFUNCTN MOVAH,F(xiàn)UNCTN INT21H ENDMDISPCMACROCHAR MOVDL,CHAR INT212 ENDM宏調(diào)用:DISPC‘A’宏展開(kāi): 1MOVDL,‘A’ 2MOVAH,2 2INT21H這里的2表示第二層展開(kāi)結(jié)果。9.1.4帶間隔符的實(shí)參在宏調(diào)用中,有時(shí)實(shí)參使用的是字符串(不是單引號(hào)括起來(lái)的),而是字符串中包含間隔符(如空格、逗號(hào)等),為使間隔符成為實(shí)參的一部分,則要用尖括號(hào)將字符串括起來(lái)作為一個(gè)實(shí)參的整體來(lái)替換形參。例9.6在數(shù)據(jù)段中定義40個(gè)字節(jié)的存儲(chǔ)空間。
defdbmacrobuf,xbufxendmdatasegmentdefdbarray,<db40dup(?)>dataends…宏展開(kāi)為:
1arraydb40dup(?)
9.1.5連接操作符&用連接操作符&可連接實(shí)參,形成一個(gè)完整的符號(hào)或字符串。例9.7用操作符&連接實(shí)參,生成指令中的操作碼。宏定義:shiftMACROrig,m,n movcl,n
s&mrig,cl
ENDMshiftMACROrig,m,n
movcl,n
s&mrig,cl
ENDM宏調(diào)用:shiftax,hl,4shiftdx,hr,2宏展開(kāi):1movcl,41shlax,cl1movcl,21shrdx,cl例9.8用操作符&連接實(shí)參,生成指令中的操作數(shù)。宏定義:studentmacrorec,n,name,tel recdb&n rec1db‘&name&,&tel’ rec2db‘&computer’ endmstudentmacrorec,n,name,tel
recdb&n
rec1db‘&name&,&tel’
rec2db‘&computer’
endm宏調(diào)用:
studentmsg,1,wang,12345678宏展開(kāi):1msgdb11rec1db‘wang,12345678’ 1rec2db‘&computer’
9.1.6宏替換操作符%宏替換:匯編程序把跟在%后的表達(dá)式的值轉(zhuǎn)換為當(dāng)前基數(shù)下的數(shù),在展開(kāi)期間用這個(gè)數(shù)來(lái)取代形參(啞元)。格式:%表達(dá)式例9.9用操作符%將實(shí)參的值替換形參。宏定義: studentmacrorec,n,msg rec&ndbmsg endm宏調(diào)用: n=1 studentnumb,%n,‘wang,12345678’ n=n+1 studentnumb,%n,‘zhou,56781234’9.1.7LOCAL偽操作在宏定義中,常常使用標(biāo)號(hào),當(dāng)多次宏調(diào)用后,就會(huì)出現(xiàn)標(biāo)號(hào)重復(fù)定義的錯(cuò)誤。顯然在程序中多次調(diào)用該宏定義時(shí),則展開(kāi)后會(huì)出現(xiàn)標(biāo)號(hào)的多次重復(fù)定義,這是不允許的。為此,系統(tǒng)提供了LOCAL偽操作。例9.10宏定義體中使用標(biāo)號(hào)。錯(cuò)誤形式宏定義: cmpdatamacror1,r2,max cmpr1,r2 jgemr1 movmax,r2 jmpmr2 mr1:movmax,r1 mr2: endm宏調(diào)用: cmpdataax,bx,var cmpdatadx,cx,valueLOCAL偽操作格式:LOCAL符號(hào)[,符號(hào)]匯編程序?qū)OCAL偽操作定義的符號(hào)說(shuō)明為局部標(biāo)號(hào),對(duì)每一個(gè)局部標(biāo)號(hào)建立唯一的符號(hào)(用??0000~??FFFF)來(lái)代替每個(gè)局部標(biāo)號(hào)。注意:LOCAL偽操作只能用在宏定義體內(nèi),而且必須是MACRO偽操作后的第一個(gè)語(yǔ)句。正確形式宏定義: cmpdatamacror1,r2,max localmr1,mr2 cmpr1,r2 jgemr1 movmax,r2 jmpmr2mr1:movmax,r1 mr2: endm宏調(diào)用: cmpdataax,bx,var cmpdatadx,cx,value宏展開(kāi):1cmpax,bx1jge??00001movvar,r21jmp??00011??0000:movvar,r11??0001:1cmpdx,cx1jge??00021movvar,r21jmp??00031??0002:movvar,r11??0003:9.1.8使用宏庫(kù)文件如果程序中定義了多個(gè)宏,用戶可以把它們集中建立在一個(gè)獨(dú)立的宏庫(kù)文件中。宏庫(kù)文件為文本文件,擴(kuò)展名可為MAC。用INCLUDE偽指令加入宏庫(kù)文件,格式:INCLUDE宏庫(kù)文件名宏庫(kù)文件和當(dāng)前源程序中定義的標(biāo)識(shí)符不能重復(fù)。例9.11宏庫(kù)文件STDIO.MAC是關(guān)于輸入/輸出的文件。內(nèi)容如下: crequ13 lfequ10 getcharmacro movah,1 int21h endm putcharmacroasc movah,2 movdl,asc int21h endm printsmacromsg movah,9 movdx,offsetmsg int21h endm inputsmacroconbuf movah,10 movdx,offsetconbuf int21h endm crlfmacro putcharcr putcharlf endm exitmacro movah,4ch int21h endm例9.12在程序中加入宏庫(kù)文件STDIO.MAC,并使用其中的宏指令。程序內(nèi)容如下: includestdio.mac datasegment stringdb16,?,16dup(?) msgboxdb‘輸入字符串請(qǐng)用$結(jié)束’,13,10,‘$’ dataends codesegmentassumecs:code,ds:data start: getchar;輸入一個(gè)字符 crlf;輸出回車(chē)換行 putchar‘a(chǎn)’;輸出一個(gè)字符 crlf;輸出回車(chē)換行 inputsstring;輸入字符串 crlf;輸出回車(chē)換行 printsstring+2;輸出字符串 exit;退出程序codeends endstart下列程序是在3個(gè)數(shù)中找出最小的數(shù)并放入al,在括號(hào)中填入指令使其完整。 moval,x movbl,ymovcl,z cmpal,bl (1)(2)l1:cmpal,cl(3)(4)l2:ret空1的答案jll1xchgal,blxchgal,cljlel2ABCD提交單選題10分空2的答案jll1xchgal,blxchgal,cljlel2ABCD提交單選題10分空3的答案jll1xchgal,blxchgal,cljlel2ABCD提交單選題10分空4的答案jll1xchgal,blxchgal,cljlel2ABCD提交單選題10分?jǐn)?shù)據(jù)段如下:datasegmentda1 db 1,2,‘a(chǎn)bcd’
count=$-da1da2db9dup(?)dataends補(bǔ)充括號(hào)處的指令,使得程序把DA1數(shù)據(jù)區(qū)數(shù)據(jù)移到DA2數(shù)據(jù)區(qū)。mov ax,datamovds,axmov es,(5)mov cx,(6)movsi,(7)movdi,(8)(9)
(10)空5的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分空6的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分空7的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分空8的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分空9的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分空10的答案OFFSETDA1AXCOUNTOFFSETDA2ABCD提交REPMOVSBECLDF單選題10分9.2其它高級(jí)偽操作9.2.1PURGE偽操作一個(gè)宏定義可以用PURGE偽操作來(lái)取消,然后可以再重新定義。格式:PURGE宏指令名[,宏指令名]取消宏定義的作用是使該宏定義成為空,如果程序中對(duì)已被取消宏定義進(jìn)行宏調(diào)用,匯編程序則忽略該宏調(diào)用,不會(huì)進(jìn)行宏展開(kāi)。9.2.2列表偽操作列表偽操作可以控制其后的宏調(diào)用是否在列表文件中出現(xiàn)宏展開(kāi),并不影響宏展開(kāi)的實(shí)際產(chǎn)生。.LISTMACRO\XALL:列出產(chǎn)生目標(biāo)碼的宏展開(kāi),默認(rèn)情況。.LISTMACROALL\LALL:列出包括注釋在內(nèi)的所有宏展開(kāi)。.NOLISTMACRO\SALL:不列出任何宏展開(kāi)。9.2.3重復(fù)匯編有時(shí)程序中,需要得到連續(xù)相同的或者格式相同的一組代碼,這時(shí)可使用重復(fù)匯編。1.重復(fù)偽操作格式:REPT表達(dá)式
…(重復(fù)塊)
ENDM表達(dá)式的值表示重復(fù)塊的重復(fù)次數(shù)。
例9.13在數(shù)據(jù)段產(chǎn)生字節(jié)數(shù)據(jù),首地址為ARRAY。宏定義: X=0 ARRAYLABELBYTE REPT99 DBX X=X+1 ENDM匯編后產(chǎn)生: 1DB0 1DB1 1DB2… 1DB98例9.14在代碼段產(chǎn)生一組代碼,該組代碼的功能是從鍵盤(pán)輸入9個(gè)字符,放入數(shù)組ARRAY中。程序如下: n=0 rept9 getcharmovarray+n,aln=n+1endmmovah,4chint21hcodeendsendstart
getcharmacro movah,1 int21hendmdatasegmentarraydb10dup(?)dataendscodesegmentassumecs:code,ds:datastart:movax,data
movds,ax重復(fù)匯編中使用了宏調(diào)用,這部分經(jīng)匯編后產(chǎn)生: 2movah,1 2int21h 1movarray+n,al 1n=n+1 2movah,1 2int21h 1movarray+n,al 1n=n+1 … 2movah,1 2int21h 1movarray+n,al 1n=n+12.不定次數(shù)的重復(fù)匯編偽操作(1)IRP偽操作格式:IRP形參,〈實(shí)參1,實(shí)參2,…,實(shí)參N〉…(重復(fù)塊)
ENDM功能:宏匯編程序?qū)⒅貜?fù)塊的代碼重復(fù)匯編,重復(fù)的次數(shù)由實(shí)參個(gè)數(shù)確定。注意:將實(shí)參表用尖括號(hào)括起來(lái),實(shí)參可以是常數(shù)、符號(hào)、字符串。例9.15用不定次數(shù)的重復(fù)匯編在數(shù)據(jù)段產(chǎn)生字節(jié)數(shù)據(jù),首地址為ARRAY。 arraylabelbyte irpx,<3,5,7,22,6,8,19> dbx endm匯編后產(chǎn)生:
1db31db51db71db221db61db81db19(2)IRPC偽操作格式:IRPC形參,字符串
…(重復(fù)塊)
ENDM功能:宏匯編程序?qū)⒅貜?fù)塊重復(fù)匯編,重復(fù)的次數(shù)由字符串的字符個(gè)數(shù)確定。并在每次重復(fù)時(shí),依次用相應(yīng)位置的字符代換形參。字符串不需用引號(hào),可以用尖括號(hào)括起來(lái)。例9.16用IRPC偽操作在數(shù)據(jù)段產(chǎn)生字節(jié)數(shù)據(jù),首地址為ARRAY。 arraylabelbyte irpcx,5678 dbx endm irpcx,<1234> dbx
endm char=’a’ irpcn,abcd ndbchar char=char+1
endm匯編后產(chǎn)生:
1db51db61db71db81db11db21db31db41adb611bdb621cdb631ddb64例9.17用IRPC偽操作定義寄存器清0指令。 irpcreg,abcd movreg&x,0
endm匯編后產(chǎn)生:
1movax,01movbx,01movcx,01movdx,0
9.2.4條件匯編讓匯編程序根據(jù)某些條件是否成立來(lái)決定是否把一段匯編語(yǔ)句包括在程序中或者排除在外,滿足條件的那部分語(yǔ)句生成目標(biāo)代碼。可以用條件匯編偽操作來(lái)實(shí)現(xiàn)。一般格式:
IF條件表達(dá)式
<語(yǔ)句體1>[ELSE]<語(yǔ)句體2>ENDIF功能:若條件成立,則匯編<語(yǔ)句體1>中的語(yǔ)句;否則對(duì)<語(yǔ)句體2>進(jìn)行匯編。
條件匯編偽指令有八條:
IF表達(dá)式;表達(dá)式不為0,則滿足條件
IFE表達(dá)式;表達(dá)式為0,則滿足條件
IFDEF符號(hào);符號(hào)已定義或被說(shuō)明為EXTRN,則滿足條件
IFNDEF符號(hào);符號(hào)未定義或未說(shuō)明為EXTRN,則滿足條件
IFB<變量>;變量為空,則滿足條件
IFNB<變量>;變量不為空,則滿足條件
IFIDN<串變量1>,<串變量2>;兩串相等,則滿足條件
IFNIDN<串變量1>,<串變量2>;兩串不等,則滿足條件表達(dá)式可以是用關(guān)系操作符EQ,NE,LT,LE,GT,GE和邏輯運(yùn)算符AND,OR連接的布爾表達(dá)式。例9.18用宏指令MAX把三個(gè)變?cè)凶畲笾捣旁贏X中。變?cè)獋€(gè)數(shù)不同產(chǎn)生的程序段也
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 包裝設(shè)備采購(gòu)合同示例
- 醫(yī)學(xué)級(jí)維生素A抗皺霜行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 定制家具訂購(gòu)合同
- 二零二五年度員工試用期試用期員工勞動(dòng)合同終止后競(jìng)業(yè)禁止協(xié)議
- 二零二五年度云教育平臺(tái)勞動(dòng)合同書(shū)(百度云在線課程)
- 二零二五年度辣椒產(chǎn)業(yè)鏈金融創(chuàng)新與風(fēng)險(xiǎn)控制合同
- 二零二五年度個(gè)人向單位提供科技創(chuàng)新資金借款合同
- 2025年度解聘勞動(dòng)合同補(bǔ)償標(biāo)準(zhǔn)與員工退休金賬戶管理協(xié)議
- 二零二五年度汽車(chē)維修連鎖企業(yè)整體轉(zhuǎn)讓合同
- 地下室車(chē)位租賃合同(二零二五)及停車(chē)場(chǎng)智能化改造合同
- 中學(xué)生心理輔導(dǎo)-第一章-緒論
- 工業(yè)品買(mǎi)賣(mài)合同(樣表)
- (完整)消化性潰瘍PPT課件ppt
- 《教育學(xué)原理》馬工程教材第二章教育與社會(huì)發(fā)展
- 《常見(jiàn)疾病康復(fù)》期中考試試卷含答案
- 地球使用者地樸門(mén)設(shè)計(jì)手冊(cè)
- 筑基功法精選
- 歐洲電力市場(chǎng)深度報(bào)告:歐洲電力市場(chǎng)供需格局和電價(jià)分析
- 2023年考研考博-考博英語(yǔ)-煤炭科學(xué)研究總院考試歷年高頻考點(diǎn)真題薈萃帶答案
- 塔式起重機(jī)操作使用安全專(zhuān)項(xiàng)方案
- 統(tǒng)計(jì)用產(chǎn)品分類(lèi)目錄
評(píng)論
0/150
提交評(píng)論