匯編語(yǔ)言程序設(shè)計(jì)課件19_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)課件19_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)課件19_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)課件19_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)課件19_第5頁(yè)
已閱讀5頁(yè),還剩144頁(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)介

匯編語(yǔ)言程序設(shè)計(jì)第一節(jié)80X86的尋址方式固定尋址立即數(shù)尋址寄存器尋址存儲(chǔ)器尋址I/O端口尋址與轉(zhuǎn)移地址有關(guān)的尋址1.固定尋址這是一種特定的單操作數(shù)指令,其操作數(shù)隱含在操作碼中,常常是對(duì)某一個(gè)固定的寄存器進(jìn)行操作。例如:

CBW;(AL)→(AX)該指令指定的操作數(shù)在AL寄存器中,其功能是將AL寄存器中的符號(hào)位擴(kuò)展到AH中。形成16位的操作數(shù)存放在AX中。2.立即數(shù)尋址這種尋址方式下,操作數(shù)就包含在指令中,作為指令的一部分,它與操作碼一起存放在代碼段中。例如:

MOVAX,1102H;給AX寄存器賦值立即數(shù)尋址只能用于源操作數(shù)的尋址,而不能用于目的操作數(shù)的尋址。MOVBX,0A123H

指令執(zhí)行后(BX)=0A123HBX:代碼段A123OP:存儲(chǔ)器例:3.寄存器尋址操作數(shù)在CPU內(nèi)部的寄存器中,指令指定寄存器名,操作數(shù)的位數(shù)由寄存器名決定。例如:MOVAX,BX;將BX的內(nèi)容送AX中。MOV[1234H],BX;將BX內(nèi)容送地址為1234H的內(nèi)存單元中。直接尋址方式寄存器間接尋址方式寄存器相對(duì)尋址方式基址變址尋址方式相對(duì)基址變址尋址方式比例變址尋址方式4.存儲(chǔ)器尋址操作數(shù)的偏移地址就包含在指令中,默認(rèn)段是數(shù)據(jù)段。例如:MOVAL,[2000H];將DS段中偏移地址為2000H的字節(jié)單元內(nèi)容送寄存器AL中.MOVAX,ES:[2000H];將附加段中偏移地址為2000H的字單元內(nèi)容送寄存器AX中.⑴直接尋址方式MOVAX,[1122H];

設(shè)(DS)=3000H存儲(chǔ)器中操作碼后面是操作數(shù)的偏移地址.物理地址=3000H*16+1122H=31122H,該內(nèi)存單元的內(nèi)容送AX寄存器.執(zhí)行指令后,(AX)=3456H例:操作數(shù)的偏移地址存放在指令指定的寄存器中,寄存器作為指針指向內(nèi)存單元,這樣的寄存器稱為間址寄存器。操作數(shù)在存儲(chǔ)器中。例如:MOVAX,[SI];數(shù)據(jù)段中一個(gè)字送AXMOVAX,ES:[DI];附加段中一個(gè)字送AXMOVAX,[BP];堆棧段中一個(gè)字送AXMOVAX,DS:[BP];數(shù)據(jù)段中一個(gè)字送AX⑵寄存器間接尋址方式例:MOVAX,[BX];

設(shè)(DS)=2000H,(BX)=1234H物理地址=20000H+1234H=21234H指令執(zhí)行后(AX)=5678H操作數(shù)的偏移地址是間址寄存器的內(nèi)容加上位移量,位移量是地址的一部分。例如:MOVAX,10H[SI]MOVAX,ES:10H[SI]MOVAX,TABLE[SI]位移量TABLE是表的首地址,間址寄存器SI的內(nèi)容加上位移量就是要訪問(wèn)的表中的某一數(shù)據(jù).⑶寄存器相對(duì)尋址方式

MOVAX,COUNT[BX]

(DS)=3000H,(BX)=1234H,COUNT=1000H

物理地址=30000H+1234H+1000H=32234H

指令執(zhí)行后

(AX)=5678H例:操作數(shù)的偏移地址一部分在基址寄存器,一部分在變址寄存器,基址寄存器的內(nèi)容與變址寄存器的內(nèi)容之和就是操作數(shù)的偏移地址。例如:

MOVAX,[BX][SI];

MOVAX,ES:[BX][SI];⑷基址變址尋址方式

MOVAX,[BX][SI](DS)=2100H,(SI)=1234H,(BX)=1100H

物理地址=21000H+1234H+1100H=23334H

指令執(zhí)行后

(AX)=5678H例:帶位移量的基址變址尋址稱為相對(duì)的基址變址尋址方式。例如:MOVAX,100H[BX][SI]MOVAX,ES:100H[BX][SI]MOVAX,100H[BP][SI]

⑸相對(duì)基址變址尋址方式比例變址尋址方式只能在32位及以后的系統(tǒng)中使用。操作數(shù)的有效地址是變址寄存器的內(nèi)容乘以指令中指定的比例因子再加上位移量。例如:

MOVAX,[EBX+4*EDI+20H];這是32位尋址,指令執(zhí)行的結(jié)果是將數(shù)據(jù)段中偏移地址為(EBX)+4*(EDI)+20H的內(nèi)存單元的一個(gè)字?jǐn)?shù)據(jù)送AX寄存器中.⑹比例變址尋址方式5.I/O端口尋址⑴直接端口尋址——指令中包含I/O端口的直接地址(8位端口)。

INAL,80H;讀80H端口的數(shù)據(jù)

OUT80H,AL;往80H端口寫(xiě)數(shù)據(jù)⑵間接端口尋址——用DX寄存器間接訪問(wèn)端口(16位端口)。

MOVDX,200H;將端口號(hào)200H存入DX中

OUTDX,AL;將(AL)輸出到DX所指的端口中

6.與轉(zhuǎn)移地址有關(guān)的尋址轉(zhuǎn)移指令用來(lái)改變程序的正常執(zhí)行順序,指令中提供了轉(zhuǎn)移地址的段地址和偏移地址。段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移都可以使用直接尋址和間接尋址。⑴段內(nèi)直接尋址。JMPLABEL⑵段內(nèi)間接尋址。JMPBX;JMPWORDPTR[BP]⑶段間直接尋址。JMPFARPTRLABEL⑷段間間接尋址。JMPDWORDPTR[SI]求下面兩條轉(zhuǎn)移指令的轉(zhuǎn)移地址A1和A2分別是多少?(1)3000:0110

EBF7JMPA1(2)3000:0110

EB09JMPA2(1)A1的地址=0112

+-9(F7)0109H下一條指令的IP=0110+2=0112(2)A2的地址=0112

