第10章-高級(jí)匯編語(yǔ)言技術(shù)_第1頁(yè)
第10章-高級(jí)匯編語(yǔ)言技術(shù)_第2頁(yè)
第10章-高級(jí)匯編語(yǔ)言技術(shù)_第3頁(yè)
第10章-高級(jí)匯編語(yǔ)言技術(shù)_第4頁(yè)
第10章-高級(jí)匯編語(yǔ)言技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章

高級(jí)匯編語(yǔ)言技術(shù)

10.1宏匯編子程序結(jié)構(gòu)存在一些缺點(diǎn):執(zhí)行子程序調(diào)用與子程序返回指令,保護(hù)和恢復(fù)現(xiàn)場(chǎng),提供入口參數(shù)和出口參數(shù)等環(huán)節(jié)將花費(fèi)程序執(zhí)行時(shí)間和存儲(chǔ)空間;在子程序較小而需保護(hù)和恢復(fù)的寄存器、存儲(chǔ)單元較多,涉及的參數(shù)較多時(shí),這種開銷就更為突出。宏匯編技術(shù)較好地彌補(bǔ)了這些缺點(diǎn)。宏匯編技術(shù)包括宏定義與宏調(diào)用。10.1.1宏定義

1.宏定義的格式宏指令名MACRO[形參表]

宏體(指令、偽指令及宏指令構(gòu)成的程序段)

ENDM

形參表可根據(jù)需要作取舍。當(dāng)需要設(shè)置多個(gè)形參時(shí),各形參之間要用逗號(hào)分隔。

10.1.1宏定義

2.宏定義的功能宏定義的功能在于,將宏體定義為一條宏指令,以便在其后的程序中通過(guò)對(duì)宏指令的調(diào)用來(lái)使用對(duì)應(yīng)的宏體。2.宏定義的功能【例10.1】右邊宏定義所定義的宏指令A(yù)X10可以實(shí)現(xiàn)寄存器AX內(nèi)容乘以10的功能。

AX10MACROPUSHDXSALAX,1MOVDX,AXSALAX,1SALAX,1ADDAX,DXPOPDX

ENDM

2.宏定義的功能【例10.2】右邊宏定義所定義的宏指令MUL10可以實(shí)現(xiàn)X內(nèi)容乘以10的功能。X可以是16位通用寄存器或16位存儲(chǔ)單元。MUL10MACROX

PUSHDXSALX,1MOVDX,XSALX,1SALX,1ADDX,DXPOPDX

ENDM2.宏定義的功能【例10.2】右邊宏定義所定義的宏指令MUL10可以實(shí)現(xiàn)X內(nèi)容乘以10的功能。X可以是16位通用寄存器(除DX)或16位存儲(chǔ)單元。MUL10MACROX

PUSHDXSALX,1MOVDX,XSALX,1SALX,1ADDX,DXPOPDX

ENDM10.1.2宏調(diào)用和宏擴(kuò)展1.宏調(diào)用的格式宏指令名[實(shí)參表]說(shuō)明:(1)宏指令名所指定的宏指令的定義必須放在該宏調(diào)用之前。(2)實(shí)參表通常與宏定義中形參表相對(duì)應(yīng)。當(dāng)需要使用多個(gè)實(shí)參時(shí),各實(shí)參之間要用逗號(hào)分隔。10.1.2宏調(diào)用和宏擴(kuò)展2.宏擴(kuò)展匯編程序在對(duì)源程序作匯編時(shí),遇到宏指令則將對(duì)應(yīng)的宏體取代該宏指令,宏體中的形參則使用宏調(diào)用提供的對(duì)應(yīng)實(shí)參來(lái)取代。這一過(guò)程就稱為宏擴(kuò)展。用列表文件查看源程序時(shí),將看到宏擴(kuò)展所產(chǎn)生的各條指令前加有“+”標(biāo)記。2.宏擴(kuò)展2.宏擴(kuò)展【例10.3】在已經(jīng)設(shè)置了【例10.1】及【例10.2】中的宏定義后,以下宏調(diào)用及其宏擴(kuò)展情況如下:設(shè)有宏調(diào)用:AX10……MUL10BX……MUL10BUF

+PUSHDX+SALAX,1+MOVDX,AX+SALAX,1+SALAX,1+ADDAX,DX+POPDX將寄存器AX內(nèi)容乘以10+PUSHDX+SALBX,1+MOVDX,AX+SALBX,1+SALBX,1+ADDBX,DX+POPDX將字變量BUF內(nèi)容乘以10+PUSHDX+SALBUF,1+MOVDX,BUF+SALBUF,1+SALBUF,1+ADDBUF,DX+POPDX

