32位匯編語(yǔ)言程序設(shè)計(jì)10_第1頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì)10_第2頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì)10_第3頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì)10_第4頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì)10_第5頁(yè)
已閱讀5頁(yè),還剩40頁(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章宏結(jié)構(gòu)程序設(shè)計(jì)macrolocal宏宏展開(kāi)IF教學(xué)重點(diǎn)宏定義宏展開(kāi)宏參數(shù)宏結(jié)構(gòu)宏匯編 重復(fù)匯編 條件匯編

——統(tǒng)稱宏結(jié)構(gòu)宏(Macro)是匯編語(yǔ)言的一個(gè)特點(diǎn),它是與子程序類似又獨(dú)具特色的另一種簡(jiǎn)化源程序的方法10.1宏匯編

宏——具有宏名的一段匯編語(yǔ)句序列——宏定義時(shí)書(shū)寫(xiě)宏指令——這段匯編語(yǔ)句序列的縮寫(xiě)——宏調(diào)用時(shí)書(shū)寫(xiě)宏展開(kāi)——宏指令處用這段宏代替的過(guò)程——宏匯編時(shí)實(shí)現(xiàn)宏的參數(shù)功能強(qiáng)大,頗具特色配合宏,還有宏操作符和有關(guān)偽指令宏定義宏名

MACRO[形參表]

宏定義體

ENDM模式定義宏保護(hù)寄存器宏恢復(fù)寄存器宏交換變量宏宏定義體可以是任何合法的匯編語(yǔ)句,既可以是硬指令序列,又可以是偽指令序列MODE32macro;;定義一個(gè)名為MODE32的宏,無(wú)參數(shù).386.modelflat,stdcall ;;宏定義體endm ;;宏定義結(jié)束MODE16macro;;定義一個(gè)名為MODE32的宏,無(wú)參數(shù).modelsmall,stdcall ;;宏定義體.386endm ;;宏定義結(jié)束宏注釋符模式定義宏SaveRegs定義宏SaveRegs,保存通用寄存器和標(biāo)志寄存器的內(nèi)容:

SaveRegs

macro pushebx

pushedi

pushesi

pushebp pushfd

endmRestorRegs宏RestorRegs來(lái)恢復(fù)SaveRegs保存的寄存器:

RestorRegsmacro

popfd

popebp

popesi

popedi

popebx endm帶參數(shù)的宏Xchgxy宏也可以有參數(shù)。定義一個(gè)宏用來(lái)交換兩個(gè)變量的內(nèi)容:

Xchgxymacrox,y pushx pushy popx popy

endm宏調(diào)用宏名

[實(shí)參表]宏調(diào)用的實(shí)質(zhì)是在匯編過(guò)程中進(jìn)行宏展開(kāi)宏展開(kāi)的具體過(guò)程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體取代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代例10-1例10-1例10-1:利用宏結(jié)構(gòu)設(shè)計(jì)一個(gè)32位應(yīng)用程序?qū)崿F(xiàn)保存和恢復(fù)寄存器。例10-1(4-1)

MODE32macro ;;定義一個(gè)名為MODE32的宏,無(wú)參數(shù).386.modelflat,stdcall ;;宏定義體endm ;;宏定義結(jié)束例10-1(4-2);;定義保存寄存器的宏RestorRegsmacro POPFD POPEBP POPESI POPEDI POPEBX

endm例10-1(4-3);;定義恢復(fù)寄存器的宏SaveRegsmacroPUSHEBXPUSHEDIPUSHESIPUSHEBPPUSHFDendm

例10-1(4-4)MODE32.codestart:SaveRegsRestorRegsretendstart宏展開(kāi)宏展開(kāi)——在匯編時(shí),用宏定義體的代碼序列替代宏指令的過(guò)程。通過(guò)列表文件可以查看宏展開(kāi)的結(jié)果。例10-1的列表文件SaveRegs

1 pushebx

1 pushedi

1 pushesi

1 pushebp

1 pushfdRestorRegs

1 popfd

1 popebp

1 popesi

1 popedi

