




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
匯編語言程序設計第一節(jié)80X86的尋址方式固定尋址立即數(shù)尋址寄存器尋址存儲器尋址I/O端口尋址與轉移地址有關的尋址1.固定尋址這是一種特定的單操作數(shù)指令,其操作數(shù)隱含在操作碼中,常常是對某一個固定的寄存器進行操作。例如:
CBW;(AL)→(AX)該指令指定的操作數(shù)在AL寄存器中,其功能是將AL寄存器中的符號位擴展到AH中。形成16位的操作數(shù)存放在AX中。2.立即數(shù)尋址這種尋址方式下,操作數(shù)就包含在指令中,作為指令的一部分,它與操作碼一起存放在代碼段中。例如:
MOVAX,1102H;給AX寄存器賦值立即數(shù)尋址只能用于源操作數(shù)的尋址,而不能用于目的操作數(shù)的尋址。MOVBX,0A123H
指令執(zhí)行后(BX)=0A123HBX:代碼段A123OP:存儲器例:3.寄存器尋址操作數(shù)在CPU內部的寄存器中,指令指定寄存器名,操作數(shù)的位數(shù)由寄存器名決定。例如:MOVAX,BX;將BX的內容送AX中。MOV[1234H],BX;將BX內容送地址為1234H的內存單元中。直接尋址方式寄存器間接尋址方式寄存器相對尋址方式基址變址尋址方式相對基址變址尋址方式比例變址尋址方式4.存儲器尋址操作數(shù)的偏移地址就包含在指令中,默認段是數(shù)據(jù)段。例如:MOVAL,[2000H];將DS段中偏移地址為2000H的字節(jié)單元內容送寄存器AL中.MOVAX,ES:[2000H];將附加段中偏移地址為2000H的字單元內容送寄存器AX中.⑴直接尋址方式MOVAX,[1122H];
設(DS)=3000H存儲器中操作碼后面是操作數(shù)的偏移地址.物理地址=3000H*16+1122H=31122H,該內存單元的內容送AX寄存器.執(zhí)行指令后,(AX)=3456H例:操作數(shù)的偏移地址存放在指令指定的寄存器中,寄存器作為指針指向內存單元,這樣的寄存器稱為間址寄存器。操作數(shù)在存儲器中。例如:MOVAX,[SI];數(shù)據(jù)段中一個字送AXMOVAX,ES:[DI];附加段中一個字送AXMOVAX,[BP];堆棧段中一個字送AXMOVAX,DS:[BP];數(shù)據(jù)段中一個字送AX⑵寄存器間接尋址方式例:MOVAX,[BX];
設(DS)=2000H,(BX)=1234H物理地址=20000H+1234H=21234H指令執(zhí)行后(AX)=5678H操作數(shù)的偏移地址是間址寄存器的內容加上位移量,位移量是地址的一部分。例如:MOVAX,10H[SI]MOVAX,ES:10H[SI]MOVAX,TABLE[SI]位移量TABLE是表的首地址,間址寄存器SI的內容加上位移量就是要訪問的表中的某一數(shù)據(jù).⑶寄存器相對尋址方式
MOVAX,COUNT[BX]
(DS)=3000H,(BX)=1234H,COUNT=1000H
物理地址=30000H+1234H+1000H=32234H
指令執(zhí)行后
(AX)=5678H例:操作數(shù)的偏移地址一部分在基址寄存器,一部分在變址寄存器,基址寄存器的內容與變址寄存器的內容之和就是操作數(shù)的偏移地址。例如:
MOVAX,[BX][SI];
MOVAX,ES:[BX][SI];⑷基址變址尋址方式
MOVAX,[BX][SI](DS)=2100H,(SI)=1234H,(BX)=1100H
物理地址=21000H+1234H+1100H=23334H
指令執(zhí)行后
(AX)=5678H例:帶位移量的基址變址尋址稱為相對的基址變址尋址方式。例如:MOVAX,100H[BX][SI]MOVAX,ES:100H[BX][SI]MOVAX,100H[BP][SI]
⑸相對基址變址尋址方式比例變址尋址方式只能在32位及以后的系統(tǒng)中使用。操作數(shù)的有效地址是變址寄存器的內容乘以指令中指定的比例因子再加上位移量。例如:
MOVAX,[EBX+4*EDI+20H];這是32位尋址,指令執(zhí)行的結果是將數(shù)據(jù)段中偏移地址為(EBX)+4*(EDI)+20H的內存單元的一個字數(shù)據(jù)送AX寄存器中.⑹比例變址尋址方式5.I/O端口尋址⑴直接端口尋址——指令中包含I/O端口的直接地址(8位端口)。
INAL,80H;讀80H端口的數(shù)據(jù)
OUT80H,AL;往80H端口寫數(shù)據(jù)⑵間接端口尋址——用DX寄存器間接訪問端口(16位端口)。
MOVDX,200H;將端口號200H存入DX中
OUTDX,AL;將(AL)輸出到DX所指的端口中
6.與轉移地址有關的尋址轉移指令用來改變程序的正常執(zhí)行順序,指令中提供了轉移地址的段地址和偏移地址。段內轉移和段間轉移都可以使用直接尋址和間接尋址。⑴段內直接尋址。JMPLABEL⑵段內間接尋址。JMPBX;JMPWORDPTR[BP]⑶段間直接尋址。JMPFARPTRLABEL⑷段間間接尋址。JMPDWORDPTR[SI]求下面兩條轉移指令的轉移地址A1和A2分別是多少?(1)3000:0110
EBF7JMPA1(2)3000:0110
EB09JMPA2(1)A1的地址=0112
+-9(F7)0109H下一條指令的IP=0110+2=0112(2)A2的地址=0112
+9011BH例:
段內直接尋址轉向的有效地址=當前(IP)+位移量(8位/16位)JMPSHORTLMOVAX,0MOVBX,0MOVAX,0L:RETJMPNEARPTRL;近轉移(-32768∽+32767)JMPSHORTL;短轉移(-128∽+127)L:MOVAX,0MOVBX,0MOVAX,0JOLRET例:code1segment
┊
jmpfarptrnext
┊code1endscode2segment┊next:……
┊code2ends
段間直接尋址用指令中提供的轉向的段地址和偏移地址取代CS和IP例:第二節(jié)80X86的指令系統(tǒng)
數(shù)據(jù)傳送類指令地址傳送類指令算術運算類指令邏輯運算類指令串操作類指令控制轉移類指令處理器控制類指令
請重點關注:指令的匯編格式指令的基本功能指令支持的尋址方式指令的執(zhí)行對標志位的影響指令的特殊要求1.數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令數(shù)據(jù)交換指令堆棧操作指令標志寄存器操作指令
輸入/輸出指令換碼指令⑴數(shù)據(jù)傳送指令指令格式:MOVDST,SRCMOVCL,40HMOVCX,AXMOVDS,AXMOVBH,[200H]MOVBX,[200H]MOVEAX,10H[EBX+ESI]數(shù)據(jù)傳送指令不影響標志位
⑵數(shù)據(jù)交換指令指令格式:XCHGOPR1,OPR2XCHGAX,BXXCHGBX,[SI]XCHGESI,EDI數(shù)據(jù)交換指令不影響標志位
⑶堆棧操作指令指令格式:
PUSHSRC;POPDSTPUSHAXPUSHDWORDPTR[BX]PUSHDSPOPBXPOPES堆棧指令不影響標志位
PUSHAX;AX=1122H2211AHAL(1)(SP)-2→(SP)(2)AX→((SP))SP→11低地址高地址22例:(1)MOVAX,WORD1XCHGAX,WORD2MOVWORD2,AX例:交換存儲單元A與B中的內容.設:A與B已定義為字.(2)MOVAX,WORD1MOVBX,WORD2MOVWORD1,BXMOVWORD2,AX(3)PUSHWORD1PUSHWORD2POPWORD1POPWORD2⑷標志寄存器操作指令①LAHF;標志寄存器的低8位送入AH寄存器②SAHF;AH的內容送入標志寄存器的低8位③PUSHF;將16位標志寄存器內容壓入堆棧④POPF;將堆棧頂一個字彈出送入標志寄存器⑤PUSHFD;將32位標志寄存器壓入堆棧⑥POPFD;將32位標志寄存器出棧⑦標志位操作指令CLC;(Clearcarry)進位標志清零CMC;(Complementcarry)進位標志取反STC;(Setcarry)進位標志置1CLD;(Cleardirection)方向標志清零STD;(Setdirection)方向標志置1CLI;(Clearinterrupt)禁止可屏蔽中斷STI;(Setinterrupt)開放可屏蔽中斷⑸輸入/輸出指令①直接端口尋址:INAX,80H;從指定端口讀一個字數(shù)據(jù)到AX.OUT2FH,AL;把AL內容送往指定端口.②間接端口尋址MOVDX,2F0H;將16位端口地址送DX.INAL,DX;從指定端口讀一個字節(jié)數(shù)據(jù)到AL.⑹換碼指令指令格式:XLAT;執(zhí)行的操作:(AL)←((DS)×16+(BX)+(AL))這是一種固定尋址。表格TAB中存放著數(shù)字0∽9對應的ASCⅡ碼表.將表格中位移量為3的代碼取到AL中。30H31H32H33H34HTABMOVBX,OFFSETTABMOVAL,3XLATAL例:2.地址傳送類指令⑴偏移地址送寄存器指令指令格式:LEAREG,MEM;目的操作數(shù)不能是段寄存器,源操作數(shù)是存儲器操作數(shù).例如:①LEABX,[BX+SI+0F62H]與MOVBX,OFFSET[BX+SI+0F62H]指令等價②LEADX,[BX]③LEADX,TAB;傳送地址注:MOVDX,TAB;傳送該地址中的內容TAB=001200100011001300140015281102FFLEASI,TAB;執(zhí)行后:(SI)=0012HMOVSI,TAB;執(zhí)行后:(SI)=1128HLEA指令與MOV指令的區(qū)別:⑵邏輯地址送寄存器和段寄存器指令
①32位指針送16位寄存器和段寄存器DS指令格式:LDSREG16,MEM例如:LDSDI,[BX]LDSSI,[1010H]②32位指針送16位寄存器和段寄存器ES指令格式:LESREG16,MEM例如:
LESDI,[BX]LESSI,[1010H]LDS或LES指令將源操作數(shù)指定的4個連續(xù)字節(jié)單元內容分別送指令指定的寄存器和DS或ES中.其中:低16位送寄存器,高16位送DS或ES中。22H11H44H33H(DS)=C000H,(C2000H)=1122H,(C2002H)=3344HC000:2000HC000:2001HC000:2002HC000:2003H
1122
3344SIDS執(zhí)行指令:LDSSI,[2480]例:3.算術運算類指令
加法類指令
減法類指令
乘法指令
除法指令
十進制調整指令⑴加法類指令ADDDX,0F0FH;
ADCAX,[BX];
ADCAX,BX;
INCSI;
INCWORDPTR[SI]ADD和ADC指令會影響CF,ZF,SF,AF,OF和PF標志位INC指令會影響OF,SF,ZF,AF和PF標志,但不影響進位標志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指令會影響CF,ZF,SF,AF,OF和
PF標志位.DEC指令會影響OF,SF,ZF,AF和PF標志例:SUBBX,0136H;(BX)=4336H43360100001100110110
-0136
-0000000100110110
0100001100110110
+111111101100101001000010000000001(BX)=4200H,SF=0,ZF=0,CF=0,OF=0減法變成補碼加法例:利用NEG指令實現(xiàn)將負數(shù)變?yōu)檎龜?shù)。設:(AX)=-4,則NEGAX后,(AX)的值為4。AX<0,則AX中的值以補碼形式存放(-4的補碼):1111111111111100NEGAX;是對AX的補碼進行求補運算,則變成
00000000
00000100結果為4.⑶乘法指令①無符號數(shù)乘法:MULSRC②帶符號數(shù)乘法:IMULSRC;IMULREG,SRC;IMULREG,SRC,IMM字節(jié)乘:(AX)←(AL)*(SRC);字乘:(DX,AX)←(AX)*(SRC);32位乘:(EDX,EAX)←(EAX)*(SRC);乘法指令只對CF和OF標志位有影響,對SF,ZF,AF,PF標志位的狀態(tài)不確定
⑷除法指令①無符號數(shù)除法:DIVSRC②帶符號數(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ù)⑸位擴展指令①CBW;字節(jié)擴展為字②CWD;字擴展為雙字③CWDE;字擴展為雙字④CDQ;雙字擴展為4字⑤MOVSX;符號擴展⑥MOVZX;零位擴展⑹十進制調整指令指令格式說明DAA壓縮的BCD碼加法調整DAS壓縮的BCD碼減法調整AAA非壓縮的BCD碼加法調整AAS非壓縮的BCD碼減法調整AAM乘法后的BCD碼調整AAD除法前的BCD碼調整4.邏輯運算類指令⑴邏輯運算指令ORAX,00FFH;低8位置1,高8位不變ANDAX,00FFH;高8位清0,低8位不變XORAL,03H;使D0D1位變反其余位不變TESTAL,80H;測試AL最高位NOTAX;對(AX)按位取反例:屏蔽AL的第0、1兩位
ANDAL,0FCH例:置AL的第5位為1
ORAL,20H
例:使AL的第0、1位變反
XORAL,3例:測試某些位是0是1
TESTAL,1JNZO
AL=
********OR00100000**1*****
AL=
******01XOR00000011
******10
AL=********AND11111100******00AL=
********AND000000010000000*⑵移位指令SHLOPR,CNT;邏輯左移SALOPR,CNT;算術左移SHROPR,CNT;邏輯右移SAROPR,CNT;算術右移ROLOPR,CNT;不帶進位循環(huán)左移ROROPR,CNT;不帶進位循環(huán)右移RCLOPR,CNT;帶進位循環(huán)左移RCROPR,CNT;帶進位循環(huán)右移邏輯左移SHLOPR,CNT算術左移SALOPR,CNT邏輯右移SHROPR,CNT算術右移SAROPR,CNT
CF0
0CFCF循環(huán)左移ROLOPR,CNT循環(huán)右移ROROPR,CNT帶進位循環(huán)左移RCLOPR,CNT帶進位循環(huán)右移RCROPR,CNTCF
CFCFCF設(AL)=B9H,(CF)=1,確定下列指令單獨執(zhí)行后AX的狀態(tài):SARAL,1;(AL)=DCH,CF=1SHLAX,2;相當于AX內容乘以4SHLAX,5;相當于AX內容乘以32SARAX,3;相當于AX中帶符號數(shù)除以8SARAX,8;相當于AX中的帶符號數(shù)除以256例:將裝在(DX,AX)中的32位數(shù)據(jù)左移1位,也就是將32位無符號數(shù)乘以2。SHLAX,1RCLDX,1;將(DX,AX)*2→(DX,AX)大循環(huán)移位指令與移位指令聯(lián)合使用可以實現(xiàn)雙精度數(shù)或多倍精度數(shù)的左右移位。例:將BX中的帶符號數(shù)除以4,取整,并回送BX中.MOVCL,2;移位次數(shù)保存在CL寄存器中SAR BX,CL;完成(BX)/4→BX的運算,
取整,不保留余數(shù)。例:設(AX)=0011H,(BX)=0022H,將BX與AX中的數(shù)據(jù)合并,使(AX)=1122H.MOVCL,8SHLAX,CLORAX,BX例:
將一個字節(jié)數(shù)據(jù)的高4位和低4位交換.MOVAL,56H;AL=56HMOVCL,4ROLAL,CL;AL=65H,CF=1,OF=1例:統(tǒng)計BX中1的個數(shù)并存入CH寄存器中.用CL寄存器作循環(huán)計數(shù).MOVCX,0010H;(CH)=00H,(CL)=10HTESTBX,0FFFFH;測試BX是否為0JZEXT;(BX)=0則退出R1:ROLBX,1;循環(huán)左移一位,將BX最高位移入CFJCCOUNT;CF=1則轉移
JMPR2COUNT:INCCH;統(tǒng)計BX中1的個數(shù)R2:DECCL;CF=0則循環(huán)計數(shù)減1JNZR1;重復操作
┊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)重復前綴(Repeat)
重復前綴REP;
REPZ;或REPE;
REPNZ;或REPNE;重復前綴不能單獨使用,只能用在串操作指令前,以實現(xiàn)串操作的重復執(zhí)行,CX寄存器的內容是默認的重復次數(shù),每執(zhí)行一次重復操作,(CX)減1,(CX)是剩下還未處理的單元數(shù),(CX)=0則退出重復操作,表明已經處理完所有的單元.
串傳送指令MOVSB;MOVSW;MOVSD;MOVSDST,SRC;將源串數(shù)據(jù)傳送到目的串執(zhí)行:REPMOVSB或REPMOVSW
之前,應先做好:(1)源串首地址(末地址)
→SI(2)目的串首地址(末地址)
→DI(3)串長度→CX(4)建立方向標志
(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;傳送一個字節(jié)
DECCX;傳送次數(shù)減1JNZL;CX≠0,則繼續(xù);;否則,結束存串操作
┊例:
LEADI,DST;DI指向目的串首地址MOVAL,0;初始化ALMOVCX,100;用CX存放傳送次數(shù)CLD;DF=0,使地址增量REPSTOSB;將100個字節(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;待處理的串長度存CX中
CLD;使DF=0,地址增量G:LODSES:[SI];取一個數(shù)
TESTAL,01H;測D0位,D0=0為偶數(shù),D0=1為奇數(shù)
JNZO;為奇數(shù)則轉移E:STOSB;把偶數(shù)存入以EVEN為首地址的緩沖區(qū)
JMPAG;無條件轉移到AG去執(zhí)行程序O:XCHGBX,DI;使DI暫時指向存放奇數(shù)的緩沖區(qū)
STOSB;將奇數(shù)存放在ODD為首地址的緩沖區(qū)中
XCHGBX,DI;交換指針的內容AG:DECCX;CX總是保存著未處理數(shù)據(jù)的個數(shù)
JNZG;數(shù)據(jù)未處理完則繼續(xù)例:
串比較指令CMPSB;CMPSW;CMPSD;CMPSSRC,DST;源串與目的串相減,不回送結果SRCDD20DUP(1234ABCDH);定義雙字變量DSTDD20DUP(1234ABCDH);定義雙字變量
┊CLD;DF=0,向高地址方向比較MOVECX,20;建立REP的計數(shù)器LEAESI,SRC;使ESI指針指向源串LEAEDI,DST;使EDI指針指向目的串REPECMPSD;比較雙字數(shù)據(jù)串,直到
ECX=0或找到不相同的位置例:
串掃描指令SCASB;SCASW;SCASD;SCASDST;將AL或AX或EAX的內容與目的串相減,不回送結果STRDB‘XYZABCD’LEADI,STR;DI指向串STR首地址
MOVAL,‘A’;AL中存放要查找的字符
MOVCX,CN;存串長度
CLDREPNZSCASB;ZF=0且CX≠0重復查找
JZFOUND;ZF=1,找到字符A,轉移
JMPEXT;未找到(ZF=0并且CX=0),則退出FOUND:┆EXT:┉例:
串輸入INSDST,DX;INSB;INSW;INSD;將端口數(shù)據(jù)輸入到附加段的目的串中從端口地址03A0H的I/O設備輸入100個字節(jié)數(shù)據(jù),設I/O設備總是準備好傳送數(shù)據(jù).LEADI,LIST;用DI指向目的串MOVDX,03A0H;端口地址送DXCLD;DI自動加1MOVCX,100;CX裝計數(shù)值REPINSB;從端口輸入數(shù)據(jù)存入
DI指向的內存單元例:
串輸出OUTSDX,SRC;OUTSB;OUTSW;OUTSD;將數(shù)據(jù)段中的源串數(shù)據(jù)輸出到端口將存放在數(shù)據(jù)段中的100個字節(jié)數(shù)據(jù)ARY傳送到端口地址03A2H的I/O設備中.假設I/O設備總是準備好的狀態(tài).LEASI,ARY;用SI指向數(shù)組MOVDX,03A2H;端口地址送DXCLD;SI自動加1MOVCX,100;CX裝計數(shù)值REPOUTSB;將SI指向的內存單元數(shù)據(jù)輸出到端口例:6.控制轉移類指令無條件轉移指令(JMP)子程序調用與返回指令(CALL和RET)條件轉移指令(JCC)循環(huán)控制指令(LOOP)中斷與返回指令(INT和IRET)BIOS和DOS系統(tǒng)功能調用
⑴無條件轉移指令JMPDISP;段內直接轉移,位移量DISP可以是
8位、16位或32位JMPBX;段內間接轉移,BX內容是段內偏移地址JMPWORDPTR[SI];段內間接轉移,SI指向的內存單元中的一個字是段內偏移地址JMPEBX;段內間接轉移,EBX內容是偏移地址JMPDWORDPTR[ESI];段內間接轉移,ESI指向的內存單元的一個雙字是偏移地址JMPFWORDPTR[ADDR];段間間接轉移,ADDR中存放一個48位的指針,其中低32位送EIP寄存器,高16位送CS寄存器.JMPFWORDPTR[EBX];段間間接轉移,EBX指向的內存中的48位內容就是轉移地址,其中的低32位送EIP寄存器,高16位送CS寄存器.⑵子程序調用與返回指令CALLDISP16;段內直接調用,16位的位移量CALLDISP32;段內直接調用,32位的位移量CALLDISP48;段間直接調用,48位的邏輯地址CALLMEM16;段內間接調用,16位指針作為偏移地址送IPCALLMEM32;段內間接調用,32位指針是偏移地址送EIPCALLMEM48;段間間接調用,48位指針是邏輯地址CS:EIPCALLREG16;段內間接調用,16位指針作為偏移地址送IPCALLREG32;段內間接調用,32位指針是偏移地址送EIPRET;NEAR或FAR類型的子程序返回RETn;子程序返回,并修改堆棧指針:
SP←SP內容加n,或ESP←ESP內容加n。⑶條件轉移指令JZ/JE;ZF=1轉移JNZ/JNE;ZF=0轉移JS;SF=1轉移JNS;SF=0轉移JO;OF=1轉移JNO;OF=0轉移JCXZ;CX=0轉移條件轉移指令都不影響標志位。利用標志位作為測試條件,不同的條件轉移指令有不同的測試條件.AX中存放一個帶符號數(shù),若AX為正數(shù),使DX清零;若AX為負數(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;計數(shù)器減1.CX≠0循環(huán);CX=0退出循環(huán)⑸中斷與返回指令INTn;中斷類型碼n(00H∽FFH)INTO;溢出標志OF=1啟動的中斷IRET;從堆棧中恢復程序斷點,返回⑹BIOS和DOS系統(tǒng)功能調用它們都是內部中斷調用,其步驟為:(1)將入口參數(shù)送到指定的寄存器中;(2)將系統(tǒng)功能號送入AH寄存器中;(3)按中斷類型碼n調用BIOS或DOS中斷,即:執(zhí)行中斷指令“INTn”完成中斷調用。(4)檢查出口參數(shù),分析調用結果是否正確。⑺幾種常用的系統(tǒng)功能調用01H號調用,讀取鍵盤字符并回顯。功能:首先掃描鍵盤,等待按鍵。若有鍵按下,則檢查所按鍵碼。當按Ctrl+Break鍵時,則退出執(zhí)行。當按其它鍵時,則將對應鍵的ACSII碼送AL寄存器,同時回送在顯示器上。調用方式:MOVAH,01H;調用號裝AH寄存器INT21H;從鍵盤輸入一個字符02H號調用,顯示字符。功能:在顯示器當前光標的位置輸出顯示一個字符。當DL中存放退格符BS(08H),響鈴符BEL(07H),回車符CR(0DH),換行符LF(0AH),該功能調用能進行相應的處理。如果是Ctrl+Break,則退出執(zhí)行。調用方式:
MOVAH,02H;調用號裝AH寄存器
MOVDL,‘A’;輸出字符ACSII碼裝DL寄存器
INT21H;顯示字符A09H號調用,字符串輸出顯示。功能:在標準輸出設備(顯示器)上輸出顯示一字符串.字符串必須存放內存中并以$為結束標志,但$不顯示.要求DS:DX作為該字符串的首地址.顯示字符后作Ctrl+Break檢查和處理.調用方式:
MOVBX,SEGSTRINGMOVDS,BX;DS←輸出字符串的段地址
LEADX,STRING;DX←輸出字符串偏移地址
MOV AH,09H;9號功能調用
INT21H;將內存中的字符串輸出顯示檢查程序執(zhí)行過程中是否有鍵盤輸入,按任意鍵退出。
L:┊
MOVAH,0BH;功能號送AH中
INT21H;讀鍵盤狀態(tài),AL=FFH有鍵入,AL=0無鍵入
INCALJNZL;無鍵盤輸入,繼續(xù)
RET;有鍵入,返回例:7.處理器控制類指令
⑴狀態(tài)標志位處理指令CLC(Clearcarry);進位標志CF=0STC(Setcarry);進位標志CF=1CMC(Complementcarry);進位標志求反CLD(Cleardirection);方向標志DF=0STD(Setdirection);方向標志DF=1CLI(Clearinterrupt);中斷標志IF=0(關中斷)STI(Setinterrupt);中斷標志IF=1(開中斷)⑵其它處理器控制指令NOP(Nooperation);空操作指令,常用來作延時,或取代其他指令作調試之用.HLT(Halt);停機指令,CPU暫停執(zhí)行程序,等待硬件中斷。ESC(Escape);換碼指令,80486以后已成為未定義指令.WAIT(Wait);等待指令,使處理器處于空轉狀態(tài),也可以用來等待外部中斷發(fā)生,但中斷處理完后仍返回WAIT指令繼續(xù)等待.LOCK(Lock);封鎖指令,作為指令的前綴可位于任何指令的前端,而不是一條獨立的指令,凡帶有LOCK前綴的指令,在該指令執(zhí)行過程中都禁止其他協(xié)處理器占用總線,故它可稱為總線鎖定前綴.第三節(jié)匯編語言程序格式⑴匯編語言特性
程序注釋:用一個分號開始保留字:具有特定意義的字標識符:變量名和標號語句:語句類型和語句格式運算符:算術運算符、邏輯運算符、關系運算符、數(shù)值返回運算符等。
⑵偽指令
①
變量定義偽指令DB:定義字節(jié)變量,每一個表達式占一個字節(jié).DW:定義字變量,每一個表達式占兩個字節(jié),低字節(jié)在低地址,高字節(jié)在高地址。DD:定義雙字變量,每一個表達式占四個字節(jié),低字在低地址,高字在高地址。DQ:定義四字變量,每一個表達式占八個字節(jié),低字在低地址,高字在高地址。DT:定義十個字節(jié),每一個表達式占十個字節(jié),低字在低地址,高字在高地址。②
相等偽指令為常量定義一個符號,有兩種:等號偽指令COU=1234H;允許重復定義,多次使用EQU偽指令CNTEQU123;不能重新賦值,可多次使用③
完整的段定義偽指令SEGMENT/ENDS偽指令必須成對使用,共同定義一個邏輯段。如:段名SEGMENT
┊;匯編語言指令序列段名ENDSASSUME偽指令指定程序中段與段寄存器之間的關系。如:ASSUMECS:CODE,DS:DATA,...ORG偽指令如:ORG100HDATASEGMENT;定義數(shù)據(jù)段BUFDB11H,22H;定義字節(jié)數(shù)據(jù)緩沖區(qū)DATAENDS;數(shù)據(jù)段結束STACKSEGMENT;定義堆棧段STDB50DUP(?);設置堆棧的大小是50字節(jié)STACKENDS;堆棧段結束CODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFAR;把主程序定義為子程序START:┊;匯編指令序列MOVAH,4CHINT21H;返回DOSMAINENDP;子程序結束CODEENDS;代碼段結束
ENDSTART;程序結束④
簡化的段定義偽指令.MODELSMALL;定義程序的存儲模式.STACK;建立一個堆棧段.DATA;建立一個數(shù)據(jù)段
┊;在數(shù)據(jù)段中定義變量.CODE;建立一個代碼段.STARTUP;設置程序的起始點
┊;可執(zhí)行指令構成的程序段.EXIT0;程序結束,返回操作系統(tǒng)
END;匯編結束⑤
子程序定義偽指令子程序名PROC[類型];子程序開始
┊;匯編語言指令序列
RET;子程序返回到調用處子程序名ENDP;子程序結束子程序名是子程序入口的符號地址;類型屬性有NEAR和FAR;子程序是完成一個特定功能的指令序列,用CALL指令調用子程序,RET指令返回到調用處。⑥
處理器選擇偽指令.8086選擇8086指令系統(tǒng)(缺省情況).286選擇80286指令系統(tǒng).286P選擇保護模式下的80286指令系統(tǒng).386選擇80386指令系統(tǒng).386P選擇保護模式下的80386指令系統(tǒng).486選擇80486指令系統(tǒng).486P選擇保護模式下的80486指令系統(tǒng).586選擇Pentium指令系統(tǒng).586P選擇保護模式下Pentium指令系統(tǒng)⑶匯編語言源程序舉例
實現(xiàn)從鍵盤接收十進制數(shù)并存入BX中..MODELTINY;建立微型存儲模式.CODE;建立一個代碼段.STARTUP;設置程序的起始點
MOVBX,0C:MOVAH,1;DOS調用:鍵盤輸入
INT21HSUBAL,30HJLEX;小于0退出CMPAL,9JGEX;大于9退出
CBWXCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPCEX:
.EXIT;程序結束,返回操作系統(tǒng)
END;匯編結束⑷常用的DEBUG命令
DEBUG是常用的匯編語言級調試工具,為匯編語言程序員提供了分析指令、跟蹤程序的有效手段。-A匯編 -U反匯編-T單步執(zhí)行-G斷點執(zhí)行-D數(shù)據(jù)顯示-R寄存器-E修改內存-Q退出DEBUG
-I端口輸入
-O端口輸出
第四節(jié)匯編語言程序設計方法
1.表格與數(shù)組的處理方法
ARYDW10H,20H,30H;建立一字數(shù)組LEASI,ARY;用SI作為指針指向數(shù)組首地址MOVAX,[SI];將SI所指的內存單元送
AX,(AX)=0010HADDSI,2;修改指針,指向數(shù)組下一個元素
┊利用相對基址變址尋址方式處理二維數(shù)組
ROW=2;設置行號COL=3;設置列號MOVEBX,C*ROW;EBX設置為行偏移MOVESI,COL;ESI設置為列偏移MOVAL,ARY[EBX+ESI];用相對的基址加變址的尋址方式來訪問數(shù)組例:將一張語文成績表按學號從小到大的順序排列在內存中,用查表法查找班里某同學的成績,并在屏幕上顯示。
.MODELSMALL;定義程序的存儲模式
.STACK;建立一個堆棧段
.DATA;建立一個數(shù)據(jù)段
TABDB80,85,86,71;按學號順序排列
DB79,96,83,56DB32,66,78,84NO DB10;任意設定一個學號
CHIDB?
.CODE;建立一個代碼段
.STARTUP;設置程序的起始點例:LEABX,TAB;BX指向表的首地址MOVAL,NODECAL;距表首地址的位移量XLAT;換碼:AL←DS:[BX+AL]MOVCHI,AL;將找到的一個成績存入內存CALLDECSHOW;調用一個子程序.EXIT0END設主程序中已經定義了一個正數(shù)數(shù)組ARY,其最后一個元素的地址是BRY,并已按升序排列,編寫程序,將一正數(shù)M插入到該數(shù)組中,使數(shù)組仍按升序排列。
.MODELSMALL.386P.DATAMESSAGEDB"WelcometouseASM!$"XDW?ARYDW100,200,240,330BRYDW160NDW?MDW270.CODE.STARTUPMOVAX,M例:MOVX,0FFFFHMOVSI,0L:CMPbry[SI],AX;從數(shù)組末開始比較
JLEIMOVBX,bry[SI];SI指向的元素向下移一個字
MOVbry[SI+2],BXDECSIDECSI;指針向上移一個字
JMPLI:MOVbry[SI+2],AX;插入新元素
LEADX,MESSAGEMOVAH,09HINT21HMOVAH,4CHINT21H.EXITEND將數(shù)組ARY中的數(shù)據(jù)按從小到大的順序排列。
.MODELSMALL;定義程序的存儲模式
.STACK;建立一個堆棧段
.DATA;建立一個數(shù)據(jù)段
ARYDD11H,22H,33H,44HDD10H,20H,30H,40H;定義數(shù)組
CEQU($-ARY)/TYPEARY;ARY所占數(shù)據(jù)個數(shù)
.CODE;建立一個代碼段
.STARTUP;設置程序的起始點
MOVECX,CDECECX;設置循環(huán)計數(shù)器例:OL:PUSHECX;保存外循環(huán)計數(shù)
LEAESI,ARY;ESI指向ARY的第一個數(shù)據(jù)IL:MOVEAX,[ESI];取ARY的一個數(shù)據(jù)
CMP[ESI+4],EAX;比較相鄰兩個數(shù)據(jù)
JGENX;前一個數(shù)據(jù)小于下一個數(shù)據(jù)不交換
XCHGEAX,[ESI+4];交換,使小的數(shù)據(jù)在前
MOV[ESI],EAXNX:ADDESI,4;ESI指向下一個數(shù)據(jù)
LOOPIL;內循環(huán),每一對相鄰數(shù)據(jù)進行比較
POPECX;恢復外循環(huán)計數(shù)
LOOPOL;外循環(huán),進行下一遍掃描
.EXIT0;程序結束,返回操作系統(tǒng)
END;匯編結束
2.子程序設計
對一個32位整數(shù)數(shù)組求和。.MODELSMALL.386P.DATAMESSAGEDB"WelcometouseASM!$"ARYDD110000H,220000H,330000H,440000H,550000H,660000HSUMDD?.CODE.STARTUP
例:MAINPROCFARLEAESI,ARY;數(shù)組的偏移地址存入ESIMOVECX,LENGTHOFARY;數(shù)組的長度
CALLARYSUM;調用一個求和子程序
MOVSUM,EAX;子程序運行結果存SUMLEADX,MESSAGEMOVAH,09hINT21HMOVAH,07HINT21HMOVAH,4CHINT21hRET;返回
MAINENDP;主程序結束;定義一個求和子程序
ARYSUMPROC;子程序定義
PUSHESI;將寄存器內容保存在堆棧中
PUSHECXMOVEAX,0L:ADDEAX,[ESI]ADDESI,4LOOPLPOPECXPOPESI;把寄存器內容恢復原狀
RET;返回主程序ARYSUMENDP;子程序結束
END3.結構與宏
⑴結構
結構是將不同類型但又相互關聯(lián)的數(shù)據(jù)組織到一個數(shù)據(jù)結構中。結構的使用應包含以下的三個步驟:結構的定義結構名STRUCT┊;域的聲明結構名ENDS結構內部是域的聲明,用定義變量的格式來定義域。例如:
PERSONSTRUCTIDDB‘01234’NAMEDB‘ABCDE’YEARSDB0SALARYDD0PERSONENDS結構變量的定義(也稱為結構預置)
結構變量名結構名<結構中域的初值表>結構名是結構定義時用的名字結構變量名是程序中具體使用的變量,程序中可以直接引用它結構中域的初值表是給結構變量賦初值,其排列順序及類型與結構定義時一致,采用尖括號,各域之間用逗號分隔結構中域的內容采用結構定義時的初值,我們可以這樣定義結構變量:
PPERSON<>也可以用特定的值對結構變量進行初始化:P1PERSON<‘10112’,‘LINDA’,28,50000>P2PERSON<‘10113’,‘HARRY’,26,45000>P3PERSON<‘10330’,‘SUSAN’,18,30000>
結構變量的引用程序中可以直接寫結構變量名來引用結構變量,如:MOVBX,OFFSETP1;用指針BX指向結構變量P1的首地址。也可以引用結構變量中的某一個域,其格式為:結構變量名?結構字段(域)名MOVAL,P1?NAME;將結構變量P1中
NAME域的值送AL中MOVP2?YEARS,30;將P2中YEARS域的值更新為30MOVCX,TYPEPERSON;TYPE操作符返回結構的字節(jié)數(shù)MOVDX,TYPEPERSON?SALARY;TYPE操作符返回結構的SALARY域占用的字節(jié)數(shù)。將三個員工的工號、姓名、年齡、年薪等信息,以結構的形式存入內存中,顯示年齡小于28歲的員工的姓名。.DATAPERSONSTRUCT;定義一個結構IDDB‘01234’;結構內部定義域NAMEDB‘ABCDE’;該結構中含有4個域YEARSDB0SALARYDD0PERSONENDS;定義三個結構變量,;并對結構中的域初始化P1PERSON<‘10112’,‘LINDA’,28,50000>P2PERSON<‘10113’,‘HARRY’,26,45000>P3PERSON<‘10330’,‘SUSAN’,18,30000>.CODEMOVDH,3;統(tǒng)計3個結構變量LEABX,P1;BX指向結構P1的第一個字節(jié)例:B:MOVAL,[BX]?PERSON?YEARS;取結構的YEARS域的值CMPAL,28;小于28歲?JGENS;≥28,不顯示MOVCX,5;PERSON結構的NAME域包含5個字符SHOW:MOVDL,[BX]?PERSON?NAME;顯示姓名MOVAH,2;DOS2號功能調用INT21HINCBX;BX指向NAME域中下一個字符LOOPSHOW;顯示NAME域的每一個字符SUBBX,5NS:ADDBX,15;使BX指向下一個結構的首地址DECDHJNZB;對下一個結構進行操作.EXIT0END⑵
宏
①宏的定義宏指令名MACRO[形式參數(shù)表]┊;;宏定義體宏指令名ENDM宏定義體是一段具有獨立功能的匯編語言代碼將內存到內存的數(shù)據(jù)傳送用宏來實現(xiàn)。例如:COPYMACRODEST,SRCPUSHAXMOVAX,SRCMOVDEST,AXPOPAXCOPYENDM
②宏調用
宏定義后的宏指令在源程序中調用,宏調用的格式為:宏指令名[實參數(shù)表]實參數(shù)的順序必須與宏定義中的參數(shù)順序相同對已經定義的宏指令,只要直接寫出宏指令名,就能調用:COPYVAL1,VAL2就能實現(xiàn)在變量之間的數(shù)據(jù)傳送。③宏展開
例如,上例的宏調用后,編譯器將自動把宏展開成下面的代碼:1PUSHAX1MOVAX,VAL11MOVVAL2,AX1POPAX左邊的1表示宏的展開層次,如果在宏內又調用了其它宏,該層次的值就會增加。④取消宏指令
格式:PURGE宏指令名列表其中,宏指令名列表是一些已經定義的宏指令,它們之間用逗號分隔。PURGE偽指令將取消這些已經定義的宏指令。4.模塊化程序設計主程序與子程序間的參數(shù)傳遞入口參數(shù)(輸入?yún)?shù))——主程序調用子程序時,提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù))——子程序執(zhí)行結束返回給主程序的參數(shù)參數(shù)的具體形式傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法通過寄存器傳遞通過共享變量傳遞通過堆棧傳遞⑴用寄存器傳遞參數(shù)最簡單和常用的參數(shù)傳遞方法是通過寄存器,只需要把參數(shù)存于約定的寄存器中由于通用寄存器個數(shù)有限,這種方法對少量數(shù)據(jù)可以直接傳遞數(shù)值,而對大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護和恢復,帶有入口參數(shù)的寄存器可以保護、也可以不保護,但最好能夠保持一致⑵用共享變量傳
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網絡安全工作報告總結
- 印刷廠消防安全應急預案
- 煤礦井下高低壓保護系統(tǒng)設計與實施
- 工作亮點與不足分析
- 醫(yī)院后勤食堂管理方案
- 行業(yè)發(fā)展階段劃分與重點領域預測
- 航空貨運AR增強現(xiàn)實導航-洞察闡釋
- 新能源技術應用典型案例
- 智能電網驅動下的電動出行變革:換電模式行業(yè)的新發(fā)展
- 歷史文化保護與傳承-洞察闡釋
- 2021MAM-6070M空壓機微電腦控制器
- 2023-2024學年山東省臨沂市蘭山區(qū)八年級(下)期末數(shù)學試卷(含答案)
- 人教版語文四年級下冊期末測試卷含答案(4套)
- 中國象棋初級習題500例
- 毛澤東思想和中國特色社會主義理論體系概論復習提綱
- DL-T5218-2012220kV-750kV變電站設計技術規(guī)程
- W -S-T 431-2023 護理分級標準(正式版)
- 水力分析與計算智慧樹知到期末考試答案章節(jié)答案2024年安徽水利水電職業(yè)技術學院
- MOOC 中國文化概論-華南師范大學 中國大學慕課答案
- 產品研發(fā)合作協(xié)議書(二篇)
- 24春國家開放大學《離散數(shù)學》大作業(yè)參考答案
評論
0/150
提交評論