將字變量BUF內(nèi)容乘以1010.1.3宏定義和宏調(diào)用中參數(shù)的使用1.宏體中的形參用宏調(diào)用提供的對(duì)應(yīng)實(shí)參來(lái)取代。若實(shí)參個(gè)數(shù)大于形參個(gè)數(shù),則多余的實(shí)參被忽略;若形參個(gè)數(shù)大于實(shí)參個(gè)數(shù),則多余的形參作“空”處理。2.形參可以作為宏體中指令的助記符、操作數(shù)及標(biāo)號(hào),宏調(diào)用用實(shí)參取代形參時(shí)必須保證所產(chǎn)生的指令是有效的?!纠?0.4】以下宏定義中的第一個(gè)形參用做指令助記符,其余形參用做操作數(shù)。MMMACROOP,X,YPUSHAXMOVAX,XOPAX,YMOVX,AXPOPAXENDM設(shè)有宏調(diào)用

MMADD,[BX],[SI]其宏擴(kuò)展為+PUSHAX+MOVAX,[BX]+ADDAX,[SI]+MOV[BX],AX+POPAX設(shè)有宏調(diào)用MMSUB,DATA1,DATA2其宏擴(kuò)展為+PUSHAX+MOVAX,DATA1+SUBAX,DATA2+MOVDATA1,AX+POPAX(1)形參可以作為宏體中指令助記符、操作數(shù)或標(biāo)號(hào)的某一部分,在宏體中必須使用“&”將形參與其余部分連接起來(lái)?!纠?0.5】

以下宏定義中的第一個(gè)形參CON用做指令助記符的一部分,故在宏體中用“&”將“JN”與該形參相連接。CONCALLMACROCON,SUBNLOCALGOON;LOCAL偽指令的功能見后

JN&CONGOONCALLSUBNGOON:NOPENDM設(shè)有宏調(diào)用CONCALLC,SUB1則其宏擴(kuò)展為:+JNC??0000+CALLSUB1+??0000:NOP(宏擴(kuò)展中的??0000為匯編程序自動(dòng)產(chǎn)生的標(biāo)號(hào)。)(2)當(dāng)某一個(gè)實(shí)參中含有空格,逗號(hào)等分隔符時(shí),必須用“<>”將其括起。

STKMACROXSSEGSEGMENTSTACKDBXSSEGENDSENDM若某個(gè)源程序需要定義200個(gè)字節(jié),初值為0的堆棧段,則可以使用宏調(diào)用STK<200DUP(0)>其宏擴(kuò)展為:+SSEGSEGMENTSTACK+DB200DUP(0)+SSEGENDS(3)在宏調(diào)用時(shí),若要求將實(shí)參所代表的數(shù)值替代形參,則必須在實(shí)參前使用“%”?!纠?0.7】

設(shè)有以下宏定義:DISPMACROXDB'ANSWER:′,′&X′,′$′ENDM

則宏調(diào)用DISP%(2*11-8)產(chǎn)生的宏擴(kuò)展為+DB′ANSWER:′,′14′,′$′【例10.7】

設(shè)有以下宏定義:DISPMACROXDB'ANSWER:′,′&X′,′$′ENDM

不使用符號(hào)“%”的宏調(diào)用

DISP2*11-8產(chǎn)生的宏擴(kuò)展卻是+

DB′ANSWER:′,′2*11-8′,′$′(4)當(dāng)需要在實(shí)參中使用“&”、“<”、“>”、“%”等符號(hào),但不作宏運(yùn)算符時(shí),就必須在其前使用“!”。

【例10.8】

在已設(shè)置【例10.7】中的宏定義的情況下,宏調(diào)用DISP!%(2*11-8)產(chǎn)生的宏擴(kuò)展為+DB′ANSWER:′,′%(2*11-8)′,′$′宏調(diào)用中的“%”前使用了宏運(yùn)算符“!”,故“%”被看作一個(gè)符號(hào),而失去了宏運(yùn)算符的功能。4.宏定義中標(biāo)號(hào)和變量的處理。

宏指令一經(jīng)定義便可在源程序中調(diào)用,若宏體中使用了標(biāo)號(hào)或變量,在多次宏調(diào)用時(shí)就會(huì)出現(xiàn)多個(gè)相同標(biāo)號(hào)或出現(xiàn)變量的重復(fù)定義,LOCAL偽指令用于解決這一問題。

LOCAL偽指令的一般格式:LOCAL標(biāo)號(hào)及變量表(各標(biāo)號(hào)、變量之間用逗號(hào)分隔。)在宏定義中,LOCAL偽指令必須緊接MACRO偽指令之后。在處理各個(gè)宏調(diào)用時(shí),匯編程序?qū)⒆詣?dòng)以??0000,??0001,……??FFFF替代LOCAL偽指令列出的各個(gè)標(biāo)號(hào)或變量,從而避免多次宏調(diào)用時(shí)出現(xiàn)多個(gè)相同標(biāo)號(hào)或出現(xiàn)變量重復(fù)定義的問題。4.宏定義中標(biāo)號(hào)和變量的處理。

【例10.9】

在已設(shè)置【例10.5】中的宏定義后,宏調(diào)用:CONCALLC,SUB1……CONCALLZ,SUB2產(chǎn)生以下宏擴(kuò)展:+JNC??0000+CALLSUB1+??0000:NOP……+JNZ??0001+CALLSUB2+??0001:NOP10.1.4宏嵌套