1 popebx宏嵌套宏定義允許嵌套,即宏定義體內(nèi)可以有宏定義,對(duì)這樣的宏進(jìn)行調(diào)用時(shí)需要多次分層展開(kāi)。宏定義中可以有宏調(diào)用,只要遵循先定義后調(diào)用的原則。先定義后調(diào)用

pushParams macrox,y ;;宏定義,參數(shù)進(jìn)棧

pushxpushy

endmCallProcmacrofunction,x,y;;含有宏調(diào)用的宏定義

pushParamsx,y;;宏調(diào)用

callfunction

endmCallProcsum,3,5 ;宏調(diào)用

2 pushx;宏展開(kāi)(第二層)2pushy1 callsum ;宏展開(kāi)(第一層)宏的參數(shù)宏的參數(shù)使用非常靈活宏定義時(shí),可以無(wú)參數(shù),例如MODE32可以具有多個(gè)參數(shù);例如pushParams參數(shù)可以是常數(shù)、變量、存儲(chǔ)單元、指令(操作碼)或它們的一部分,也可以是表達(dá)式;例10-2例10-3例10-4例10-2(2-1)

shlextmacroshloprand,shlnumpushecxmov

cl,shlnum;;shlnum表示移位次數(shù)shl

shloprand,cl ;;shloprand表示被移位的操作數(shù)popecxendm例10-2(2-2)當(dāng)我們要將AX左移6位時(shí),可以采用如下宏指令:

shlextax,6匯編后,宏展開(kāi)為:

1 pushecx

1 movcl,061 shlax,cl

1 popecx例10-3(2-1)shift macrosoprand,snum,sopcodepushecxmov

cl,snums&sopcode&soprand,clpopecxendm例10-3(2-2)當(dāng)我們要將AX左移6位時(shí),可以采用如下宏指令:

shiftax,6,hl

匯編后,宏展開(kāi)為:

1 pushecx

1 movcl,061 shlax,cl

1 popecxshrot;;把8條移位和循環(huán)移位指令統(tǒng)一起來(lái)shrot macrosroprand,srnum,sropcode

pushecx mov

cl,srnum sropcode

sroprand,cl

popecxendm例10-4dstring macrostringbyte’&string&’,0dh,0ah,’$’endm定義字符串‘Thisisaexample.’:dstring <Thisisaexample.>宏展開(kāi):

1byte‘Thisisanexample.’,0dh,0ah,$’宏操作符(1)&——替換操作符,用于將參數(shù)與其他字符分開(kāi)。如果參數(shù)緊接在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號(hào)的字符串中,就必須使用該偽操作符<>——字符串傳遞操作符,用于括起字符串。在宏調(diào)用中,如果傳遞的字符串實(shí)參數(shù)含有逗號(hào)、空格等間隔符號(hào),則必須用這對(duì)操作符,以保證字符串的完整宏操作符%——表達(dá)式操作符,用在宏調(diào)用中,表示將后跟的一個(gè)表達(dá)式的值作為實(shí)參,而不是將表達(dá)式本身作為參數(shù)dstring %(1024-1) ;宏調(diào)用

1byte’1023’,0dh,0ah,’$’ ;宏展開(kāi)如果不加%調(diào)用:dstring 1024-1 ;宏調(diào)用1byte’1024-1’,0dh,0ah,’$’ ;宏展開(kāi)宏操作符!——轉(zhuǎn)義操作符,用于指示其后的一個(gè)字符作為一般字符,不含特殊意義dstring <0!<Number!<10> ;宏調(diào)用byte’0<Number<10’,0dh,0ah,’$’ ;宏展開(kāi)dstring10%7=3;宏調(diào)用byte“107=3”,0dh,0ah,’$’dstring10!%7=3;宏調(diào)用byte“10%7=3”,0dh,0ah,’$’;宏展開(kāi)宏操作符;;——宏注釋符,用于表示在宏定義中的注釋。采用這個(gè)符號(hào)的注釋,在宏展開(kāi)時(shí)不出現(xiàn)實(shí)參與形參匯編程序不對(duì)實(shí)參和形參進(jìn)行類型檢查,完全是字符串的替代,至于宏展開(kāi)后是否有效則由匯編程序翻譯時(shí)進(jìn)行語(yǔ)法檢查。因此在編寫(xiě)定義宏時(shí),應(yīng)保證宏調(diào)用時(shí),用實(shí)參替換形參后,所展開(kāi)的匯編語(yǔ)句有效。例10-5設(shè)計(jì)一個(gè)宏實(shí)現(xiàn)兩個(gè)數(shù)的減法,保存差,但不改變被減數(shù)和減數(shù)。例10-5:宏定義SUBX1macrominuend,subtrahend,difference pushminuend subminuend,subtrahend