+9011BH例:

段內(nèi)直接尋址轉(zhuǎn)向的有效地址=當(dāng)前(IP)+位移量(8位/16位)JMPSHORTLMOVAX,0MOVBX,0MOVAX,0L:RETJMPNEARPTRL;近轉(zhuǎn)移(-32768∽+32767)JMPSHORTL;短轉(zhuǎn)移(-128∽+127)L:MOVAX,0MOVBX,0MOVAX,0JOLRET例:code1segment

jmpfarptrnext

┊code1endscode2segment┊next:……

┊code2ends

段間直接尋址用指令中提供的轉(zhuǎn)向的段地址和偏移地址取代CS和IP例:第二節(jié)80X86的指令系統(tǒng)

數(shù)據(jù)傳送類指令地址傳送類指令算術(shù)運(yùn)算類指令邏輯運(yùn)算類指令串操作類指令控制轉(zhuǎn)移類指令處理器控制類指令

請(qǐng)重點(diǎn)關(guān)注:指令的匯編格式指令的基本功能指令支持的尋址方式指令的執(zhí)行對(duì)標(biāo)志位的影響指令的特殊要求1.數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令數(shù)據(jù)交換指令堆棧操作指令標(biāo)志寄存器操作指令

輸入/輸出指令換碼指令⑴數(shù)據(jù)傳送指令指令格式:MOVDST,SRCMOVCL,40HMOVCX,AXMOVDS,AXMOVBH,[200H]MOVBX,[200H]MOVEAX,10H[EBX+ESI]數(shù)據(jù)傳送指令不影響標(biāo)志位

⑵數(shù)據(jù)交換指令指令格式:XCHGOPR1,OPR2XCHGAX,BXXCHGBX,[SI]XCHGESI,EDI數(shù)據(jù)交換指令不影響標(biāo)志位

⑶堆棧操作指令指令格式:

PUSHSRC;POPDSTPUSHAXPUSHDWORDPTR[BX]PUSHDSPOPBXPOPES堆棧指令不影響標(biāo)志位

PUSHAX;AX=1122H2211AHAL(1)(SP)-2→(SP)(2)AX→((SP))SP→11低地址高地址22例:(1)MOVAX,WORD1XCHGAX,WORD2MOVWORD2,AX例:交換存儲(chǔ)單元A與B中的內(nèi)容.設(shè):A與B已定義為字.(2)MOVAX,WORD1MOVBX,WORD2MOVWORD1,BXMOVWORD2,AX(3)PUSHWORD1PUSHWORD2POPWORD1POPWORD2⑷標(biāo)志寄存器操作指令①LAHF;標(biāo)志寄存器的低8位送入AH寄存器②SAHF;AH的內(nèi)容送入標(biāo)志寄存器的低8位③PUSHF;將16位標(biāo)志寄存器內(nèi)容壓入堆棧④POPF;將堆棧頂一個(gè)字彈出送入標(biāo)志寄存器⑤PUSHFD;將32位標(biāo)志寄存器壓入堆棧⑥POPFD;將32位標(biāo)志寄存器出棧⑦標(biāo)志位操作指令CLC;(Clearcarry)進(jìn)位標(biāo)志清零CMC;(Complementcarry)進(jìn)位標(biāo)志取反STC;(Setcarry)進(jìn)位標(biāo)志置1CLD;(Cleardirection)方向標(biāo)志清零STD;(Setdirection)方向標(biāo)志置1CLI;(Clearinterrupt)禁止可屏蔽中斷STI;(Setinterrupt)開(kāi)放可屏蔽中斷⑸輸入/輸出指令①直接端口尋址:INAX,80H;從指定端口讀一個(gè)字?jǐn)?shù)據(jù)到AX.OUT2FH,AL;把AL內(nèi)容送往指定端口.②間接端口尋址MOVDX,2F0H;將16位端口地址送DX.INAL,DX;從指定端口讀一個(gè)字節(jié)數(shù)據(jù)到AL.⑹換碼指令指令格式:XLAT;執(zhí)行的操作:(AL)←((DS)×16+(BX)+(AL))這是一種固定尋址。表格TAB中存放著數(shù)字0∽9對(duì)應(yīng)的ASCⅡ碼表.將表格中位移量為3的代碼取到AL中。30H31H32H33H34HTABMOVBX,OFFSETTABMOVAL,3XLATAL例:2.地址傳送類指令⑴偏移地址送寄存器指令指令格式:LEAREG,MEM;目的操作數(shù)不能是段寄存器,源操作數(shù)是存儲(chǔ)器操作數(shù).例如:①LEABX,[BX+SI+0F62H]與MOVBX,OFFSET[BX+SI+0F62H]指令等價(jià)②LEADX,[BX]③LEADX,TAB;傳送地址注:MOVDX,TAB;傳送該地址中的內(nèi)容TAB=001200100011001300140015281102FFLEASI,TAB;執(zhí)行后:(SI)=0012HMOVSI,TAB;執(zhí)行后:(SI)=1128HLEA指令與MOV指令的區(qū)別:⑵邏輯地址送寄存器和段寄存器指令

①32位指針?biāo)?6位寄存器和段寄存器DS指令格式:LDSREG16,MEM例如:LDSDI,[BX]LDSSI,[1010H]②32位指針?biāo)?6位寄存器和段寄存器ES指令格式:LESREG16,MEM例如:

LESDI,[BX]LESSI,[1010H]LDS或LES指令將源操作數(shù)指定的4個(gè)連續(xù)字節(jié)單元內(nèi)容分別送指令指定的寄存器和DS或ES中.其中:低16位送寄存器,高16位送DS或ES中。22H11H44H33H(DS)=C000H,(C2000H)=1122H,(C2002H)=3344HC000:2000HC000:2001HC000:2002HC000:2003H

1122

3344SIDS執(zhí)行指令:LDSSI,[2480]例:3.算術(shù)運(yùn)算類指令

加法類指令

減法類指令

乘法指令

除法指令

十進(jìn)制調(diào)整指令⑴加法類指令A(yù)DDDX,0F0FH;

ADCAX,[BX];

ADCAX,BX;

INCSI;

INCWORDPTR[SI]ADD和ADC指令會(huì)影響CF,ZF,SF,AF,OF和PF標(biāo)志位INC指令會(huì)影響OF,SF,ZF,AF和PF標(biāo)志,但不影響進(jìn)位標(biāo)志CF.例:ADDDX,0F0F0H;(DX)=4652H4652H0100011001010010

+F0F0

