




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全環(huán)保知識(shí)培訓(xùn)記錄
- 企業(yè)安全生產(chǎn)許可證的有效期為
- 鄭州安全生產(chǎn)培訓(xùn)
- 2025屆云南省紅河州云南市蒙自一中高二物理第二學(xué)期期末質(zhì)量檢測(cè)模擬試題含解析
- 上海市復(fù)旦附中浦東分校2025年高二物理第二學(xué)期期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 2025年北京市海淀區(qū)重點(diǎn)初中高二物理第二學(xué)期期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 湖北省荊門(mén)市2025年物理高一第二學(xué)期期末復(fù)習(xí)檢測(cè)試題含解析
- 甘肅省定西市岷縣二中2025年物理高二下期末考試試題含解析
- 廣東省廣州市越秀區(qū)實(shí)驗(yàn)中學(xué)2025屆高一物理第二學(xué)期期末考試模擬試題含解析
- 2025屆福建省泉州三中物理高一第二學(xué)期期末預(yù)測(cè)試題含解析
- 溫州市2024-2025學(xué)年高一下學(xué)期期末英語(yǔ)測(cè)試卷
- 家具工藝培訓(xùn)課件
- 2024年杭州蕭山區(qū)衛(wèi)健系統(tǒng)事業(yè)單位招聘考試真題
- 2025年數(shù)字貨幣對(duì)貨幣政策傳導(dǎo)機(jī)制影響深度分析報(bào)告
- 2025-2030年中國(guó)ETC(電子收費(fèi))行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- T/CECS 10355-2024鐵路工程混凝土用火成巖石粉
- 包過(guò)培訓(xùn)班合同協(xié)議書(shū)
- 供應(yīng)鏈風(fēng)險(xiǎn)管理研究現(xiàn)狀與未來(lái)趨勢(shì)綜述
- 意外險(xiǎn)銷售團(tuán)隊(duì)培訓(xùn)策略-洞察闡釋
- 小學(xué)一至六年級(jí)《體育與健康》健康課教案
- 2025中國(guó)臨床腫瘤學(xué)會(huì)CSCO非小細(xì)胞肺癌診療指南要點(diǎn)解讀課件
評(píng)論
0/150
提交評(píng)論