movdifference,minuend popminuend

endm;計(jì)算eax=ebx-8,SUBX1ebx,8,eax;宏展開(kāi):

pushebx

subebx,8

mov

eax,ebx

popebx例10-5:宏調(diào)用和展開(kāi);計(jì)算var1=var2-var3,SUBX1var2,var3,var1展開(kāi)的指令代碼序列是:

pushvar2 subvar2,var3;

movvar1,var2 popvar2例10-5:宏調(diào)用和展開(kāi)非法指令,匯編提示錯(cuò)誤。SUBX2macrominuend,subtrahend,difference pusheax mov

eax,minuend subeax,subtrahend

movdifference,eax

popeax endmSUBX2;計(jì)算var1=var2-var3,SUBX2var2,var3,var1展開(kāi)的指令代碼序列是:

pushvar2

mov

eax,var2 subeax,var3;

movvar1,eax

popvar2SUBX2調(diào)用與宏有關(guān)的偽指令局部標(biāo)號(hào)偽指令LOCAL標(biāo)號(hào)列表宏定義體采用了標(biāo)號(hào),應(yīng)使用LOCAL加以說(shuō)明它必須是宏定義MACRO語(yǔ)句之后的第一條語(yǔ)句宏定義刪除偽指令PURGE宏名表不需要某個(gè)宏定義時(shí),可以把它刪除宏定義退出偽指令EXITM偽指令EXITM表示結(jié)束當(dāng)前宏調(diào)用的展開(kāi)例10-6minmacroa,b,x localexitmin

pusheax mov

eax,a

cmp

eax,b

jb

exitmin mov

eax,b

exitmin: movx,eax

popeax endm ;;這個(gè)偽指令要獨(dú)占一行例10-6:有標(biāo)號(hào)的宏定義(4-1)minm1,m2,m3minm2,m1,m3例10-6:有標(biāo)號(hào)的宏定義(4-2)minm1,m2,m31 pusheax

1 mov

eax,m11cmpeax,m21 jb??00001mov

eax,m21??0000:1movm3,eax1popeax例10-6:有標(biāo)號(hào)的宏定義(4-3)minm2,m1,m31pusheax

1 mov

eax,m21cmpeax,m11 jb??00011mov

eax,m11??0001:1movm3,eax1popeax例10-6:有標(biāo)號(hào)的宏定義(4-4)比較僅是源程序級(jí)的簡(jiǎn)化:宏調(diào)用在匯編時(shí)進(jìn)行程序語(yǔ)句的展開(kāi),不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒(méi)有改變通過(guò)形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變這是目標(biāo)程序級(jí)的簡(jiǎn)化:子程序調(diào)用在執(zhí)行時(shí)由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞參數(shù)宏子程序宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問(wèn)題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序比較

結(jié)論宏子程序10.2重復(fù)匯編重復(fù)匯編指在匯編過(guò)程中,重復(fù)展開(kāi)一段(基本)相同的語(yǔ)句重復(fù)匯編沒(méi)有名字,不能被調(diào)用重復(fù)匯編常用在宏定義體中,也可以在一般匯編語(yǔ)句中使用重復(fù)匯編偽指令有三個(gè):REPEAT——按參數(shù)值重復(fù)FOR——按參數(shù)個(gè)數(shù)重復(fù)FORC——按參數(shù)的字符個(gè)數(shù)重復(fù)最后,用ENDM結(jié)束按參數(shù)值重復(fù)REPEAT

重復(fù)次數(shù)重復(fù)體ENDMchar=’A’Aztable