+111100001111000000110111010000101(DX)=3742H,ZF=0,SF=0,CF=1,OF=0例:ADCAX,CX;(AX)=0F365H,(CX)=0E024H,CF=1F365E024

+1D38A1(AX)=0D38AHSF=1,ZF=0,CF=1,OF=0⑵減法類指令SUBDX,0F0FHSBBAX,[BX]DECSIDECWORDPTR[SI]NEGBXCMPBL,50SUB,SBB和CMP,NEG指令會(huì)影響CF,ZF,SF,AF,OF和

PF標(biāo)志位.DEC指令會(huì)影響OF,SF,ZF,AF和PF標(biāo)志例:SUBBX,0136H;(BX)=4336H43360100001100110110

-0136

-0000000100110110

0100001100110110

+111111101100101001000010000000001(BX)=4200H,SF=0,ZF=0,CF=0,OF=0減法變成補(bǔ)碼加法例:利用NEG指令實(shí)現(xiàn)將負(fù)數(shù)變?yōu)檎龜?shù)。設(shè):(AX)=-4,則NEGAX后,(AX)的值為4。AX<0,則AX中的值以補(bǔ)碼形式存放(-4的補(bǔ)碼):1111111111111100NEGAX;是對(duì)AX的補(bǔ)碼進(jìn)行求補(bǔ)運(yùn)算,則變成

00000000

00000100結(jié)果為4.⑶乘法指令①無(wú)符號(hào)數(shù)乘法:MULSRC②帶符號(hào)數(shù)乘法:IMULSRC;IMULREG,SRC;IMULREG,SRC,IMM字節(jié)乘:(AX)←(AL)*(SRC);字乘:(DX,AX)←(AX)*(SRC);32位乘:(EDX,EAX)←(EAX)*(SRC);乘法指令只對(duì)CF和OF標(biāo)志位有影響,對(duì)SF,ZF,AF,PF標(biāo)志位的狀態(tài)不確定

⑷除法指令①無(wú)符號(hào)數(shù)除法:DIVSRC②帶符號(hào)數(shù)除法:IDIVSRC字節(jié)操作:(AL)←(AX)/(SRC)的商;(AH)←(AX)/(SRC)余數(shù)字操作:(AX)←(DX,AX)/(SRC)的商;(DX)←(DX,AX)/(SRC)的余數(shù)雙字操作:(EAX)←(EDX,EAX)/(SRC)的商;(EDX)←(EDX,EAX)/(SRC)的余數(shù)⑸位擴(kuò)展指令①CBW;字節(jié)擴(kuò)展為字②CWD;字?jǐn)U展為雙字③CWDE;字?jǐn)U展為雙字④CDQ;雙字?jǐn)U展為4字⑤MOVSX;符號(hào)擴(kuò)展⑥MOVZX;零位擴(kuò)展⑹十進(jìn)制調(diào)整指令指令格式說(shuō)明DAA壓縮的BCD碼加法調(diào)整DAS壓縮的BCD碼減法調(diào)整AAA非壓縮的BCD碼加法調(diào)整AAS非壓縮的BCD碼減法調(diào)整AAM乘法后的BCD碼調(diào)整AAD除法前的BCD碼調(diào)整4.邏輯運(yùn)算類指令⑴邏輯運(yùn)算指令ORAX,00FFH;低8位置1,高8位不變ANDAX,00FFH;高8位清0,低8位不變XORAL,03H;使D0D1位變反其余位不變TESTAL,80H;測(cè)試AL最高位NOTAX;對(duì)(AX)按位取反例:屏蔽AL的第0、1兩位

ANDAL,0FCH例:置AL的第5位為1

ORAL,20H

例:使AL的第0、1位變反

XORAL,3例:測(cè)試某些位是0是1

TESTAL,1JNZO

AL=

********OR00100000**1*****

AL=

******01XOR00000011

******10

AL=********AND11111100******00AL=

********AND000000010000000*⑵移位指令SHLOPR,CNT;邏輯左移SALOPR,CNT;算術(shù)左移SHROPR,CNT;邏輯右移SAROPR,CNT;算術(shù)右移ROLOPR,CNT;不帶進(jìn)位循環(huán)左移ROROPR,CNT;不帶進(jìn)位循環(huán)右移RCLOPR,CNT;帶進(jìn)位循環(huán)左移RCROPR,CNT;帶進(jìn)位循環(huán)右移邏輯左移SHLOPR,CNT算術(shù)左移SALOPR,CNT邏輯右移SHROPR,CNT算術(shù)右移SAROPR,CNT

CF0

0CFCF循環(huán)左移ROLOPR,CNT循環(huán)右移ROROPR,CNT帶進(jìn)位循環(huán)左移RCLOPR,CNT帶進(jìn)位循環(huán)右移RCROPR,CNTCF

CFCFCF設(shè)(AL)=B9H,(CF)=1,確定下列指令單獨(dú)執(zhí)行后AX的狀態(tài):SARAL,1;(AL)=DCH,CF=1SHLAX,2;相當(dāng)于AX內(nèi)容乘以4SHLAX,5;相當(dāng)于AX內(nèi)容乘以32SARAX,3;相當(dāng)于AX中帶符號(hào)數(shù)除以8SARAX,8;相當(dāng)于AX中的帶符號(hào)數(shù)除以256例:將裝在(DX,AX)中的32位數(shù)據(jù)左移1位,也就是將32位無(wú)符號(hào)數(shù)乘以2。SHLAX,1RCLDX,1;將(DX,AX)*2→(DX,AX)大循環(huán)移位指令與移位指令聯(lián)合使用可以實(shí)現(xiàn)雙精度數(shù)或多倍精度數(shù)的左右移位。例:將BX中的帶符號(hào)數(shù)除以4,取整,并回送BX中.MOVCL,2;移位次數(shù)保存在CL寄存器中SAR BX,CL;完成(BX)/4→BX的運(yùn)算,

取整,不保留余數(shù)。例:設(shè)(AX)=0011H,(BX)=0022H,將BX與AX中的數(shù)據(jù)合并,使(AX)=1122H.MOVCL,8SHLAX,CLORAX,BX例:

將一個(gè)字節(jié)數(shù)據(jù)的高4位和低4位交換.MOVAL,56H;AL=56HMOVCL,4ROLAL,CL;AL=65H,CF=1,OF=1例:統(tǒng)計(jì)BX中1的個(gè)數(shù)并存入CH寄存器中.用CL寄存器作循環(huán)計(jì)數(shù).MOVCX,0010H;(CH)=00H,(CL)=10HTESTBX,0FFFFH;測(cè)試BX是否為0JZEXT;(BX)=0則退出R1:ROLBX,1;循環(huán)左移一位,將BX最高位移入CFJCCOUNT;CF=1則轉(zhuǎn)移