宏定義的宏體中包括宏調(diào)用,即在宏體中調(diào)用宏指令。在這種情況下要注意,其中調(diào)用的宏指令必須先行定義。宏體中包括宏定義。在這種情況下要注意,不能在源程序中直接調(diào)用內(nèi)層定義的宏指令。換言之,在源程序中只有通過(guò)外層宏指令的調(diào)用才能調(diào)用內(nèi)層宏指令。宏匯編子程序目標(biāo)代碼所占空間有幾次宏調(diào)用就有幾次宏擴(kuò)展,故并不簡(jiǎn)化目標(biāo)代碼子程序目標(biāo)代碼只出現(xiàn)一次,故目標(biāo)代碼短程序運(yùn)行速度無(wú)需轉(zhuǎn)返,程序運(yùn)行速度快需要轉(zhuǎn)返工作,程序運(yùn)行速度慢處理時(shí)機(jī)在匯編時(shí)由匯編程序?qū)崿F(xiàn)宏擴(kuò)展。CPU執(zhí)行的是經(jīng)過(guò)宏擴(kuò)展的程序在執(zhí)行時(shí),CPU通過(guò)轉(zhuǎn)子指令執(zhí)行子程序中的指令適用場(chǎng)合程序運(yùn)行速度是主要考慮因素目標(biāo)代碼所占空間是主要考慮因素【例】計(jì)算m!/(n!*(m-n)!)要求:將例9.2使用子程序完成的部分,改用宏匯編來(lái)實(shí)現(xiàn)。

……………;CSEG SEGMENT ASSUME DS:DSEG,CS:CSEG……………;MCO MACRO X MOV CX,X MOV AX,1NEXT: MUL CX LOOP NEXT ENDM

MCO N MOV BX,AX

MCO M DIV BX MOV BX,AX MOV AX,M SUB AX,N

MCO AX XCHG BX,AX DIV BX MOV ANS,AX ……………CSEG ENDS END STAT

……………;CSEG SEGMENT ASSUME DS:DSEG,CS:CSEG……………;MCO MACRO X

LOCAL NEXT MOV CX,X MOV AX,1NEXT: MUL CX LOOP NEXT ENDM

MCO N MOV BX,AX

MCO M DIV BX MOV BX,AX

MCO %(M-N) XCHG BX,AX DIV BX MOV ANS,AX ……………CSEG ENDS END STAT10.2重復(fù)匯編

對(duì)于指令或偽指令組的連續(xù)重復(fù)問題,使用重復(fù)匯編結(jié)構(gòu)則更為簡(jiǎn)便。

10.2.1使用REPT偽指令的重復(fù)匯編結(jié)構(gòu)格式:REPT整數(shù)表達(dá)式

重復(fù)體

ENDM功能:使匯編程序?qū)χ貜?fù)體作重復(fù)匯編,以整數(shù)表達(dá)式的值作為重復(fù)次數(shù)。10.2.1使用REPT偽指令的重復(fù)匯編結(jié)構(gòu)【例10.11】

設(shè)有重復(fù)匯編結(jié)構(gòu)如下:CHAR=41HREPT10DBCHARCHAR=CHAR+1ENDM10.2.1使用REPT偽指令的重復(fù)匯編結(jié)構(gòu)匯編程序在匯編時(shí)將對(duì)重復(fù)體重復(fù)匯編10次,即匯編為CHAR=41HDBCHAR;CHAR為41HCHAR=CHAR+1DBCHAR;DB為42HCHAR=CHAR+1……其結(jié)果等價(jià)于:DB41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH【例10.12】

指出以下程序段的功能:N=0REPT9

N=N+1

M=0REPT9

M=M+1DBM*NENDMENDM這是一個(gè)嵌套的重復(fù)匯編結(jié)構(gòu)。內(nèi)外兩層重復(fù)匯編結(jié)構(gòu)均使各自的重復(fù)體重復(fù)9次。匯編后等價(jià)于在連續(xù)的81個(gè)字節(jié)單元中存放九九乘法表的數(shù)值:DB1,2,3,…9DB2,4,6,…18DB3,6,9,…27...DB9,18,27,…81說(shuō)明:(1)重復(fù)體的規(guī)定同前,而且重復(fù)體中含有形參。(2)實(shí)參表中的各個(gè)實(shí)參須用逗號(hào)分隔,實(shí)參取代形參后得到的應(yīng)是有效的指令、偽指令或宏指令。10.2.2使用IRP偽指令的重復(fù)匯編結(jié)構(gòu)

格式:IRP形參,<實(shí)參表>

重復(fù)體

ENDM功能:使匯編程序?qū)χ貜?fù)體作重復(fù)匯編,每作一次匯編就依次將實(shí)參表中的一個(gè)實(shí)參取代重復(fù)體中的形參。(重復(fù)次數(shù)就等于實(shí)參表中實(shí)參的個(gè)數(shù))【例10.13】

設(shè)有重復(fù)匯編結(jié)構(gòu)如下:

IRPREG,<AX,BX,CX,DX>PUSHREGENDM匯編程序在匯編時(shí)將對(duì)重復(fù)體

PUSHREG重復(fù)匯編4次,且分別用實(shí)參AX,BX,CX及DX取代形參

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論