equthisbyte;Aztable用于為字符串指明首地址

repeat26 bytechar char=char+1

endm

Aztable

equthisbyte

1bytechar;等效于byte'A'1char=char+11bytechar;等效于byte'B'1char=char+1...1bytechar;等效于byte'Z'1char=char+1按參數(shù)個(gè)數(shù)重復(fù)FOR

形參,〈實(shí)參表〉

重復(fù)體ENDMforregad,<eax,ebx,ecx,edx>pushregadendm1 pusheax

1 pushebx

1 pushecx

1 pushedx按參數(shù)字符個(gè)數(shù)重復(fù)FORC形參,字符串重復(fù)體ENDMforcregad,dcba

pope®ad&xendm1 popedx

1 popecx

1 popebx

1 popeax10.3條件匯編條件匯編偽指令在匯編過(guò)程中,根據(jù)條件決定匯編的語(yǔ)句IFxx

表達(dá)式

;滿足,匯編分支語(yǔ)句體1

分支語(yǔ)句體1[ELSE

;不滿足,匯編分支語(yǔ)句體2

分支語(yǔ)句體2]ENDIF

;條件匯編結(jié)束表10-1條件匯編偽指令格式功能說(shuō)明IF表達(dá)式匯編程序求出表達(dá)式的值,此值不為0則條件滿足IFE表達(dá)式匯編程序求出表達(dá)式的值,此值為0則條件滿足IFDEF

符號(hào)符號(hào)已定義(內(nèi)部定義或聲明外部定義),則條件滿足IFNDEF符號(hào)符號(hào)未定義,則條件滿足IFB<形參>用在宏定義體。如果宏調(diào)用沒(méi)有用實(shí)參替代該形參,則條件滿足IFNB <形參>用在宏定義體。如果宏調(diào)用用實(shí)參替代該形參,則條件滿足IFIDN<字符串1>,<字符串2>字符串1與字符串2相同則條件滿足;區(qū)別大小寫(xiě)IFIDNI<字符串1>,<字符串2>字符串1與字符串2相同則條件滿足;不區(qū)別大小寫(xiě)IFDIF <字符串1>,<字符串2>字符串1與字符串2不相同則條件滿足;區(qū)別大小寫(xiě)IFDIFI<字符串1>,<字符串2>字符串1與字符串2不相同則條件滿足;不區(qū)別大小寫(xiě)hexchars

equthisbyteindex=0repeat16ifindexlt10byteindex+’0’elsebyteindex-10+’A’endifindex=index+1endm例10-10:定義一個(gè)16進(jìn)制的字符表

相當(dāng)于:hexcharsbyte‘0123456789ABCDEF’pdata macronumifnumlt100;;如果num<100,則匯編如下語(yǔ)句bytenumdup(?)else ;;否則,匯編如下語(yǔ)句byte100dup(?)endifendm例10-11:定義一個(gè)元素個(gè)數(shù)不超過(guò)100的數(shù)組(2-1)

pdata12 ;宏調(diào)用①byte12dup(?) ;宏匯編結(jié)果①pdata102 ;宏調(diào)用②byte100dup(?) ;宏匯編結(jié)果②例10-11:定義一個(gè)元素個(gè)數(shù)不超過(guò)100的數(shù)組(2-2)

例10-12例10-12:編寫(xiě)宏MAXNUM,計(jì)算3個(gè)以內(nèi)的數(shù)(形參)中的最大值,并將結(jié)果送入AX寄存器,要求根據(jù)宏調(diào)用時(shí)的實(shí)參個(gè)數(shù)展開(kāi)相應(yīng)的代碼。分析:實(shí)際參加比較的數(shù)應(yīng)該有一個(gè),所以第一個(gè)參數(shù)設(shè)定為不可缺?。?req)。如果只有兩個(gè)參數(shù),則只需比較一次,后一個(gè)比較的代碼不用展開(kāi)。宏定義體中判斷后兩個(gè)實(shí)參是否為空而匯編相應(yīng)的比較代碼。maxnummacrowx:req,wy,wzlocalmaxnum1,maxnum2movax,wxifnb<wy> ;;當(dāng)有wy實(shí)參時(shí),匯編如下語(yǔ)句cmpax,wyjgemaxnum1movax,wyendif例10-12