JMPR2COUNT:INCCH;統(tǒng)計(jì)BX中1的個(gè)數(shù)R2:DECCL;CF=0則循環(huán)計(jì)數(shù)減1JNZR1;重復(fù)操作

┊EXT:┊例:將數(shù)組整體右移一位.ARYDD3DUP(81818181H)MOVESI,0;ESI是數(shù)組的偏移量SHRARY[ESI+8],1;將高地址的雙字右移一位RCRARY[ESI+4],1;中間的雙字循環(huán)右移一位RCRARY[ESI],1;低地址的雙字循環(huán)右移一位例:5.串操作類指令串傳送指令(MoveString)存串指令(StoreString)取串指令(LoadString)串比較指令(CompareString)串掃描指令(ScanString)串輸入(InputString)串輸出(OutputString)重復(fù)前綴(Repeat)

重復(fù)前綴REP;

REPZ;或REPE;

REPNZ;或REPNE;重復(fù)前綴不能單獨(dú)使用,只能用在串操作指令前,以實(shí)現(xiàn)串操作的重復(fù)執(zhí)行,CX寄存器的內(nèi)容是默認(rèn)的重復(fù)次數(shù),每執(zhí)行一次重復(fù)操作,(CX)減1,(CX)是剩下還未處理的單元數(shù),(CX)=0則退出重復(fù)操作,表明已經(jīng)處理完所有的單元.

串傳送指令MOVSB;MOVSW;MOVSD;MOVSDST,SRC;將源串?dāng)?shù)據(jù)傳送到目的串執(zhí)行:REPMOVSB或REPMOVSW

之前,應(yīng)先做好:(1)源串首地址(末地址)

→SI(2)目的串首地址(末地址)

→DI(3)串長(zhǎng)度→CX(4)建立方向標(biāo)志

(CLD使DF=0,STD使DF=1)leasi,mess1leadi,mess2mov

cx,17cldrepmovsb例:(SI)

(DI)

數(shù)據(jù)段附加段(SI)

(DI)

DF=0DF=1

存串指令STOSB;STOSW;STOSD;STOSDST;將AL或AX或EAX中的數(shù)據(jù)裝入目的串中LEADI,DST;由DI指向目的串的首地址

MOVAL,0;初始化ALMOVCX,100;用CX存放傳送次數(shù)

CLD;DF=0,使地址增量L:STOSB;傳送一個(gè)字節(jié)

DECCX;傳送次數(shù)減1JNZL;CX≠0,則繼續(xù);;否則,結(jié)束存串操作

┊例:

LEADI,DST;DI指向目的串首地址MOVAL,0;初始化ALMOVCX,100;用CX存放傳送次數(shù)CLD;DF=0,使地址增量REPSTOSB;將100個(gè)字節(jié)清零例:

取串指令LODSB;LODSW;LODSD;LODSSRC;將源串中的數(shù)據(jù)存入AL或AX或EAX中LEASI,SRC;用SI指向字節(jié)串SRC首地址

LEADI,EVEN;用DI指向存放偶數(shù)的緩沖區(qū)首地址

LEABX,ODD;用BX指向存放奇數(shù)的緩沖區(qū)

MOVCX,100;待處理的串長(zhǎng)度存CX中

CLD;使DF=0,地址增量G:LODSES:[SI];取一個(gè)數(shù)

TESTAL,01H;測(cè)D0位,D0=0為偶數(shù),D0=1為奇數(shù)

JNZO;為奇數(shù)則轉(zhuǎn)移E:STOSB;把偶數(shù)存入以EVEN為首地址的緩沖區(qū)

JMPAG;無(wú)條件轉(zhuǎn)移到AG去執(zhí)行程序O:XCHGBX,DI;使DI暫時(shí)指向存放奇數(shù)的緩沖區(qū)

STOSB;將奇數(shù)存放在ODD為首地址的緩沖區(qū)中

XCHGBX,DI;交換指針的內(nèi)容AG:DECCX;CX總是保存著未處理數(shù)據(jù)的個(gè)數(shù)

JNZG;數(shù)據(jù)未處理完則繼續(xù)例:

串比較指令CMPSB;CMPSW;CMPSD;CMPSSRC,DST;源串與目的串相減,不回送結(jié)果SRCDD20DUP(1234ABCDH);定義雙字變量DSTDD20DUP(1234ABCDH);定義雙字變量

┊CLD;DF=0,向高地址方向比較MOVECX,20;建立REP的計(jì)數(shù)器LEAESI,SRC;使ESI指針指向源串LEAEDI,DST;使EDI指針指向目的串REPECMPSD;比較雙字?jǐn)?shù)據(jù)串,直到

ECX=0或找到不相同的位置例:

串掃描指令SCASB;SCASW;SCASD;SCASDST;將AL或AX或EAX的內(nèi)容與目的串相減,不回送結(jié)果STRDB‘XYZABCD’LEADI,STR;DI指向串STR首地址

MOVAL,‘A’;AL中存放要查找的字符

MOVCX,CN;存串長(zhǎng)度

CLDREPNZSCASB;ZF=0且CX≠0重復(fù)查找

JZFOUND;ZF=1,找到字符A,轉(zhuǎn)移

JMPEXT;未找到(ZF=0并且CX=0),則退出FOUND:┆EXT:┉例:

串輸入INSDST,DX;INSB;INSW;INSD;將端口數(shù)據(jù)輸入到附加段的目的串中從端口地址03A0H的I/O設(shè)備輸入100個(gè)字節(jié)數(shù)據(jù),設(shè)I/O設(shè)備總是準(zhǔn)備好傳送數(shù)據(jù).LEADI,LIST;用DI指向目的串MOVDX,03A0H;端口地址送DXCLD;DI自動(dòng)加1MOVCX,100;CX裝計(jì)數(shù)值REPINSB;從端口輸入數(shù)據(jù)存入

DI指向的內(nèi)存單元例:

串輸出OUTSDX,SRC;OUTSB;OUTSW;OUTSD;將數(shù)據(jù)段中的源串?dāng)?shù)據(jù)輸出到端口將存放在數(shù)據(jù)段中的100個(gè)字節(jié)數(shù)據(jù)ARY傳送到端口地址03A2H的I/O設(shè)備中.假設(shè)I/O設(shè)備總是準(zhǔn)備好的狀態(tài).LEASI,ARY;用SI指向數(shù)組MOVDX,03A2H;端口地址送DXCLD;SI自動(dòng)加1MOVCX,100;CX裝計(jì)數(shù)值REPOUTSB;將SI指向的內(nèi)存單元數(shù)據(jù)輸出到端口例:6.控制轉(zhuǎn)移類指令無(wú)條件轉(zhuǎn)移指令(JMP)子程序調(diào)用與返回指令(CALL和RET)條件轉(zhuǎn)移指令(JCC)循環(huán)控制指令(LOOP)中斷與返回指令(INT和IRET)BIOS和DOS系統(tǒng)功能調(diào)用

⑴無(wú)條件轉(zhuǎn)移指令JMPDISP;段內(nèi)直接轉(zhuǎn)移,位移量DISP可以是

8位、16位或32位JMPBX;段內(nèi)間接轉(zhuǎn)移,BX內(nèi)容是段內(nèi)偏移地址JMPWORDPTR[SI];段內(nèi)間接轉(zhuǎn)移,SI指向的內(nèi)存單元中的一個(gè)字是段內(nèi)偏移地址JMPEBX;段內(nèi)間接轉(zhuǎn)移,EBX內(nèi)容是偏移地址JMPDWORDPTR[ESI];段內(nèi)間接轉(zhuǎn)移,ESI指向的內(nèi)存單元的一個(gè)雙字是偏移地址JMPFWORDPTR[ADDR];段間間接轉(zhuǎn)移,ADDR中存放一個(gè)48位的指針,其中低32位送EIP寄存器,高16位送CS寄存器.JMPFWORDPTR[EBX];段間間接轉(zhuǎn)移,EBX指向的內(nèi)存中的48位內(nèi)容就是轉(zhuǎn)移地址,其中的低32位送EIP寄存器,高16位送CS寄存器.⑵子程序調(diào)用與返回指令CALLDISP16;段內(nèi)直接調(diào)用,16位的位移量CALLDISP32;段內(nèi)直接調(diào)用,32位的位移量CALLDISP48;段間直接調(diào)用,48位的邏輯地址CALLMEM16;段內(nèi)間接調(diào)用,16位指針作為偏移地址送IPCALLMEM32;段內(nèi)間接調(diào)用,32位指針是偏移地址送EIPCALLMEM48;段間間接調(diào)用,48位指針是邏輯地址CS:EIPCALLREG16;段內(nèi)間接調(diào)用,16位指針作為偏移地址送IPCALLREG32;段內(nèi)間接調(diào)用,32位指針是偏移地址送EIPRET;NEAR或FAR類型的子程序返回RETn;子程序返回,并修改堆棧指針:

SP←SP內(nèi)容加n,或ESP←ESP內(nèi)容加n。⑶條件轉(zhuǎn)移指令JZ/JE;ZF=1轉(zhuǎn)移JNZ/JNE;ZF=0轉(zhuǎn)移JS;SF=1轉(zhuǎn)移JNS;SF=0轉(zhuǎn)移JO;OF=1轉(zhuǎn)移JNO;OF=0轉(zhuǎn)移JCXZ;CX=0轉(zhuǎn)移條件轉(zhuǎn)移指令都不影響標(biāo)志位。利用標(biāo)志位作為測(cè)試條件,不同的條件轉(zhuǎn)移指令有不同的測(cè)試條件.AX中存放一個(gè)帶符號(hào)數(shù),若AX為正數(shù),使DX清零;若AX為負(fù)數(shù),使DX=FFFFH.

TESTAX,8000HJZZEROMOVDX,0FFFFHJMPNEXTZERO:MOVDX,0NEXT:┊例:⑷循環(huán)控制指令LOOPOPR;CX←CX-1;CX≠0則循環(huán)LOOPZOPR;CX←CX-1;ZF=1且CX≠0則循環(huán)LOOPNZOPR;CX←CX-1;ZF=0且CX≠0則循環(huán)MOVCX,10;循環(huán)次數(shù)N:┊;循環(huán)體

┊LOOPN;計(jì)數(shù)器減1.CX≠0循環(huán);CX=0退出循環(huán)⑸中斷與返回指令I(lǐng)NTn;中斷類型碼n(00H∽FFH)INTO;溢出標(biāo)志OF=1啟動(dòng)的中斷IRET;從堆棧中恢復(fù)程序斷點(diǎn),返回⑹BIOS和DOS系統(tǒng)功能調(diào)用它們都是內(nèi)部中斷調(diào)用,其步驟為:(1)將入口參數(shù)送到指定的寄存器中;(2)將系統(tǒng)功能號(hào)送入AH寄存器中;(3)按中斷類型碼n調(diào)用BIOS或DOS中斷,即:執(zhí)行中斷指令“INTn”完成中斷調(diào)用。(4)檢查出口參數(shù),分析調(diào)用結(jié)果是否正確。⑺幾種常用的系統(tǒng)功能調(diào)用01H號(hào)調(diào)用,讀取鍵盤(pán)字符并回顯。功能:首先掃描鍵盤(pán),等待按鍵。若有鍵按下,則檢查所按鍵碼。當(dāng)按Ctrl+Break鍵時(shí),則退出執(zhí)行。當(dāng)按其它鍵時(shí),則將對(duì)應(yīng)鍵的ACSII碼送AL寄存器,同時(shí)回送在顯示器上。調(diào)用方式:MOVAH,01H;調(diào)用號(hào)裝AH寄存器INT21H;從鍵盤(pán)輸入一個(gè)字符02H號(hào)調(diào)用,顯示字符。功能:在顯示器當(dāng)前光標(biāo)的位置輸出顯示一個(gè)字符。當(dāng)DL中存放退格符BS(08H),響鈴符BEL(07H),回車(chē)符CR(0DH),換行符LF(0AH),該功能調(diào)用能進(jìn)行相應(yīng)的處理。如果是Ctrl+Break,則退出執(zhí)行。調(diào)用方式:

MOVAH,02H;調(diào)用號(hào)裝AH寄存器

MOVDL,‘A’;輸出字符ACSII碼裝DL寄存器

INT21H;顯示字符A09H號(hào)調(diào)用,字符串輸出顯示。功能:在標(biāo)準(zhǔn)輸出設(shè)備(顯示器)上輸出顯示一字符串.字符串必須存放內(nèi)存中并以$為結(jié)束標(biāo)志,但$不顯示.要求DS:DX作為該字符串的首地址.顯示字符后作Ctrl+Break檢查和處理.調(diào)用方式:

MOVBX,SEGSTRINGMOVDS,BX;DS←輸出字符串的段地址

LEADX,STRING;DX←輸出字符串偏移地址

MOV AH,09H;9號(hào)功能調(diào)用

INT21H;將內(nèi)存中的字符串輸出顯示檢查程序執(zhí)行過(guò)程中是否有鍵盤(pán)輸入,按任意鍵退出。

L:┊

MOVAH,0BH;功能號(hào)送AH中

INT21H;讀鍵盤(pán)狀態(tài),AL=FFH有鍵入,AL=0無(wú)鍵入

INCALJNZL;無(wú)鍵盤(pán)輸入,繼續(xù)

RET;有鍵入,返回例:7.處理器控制類指令

⑴狀態(tài)標(biāo)志位處理指令CLC(Clearcarry);進(jìn)位標(biāo)志CF=0STC(Setcarry);進(jìn)位標(biāo)志CF=1CMC(Complementcarry);進(jìn)位標(biāo)志求反CLD(Cleardirection);方向標(biāo)志DF=0STD(Setdirection);方向標(biāo)志DF=1CLI(Clearinterrupt);中斷標(biāo)志IF=0(關(guān)中斷)STI(Setinterrupt);中斷標(biāo)志IF=1(開(kāi)中斷)⑵其它處理器控制指令NOP(Nooperation);空操作指令,常用來(lái)作延時(shí),或取代其他指令作調(diào)試之用.HLT(Halt);停機(jī)指令,CPU暫停執(zhí)行程序,等待硬件中斷。ESC(Escape);換碼指令,80486以后已成為未定義指令.WAIT(Wait);等待指令,使處理器處于空轉(zhuǎn)狀態(tài),也可以用來(lái)等待外部中斷發(fā)生,但中斷處理完后仍返回WAIT指令繼續(xù)等待.LOCK(Lock);封鎖指令,作為指令的前綴可位于任何指令的前端,而不是一條獨(dú)立的指令,凡帶有LOCK前綴的指令,在該指令執(zhí)行過(guò)程中都禁止其他協(xié)處理器占用總線,故它可稱為總線鎖定前綴.第三節(jié)匯編語(yǔ)言程序格式⑴匯編語(yǔ)言特性

程序注釋:用一個(gè)分號(hào)開(kāi)始保留字:具有特定意義的字標(biāo)識(shí)符:變量名和標(biāo)號(hào)語(yǔ)句:語(yǔ)句類型和語(yǔ)句格式運(yùn)算符:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、數(shù)值返回運(yùn)算符等。

⑵偽指令

變量定義偽指令DB:定義字節(jié)變量,每一個(gè)表達(dá)式占一個(gè)字節(jié).DW:定義字變量,每一個(gè)表達(dá)式占兩個(gè)字節(jié),低字節(jié)在低地址,高字節(jié)在高地址。DD:定義雙字變量,每一個(gè)表達(dá)式占四個(gè)字節(jié),低字在低地址,高字在高地址。DQ:定義四字變量,每一個(gè)表達(dá)式占八個(gè)字節(jié),低字在低地址,高字在高地址。DT:定義十個(gè)字節(jié),每一個(gè)表達(dá)式占十個(gè)字節(jié),低字在低地址,高字在高地址。②

相等偽指令為常量定義一個(gè)符號(hào),有兩種:等號(hào)偽指令COU=1234H;允許重復(fù)定義,多次使用EQU偽指令CNTEQU123;不能重新賦值,可多次使用③

完整的段定義偽指令SEGMENT/ENDS偽指令必須成對(duì)使用,共同定義一個(gè)邏輯段。如:段名SEGMENT

┊;匯編語(yǔ)言指令序列段名ENDSASSUME偽指令指定程序中段與段寄存器之間的關(guān)系。如:ASSUMECS:CODE,DS:DATA,...ORG偽指令如:ORG100HDATASEGMENT;定義數(shù)據(jù)段BUFDB11H,22H;定義字節(jié)數(shù)據(jù)緩沖區(qū)DATAENDS;數(shù)據(jù)段結(jié)束STACKSEGMENT;定義堆棧段STDB50DUP(?);設(shè)置堆棧的大小是50字節(jié)STACKENDS;堆棧段結(jié)束CODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFAR;把主程序定義為子程序START:┊;匯編指令序列MOVAH,4CHINT21H;返回DOSMAINENDP;子程序結(jié)束CODEENDS;代碼段結(jié)束

ENDSTART;程序結(jié)束④

簡(jiǎn)化的段定義偽指令.MODELSMALL;定義程序的存儲(chǔ)模式.STACK;建立一個(gè)堆棧段.DATA;建立一個(gè)數(shù)據(jù)段

┊;在數(shù)據(jù)段中定義變量.CODE;建立一個(gè)代碼段.STARTUP;設(shè)置程序的起始點(diǎn)

┊;可執(zhí)行指令構(gòu)成的程序段.EXIT0;程序結(jié)束,返回操作系統(tǒng)

END;匯編結(jié)束⑤

子程序定義偽指令子程序名PROC[類型];子程序開(kāi)始

┊;匯編語(yǔ)言指令序列

RET;子程序返回到調(diào)用處子程序名ENDP;子程序結(jié)束子程序名是子程序入口的符號(hào)地址;類型屬性有NEAR和FAR;子程序是完成一個(gè)特定功能的指令序列,用CALL指令調(diào)用子程序,RET指令返回到調(diào)用處。⑥

處理器選擇偽指令.8086選擇8086指令系統(tǒng)(缺省情況).286選擇80286指令系統(tǒng).286P選擇保護(hù)模式下的80286指令系統(tǒng).386選擇80386指令系統(tǒng).386P選擇保護(hù)模式下的80386指令系統(tǒng).486選擇80486指令系統(tǒng).486P選擇保護(hù)模式下的80486指令系統(tǒng).586選擇Pentium指令系統(tǒng).586P選擇保護(hù)模式下Pentium指令系統(tǒng)⑶匯編語(yǔ)言源程序舉例

實(shí)現(xiàn)從鍵盤(pán)接收十進(jìn)制數(shù)并存入BX中..MODELTINY;建立微型存儲(chǔ)模式.CODE;建立一個(gè)代碼段.STARTUP;設(shè)置程序的起始點(diǎn)

MOVBX,0C:MOVAH,1;DOS調(diào)用:鍵盤(pán)輸入

INT21HSUBAL,30HJLEX;小于0退出CMPAL,9JGEX;大于9退出

CBWXCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPCEX:

.EXIT;程序結(jié)束,返回操作系統(tǒng)

END;匯編結(jié)束⑷常用的DEBUG命令