maxnum1:ifnb<wz> ;;當(dāng)有wz實(shí)參時(shí),匯編如下語(yǔ)句cmpax,wzjgemaxnum2movax,wzendifmaxnum2:endm例10-12

maxnum

bx ;宏調(diào)用①

例10-12

movax,bx ;宏匯編結(jié)果①maxnum3,4 ;宏調(diào)用②

例10-12

movax,3 ;宏匯編結(jié)果②cmpax,4jge??0002movax,4??0002:maxnumn1,n2,n3 ;宏調(diào)用③

例10-12

maxnumn1,n2,n3 ;宏調(diào)用③

movax,n1 ;宏匯編結(jié)果③

cmpax,n2

jge??0004

movax,n2??0004:cmpax,n3

jge??0005

movax,n3??0005:IFDEF

ifdefDEBUGWriteUDecBytealendifSUBX2

SUBX2macrominuend,subtrahend,differencepusheaxmov

eax,minuendsubeax,subtrahendmovdifference,eaxpopeaxendmSUBX210,5,EAX;計(jì)算EAX=10-5

SUBX2pusheaxmov

eax,10subeax,5mov

eax,eaxpopeax減法的結(jié)果賦值給EAX后,又將堆棧中保存的原來(lái)EAX的內(nèi)容傳送給了EAX,沒(méi)有實(shí)現(xiàn)預(yù)期功能。

SUBX3SUBX3macrominuend,subtrahend,differenceifidni<difference&subtrahend>,<EAXEAX>;減數(shù)和差為EAX subeax,minuend

neg

eax exitm endif

SUBX3

ifidni<difference>,<EAX> ;差為EAX MOVeax,minuend SUBeax,SUBTRAHEND

exitm endif

SUBX3

ifidni<subtrahend>,<EAX>;減數(shù)為EAX pusheax

subeax,minuend

neg

eax movdifference,eax

popeax

SUBX3

else pusheax mov

eax,minuend subeax,subtrahend

movdifference,eax

popeaxendifendmSUBX310,5,EAX

SUBX3moveax,10subeax,5例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-1)

mode32macro;;定義一個(gè)名為MODE32的宏,無(wú)參數(shù).386.modelflat,stdcall ;;宏定義體includelib\masm32\kernel32.lib.stack4096STD_OUTPUT_HANDLEEQU-11;輸出設(shè)備GetStdHandleproto,nStdHandle:dwordWriteConsoleA

proto,handle:dword,lpBuffer:ptrbyte,

nNumberOfBytesToWrite:dword,

lpNumberOfBytesWritten:ptrdword,

lpReserved:dword ;保留

endm ;;宏定義結(jié)束例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-2)dstringmacrostring ;;定義字符串

byte’&string&’,0dh,0ah,’$’

endm例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-3)dispmsg macromessage,messagesizelocalConsoleHandle,bytesWrittenifb<message>.err<nostring!>.exitmendififb<messagesize>.err<nosize!>.exitmendif例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-4).dataconsoleHandle

dword?bytesWrittendword?.codeinvokeGetStdHandle,STD_OUTPUT_HANDLEmov

consoleHandle,eax

;顯示字符串invokeWriteConsoleA,consoleHandle, offsetmessage,messageSize, offsetbytesWritten,

0endm例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-5)mode32.datamsg1 equthisbytedstring <Hello,Everybody!!>msg1size=($-msg1)msg2 equthisbytedstring <Yousee,Imadeit.>msg2size=($-msg2)例10-13:用宏結(jié)構(gòu)實(shí)現(xiàn)信息顯示的實(shí)模式下的程序(6-6).codestart: dispmsgmsg1,msg1zise;顯示msg1字符串dispmsgmsg2,msg2size;顯示msg2字符串retendstart宏

結(jié)

構(gòu)

用宏匯編、重復(fù)匯編和條件匯編 為源程序的編寫(xiě)提供了很多方便, 靈

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論