DEBUG是常用的匯編語(yǔ)言級(jí)調(diào)試工具,為匯編語(yǔ)言程序員提供了分析指令、跟蹤程序的有效手段。-A匯編 -U反匯編-T單步執(zhí)行-G斷點(diǎn)執(zhí)行-D數(shù)據(jù)顯示-R寄存器-E修改內(nèi)存-Q退出DEBUG

-I端口輸入

-O端口輸出

第四節(jié)匯編語(yǔ)言程序設(shè)計(jì)方法

1.表格與數(shù)組的處理方法

ARYDW10H,20H,30H;建立一字?jǐn)?shù)組LEASI,ARY;用SI作為指針指向數(shù)組首地址MOVAX,[SI];將SI所指的內(nèi)存單元送

AX,(AX)=0010HADDSI,2;修改指針,指向數(shù)組下一個(gè)元素

┊利用相對(duì)基址變址尋址方式處理二維數(shù)組

ROW=2;設(shè)置行號(hào)COL=3;設(shè)置列號(hào)MOVEBX,C*ROW;EBX設(shè)置為行偏移MOVESI,COL;ESI設(shè)置為列偏移MOVAL,ARY[EBX+ESI];用相對(duì)的基址加變址的尋址方式來(lái)訪問(wèn)數(shù)組例:將一張語(yǔ)文成績(jī)表按學(xué)號(hào)從小到大的順序排列在內(nèi)存中,用查表法查找班里某同學(xué)的成績(jī),并在屏幕上顯示。

.MODELSMALL;定義程序的存儲(chǔ)模式

.STACK;建立一個(gè)堆棧段

.DATA;建立一個(gè)數(shù)據(jù)段

TABDB80,85,86,71;按學(xué)號(hào)順序排列

DB79,96,83,56DB32,66,78,84NO DB10;任意設(shè)定一個(gè)學(xué)號(hào)

CHIDB?

.CODE;建立一個(gè)代碼段

.STARTUP;設(shè)置程序的起始點(diǎn)例:LEABX,TAB;BX指向表的首地址MOVAL,NODECAL;距表首地址的位移量XLAT;換碼:AL←DS:[BX+AL]MOVCHI,AL;將找到的一個(gè)成績(jī)存入內(nèi)存CALLDECSHOW;調(diào)用一個(gè)子程序.EXIT0END設(shè)主程序中已經(jīng)定義了一個(gè)正數(shù)數(shù)組ARY,其最后一個(gè)元素的地址是BRY,并已按升序排列,編寫(xiě)程序,將一正數(shù)M插入到該數(shù)組中,使數(shù)組仍按升序排列。

.MODELSMALL.386P.DATAMESSAGEDB"WelcometouseASM!$"XDW?ARYDW100,200,240,330BRYDW160NDW?MDW270.CODE.STARTUPMOVAX,M例:MOVX,0FFFFHMOVSI,0L:CMPbry[SI],AX;從數(shù)組末開(kāi)始比較

JLEIMOVBX,bry[SI];SI指向的元素向下移一個(gè)字

MOVbry[SI+2],BXDECSIDECSI;指針向上移一個(gè)字

JMPLI:MOVbry[SI+2],AX;插入新元素

LEADX,MESSAGEMOVAH,09HINT21HMOVAH,4CHINT21H.EXITEND將數(shù)組ARY中的數(shù)據(jù)按從小到大的順序排列。

.MODELSMALL;定義程序的存儲(chǔ)模式

.STACK;建立一個(gè)堆棧段

.DATA;建立一個(gè)數(shù)據(jù)段

ARYDD11H,22H,33H,44HDD10H,20H,30H,40H;定義數(shù)組

CEQU($-ARY)/TYPEARY;ARY所占數(shù)據(jù)個(gè)數(shù)

.CODE;建立一個(gè)代碼段

.STARTUP;設(shè)置程序的起始點(diǎn)

MOVECX,CDECECX;設(shè)置循環(huán)計(jì)數(shù)器例:OL:PUSHECX;保存外循環(huán)計(jì)數(shù)

LEAESI,ARY;ESI指向ARY的第一個(gè)數(shù)據(jù)IL:MOVEAX,[ESI];取ARY的一個(gè)數(shù)據(jù)

CMP[ESI+4],EAX;比較相鄰兩個(gè)數(shù)據(jù)

JGENX;前一個(gè)數(shù)據(jù)小于下一個(gè)數(shù)據(jù)不交換

XCHGEAX,[ESI+4];交換,使小的數(shù)據(jù)在前

MOV[ESI],EAXNX:ADDESI,4;ESI指向下一個(gè)數(shù)據(jù)

LOOPIL;內(nèi)循環(huán),每一對(duì)相鄰數(shù)據(jù)進(jìn)行比較

POPECX;恢復(fù)外循環(huán)計(jì)數(shù)

LOOPOL;外循環(huán),進(jìn)行下一遍掃描

.EXIT0;程序結(jié)束,返回操作系統(tǒng)

END;匯編結(jié)束

2.子程序設(shè)計(jì)

對(duì)一個(gè)32位整數(shù)數(shù)組求和。.MODELSMALL.386P.DATAMESSAGEDB"WelcometouseASM!$"ARYDD110000H,220000H,330000H,440000H,550000H,660000HSUMDD?.CODE.STARTUP

例:MAINPROCFARLEAESI,ARY;數(shù)組的偏移地址存入ESIMOVECX,LENGTHOFARY;數(shù)組的長(zhǎng)度

CALLARYSUM;調(diào)用一個(gè)求和子程序

MOVSUM,EAX;子程序運(yùn)行結(jié)果存SUMLEADX,MESSAGEMOVAH,09hINT21HMOVAH,07HINT21HMOVAH,4CHINT21hRET;返回

MAINENDP;主程序結(jié)束;定義一個(gè)求和子程序

ARYSUMPROC;子程序定義

PUSHESI;將寄存器內(nèi)容保存在堆棧中

PUSHECXMOVEAX,0L:ADDEAX,[ESI]ADDESI,4LOOPLPOPECXPOPESI;把寄存器內(nèi)容恢復(fù)原狀

RET;返回主程序ARYSUMENDP;子程序結(jié)束

END3.結(jié)構(gòu)與宏

⑴結(jié)構(gòu)

結(jié)構(gòu)是將不同類型但又相互關(guān)聯(lián)的數(shù)據(jù)組織到一個(gè)數(shù)據(jù)結(jié)構(gòu)中。結(jié)構(gòu)的使用應(yīng)包含以下的三個(gè)步驟:結(jié)構(gòu)的定義結(jié)構(gòu)名STRUCT┊;域的聲明結(jié)構(gòu)名ENDS結(jié)構(gòu)內(nèi)部是域的聲明,用定義變量的格式來(lái)定義域。例如:

PERSONSTRUCTIDDB‘01234’NAMEDB‘ABCDE’YEARSDB0SALARYDD0PERSONENDS結(jié)構(gòu)變量的定義(也稱為結(jié)構(gòu)預(yù)置)

結(jié)構(gòu)變量名結(jié)構(gòu)名<結(jié)構(gòu)中域的初值表>結(jié)構(gòu)名是結(jié)構(gòu)定義時(shí)用的名字結(jié)構(gòu)變量名是程序中具體使用的變量,程序中可以直接引用它結(jié)構(gòu)中域的初值表是給結(jié)構(gòu)變量賦初值,其排列順序及類型與結(jié)構(gòu)定義時(shí)一致,采用尖括號(hào),各域之間用逗號(hào)分隔結(jié)構(gòu)中域的內(nèi)容采用結(jié)構(gòu)定義時(shí)的初值,我們可以這樣定義結(jié)構(gòu)變量:

PPERSON<>也可以用特定的值對(duì)結(jié)構(gòu)變量進(jìn)行初始化:P1PERSON<‘10112’,‘LINDA’,28,50000>P2PERSON<‘10113’,‘HARRY’,26,45000>P3PERSON<‘10330’,‘SUSAN’,18,30000>

結(jié)構(gòu)變量的引用程序中可以直接寫(xiě)結(jié)構(gòu)變量名來(lái)引用結(jié)構(gòu)變量,如:MOVBX,OFFSETP1;用指針BX指向結(jié)構(gòu)變量P1的首地址。也可以引用結(jié)構(gòu)變量中的某一個(gè)域,其格式為:結(jié)構(gòu)變量名?結(jié)構(gòu)字段(域)名MOVAL,P1?NAME;將結(jié)構(gòu)變量P1中

NAME域的值送AL中MOVP2?YEARS,30;將P2中YEARS域的值更新為30MOVCX,TYPEPERSON;TYPE操作符返回結(jié)構(gòu)的字節(jié)數(shù)MOVDX,TYPEPERSON?SALARY;TYPE操作符返回結(jié)構(gòu)的SALARY域占用的字節(jié)數(shù)。將三個(gè)員工的工號(hào)、姓名、年齡、年薪等信息,以結(jié)構(gòu)的形式存入內(nèi)存中,顯示年齡小于28歲的員工的姓名。.DATAPERSONSTRUCT;定義一個(gè)結(jié)構(gòu)IDDB‘01234’;結(jié)構(gòu)內(nèi)部定義域NAMEDB‘ABCDE’;該結(jié)構(gòu)中含有4個(gè)域YEARSDB0SALARYDD0PERSONENDS;定義三個(gè)結(jié)構(gòu)變量,;并對(duì)結(jié)構(gòu)中的域初始化P1PERSON<‘10112’,‘LINDA’,28,50000>P2PERSON<‘10113’,‘HARRY’,26,45000>P3PERSON<‘10330’,‘SUSAN’,18,30000>.CODEMOVDH,3;統(tǒng)計(jì)3個(gè)結(jié)構(gòu)變量LEABX,P1;BX指向結(jié)構(gòu)P1的第一個(gè)字節(jié)例:B:MOVAL,[BX]?PERSON?YEARS;取結(jié)構(gòu)的YEARS域的值CMPAL,28;小于28歲?JGENS;≥28,不顯示MOVCX,5;PERSON結(jié)構(gòu)的NAME域包含5個(gè)字符SHOW:MOVDL,[BX]?PERSON?NAME;顯示姓名MOVAH,2;DOS2號(hào)功能調(diào)用INT21HINCBX;BX指向NAME域中下一個(gè)字符LOOPSHOW;顯示NAME域的每一個(gè)字符SUBBX,5NS:ADDBX,15;使BX指向下一個(gè)結(jié)構(gòu)的首地址DECDHJNZB;對(duì)下一個(gè)結(jié)構(gòu)進(jìn)行操作.EXIT0END⑵

①宏的定義宏指令名MACRO[形式參數(shù)表]┊;;宏定義體宏指令名ENDM宏定義體是一段具有獨(dú)立功能的匯編語(yǔ)言代碼將內(nèi)存到內(nèi)存的數(shù)據(jù)傳送用宏來(lái)實(shí)現(xiàn)。例如:COPYMACRODEST,SRCPUSHAXMOVAX,SRCMOVDEST,AXPOPAXCOPYENDM

②宏調(diào)用

宏定義后的宏指令在源程序中調(diào)用,宏調(diào)用的格式為:宏指令名[實(shí)參數(shù)表]實(shí)參數(shù)的順序必須與宏定義中的參數(shù)順序相同對(duì)已經(jīng)定義的宏指令,只要直接寫(xiě)出宏指令名,就能調(diào)用:COPYVAL1,VAL2就能實(shí)現(xiàn)在變量之間的數(shù)據(jù)傳送。③宏展開(kāi)

例如,上例的宏調(diào)用后,編譯器將自動(dòng)把宏展開(kāi)成下面的代碼:1PUSHAX1MOVAX,VAL11MOVVAL2,AX1POPAX左邊的1表示宏的展開(kāi)層次,如果在宏內(nèi)又調(diào)用了其它宏,該層次的值就會(huì)增加。④取消宏指令

格式:PURGE宏指令名列表其中,宏指令名列表是一些已經(jīng)定義的宏指令,它們之間用逗號(hào)分隔。PURGE偽指令將取消這些已經(jīng)定義的宏指令。4.模塊化程序設(shè)計(jì)主程序與子程序間的參數(shù)傳遞入口參數(shù)(輸入?yún)?shù))——主程序調(diào)用子程序時(shí),提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù))——子程序執(zhí)行結(jié)束返回給主程序的參數(shù)參數(shù)的具體形式傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法通過(guò)寄存器傳遞通過(guò)共享變量傳遞通過(guò)堆棧傳遞⑴用寄存器傳遞參數(shù)最簡(jiǎn)單和常用的參數(shù)傳遞方法是通過(guò)寄存器,只需要把參數(shù)存于約定的寄存器中由于通用寄存器個(gè)數(shù)有限,這種方法對(duì)少量數(shù)據(jù)可以直接傳遞數(shù)值,而對(duì)大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù),帶有入口參數(shù)的寄存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致⑵用共享變量傳

溫馨提示

  • 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)論