版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章教學(xué)重點(diǎn)8088/8086的尋址方式8088/8086的基本指令傳送指令算術(shù)運(yùn)算指令邏輯運(yùn)算和移位指令串操作指令控制轉(zhuǎn)移指令指令的基本組成操作碼說明計(jì)算機(jī)要執(zhí)行哪種操作,如傳送、運(yùn)算、移位、跳轉(zhuǎn)等操作,它是指令中不可缺少的組成部分操作數(shù)
指明參與操作的數(shù)是誰或存放在何處尋找操作數(shù)的方法叫尋址方式在轉(zhuǎn)移調(diào)用指令中尋找新的轉(zhuǎn)移地址也是尋址方式。操作碼操作數(shù)指令由操作碼和操作數(shù)兩部分組成
§1操作數(shù)的尋址方式指令系統(tǒng)設(shè)計(jì)了多種操作數(shù)的來源尋找操作數(shù)的過程就是操作數(shù)的尋址理解操作數(shù)的尋址方式是理解指令功能的前提操作數(shù)采取哪一種尋址方式一方面,會(huì)影響處理器執(zhí)行指令的速度和效率另一方面,對(duì)程序設(shè)計(jì)也很重要一、立即數(shù)尋址方式指令中直接給出一個(gè)常數(shù)作為操作數(shù),其緊跟在操作碼之后存放在代碼段中。立即數(shù)直接從指令隊(duì)列中取得,不用總線周期,執(zhí)行數(shù)度快。這種操作數(shù)被稱為立即數(shù)可以是8位數(shù)值(00H~FFH)也可以是16位數(shù)值(0000H~FFFFH)立即數(shù)尋址方式常用來給寄存器和存儲(chǔ)單元賦值,多以常量形式出現(xiàn)注意:立即數(shù)只能是整數(shù)而且是常數(shù)。演示MOVAX,0102H ;AX←0102H二、寄存器尋址方式指令中指明某個(gè)寄存器其內(nèi)容即為操作數(shù),寄存器在CPU內(nèi),不用總線周期,執(zhí)行速度快。8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4個(gè)段寄存器seg:CS、DS、SS、ES演示MOVAX,BX ;AX←BX三、直接尋址方式指令中直接給出操作數(shù)所在內(nèi)存單元的有效地址(EA即偏移地址)默認(rèn)的段地址在DS段寄存器,若在其它段可使用段超越前綴改變。用方括號(hào)包含有效地址,表達(dá)存儲(chǔ)單元的內(nèi)容直接地址也可用標(biāo)號(hào)代表,方括號(hào)可省略。演示MOVAX,[2000H] ;AX←DS:[2000H]MOVAX,ES:[2000H] ;AX←ES:[2000H]四、寄存器間接尋址方式指令中給出的寄存器的內(nèi)容包含操作數(shù)的有效地址。間接尋址中使用的寄存器名要用方括號(hào)括起來1、基址尋址用BX或BP作間接尋址寄存器如:MOVAX,[BX];隱含在DS段MOVAX,[BP];隱含在SS段演示MOVAX,[BX] ;AX←DS:[BX]2、變址尋址用SI或DI作間接尋址寄存器如:MOVCL,[SI]MOVAX,[DI]單獨(dú)使用SI或DI時(shí),隱含在DS段中在串操作時(shí),SI隱含在DS段中,DI隱含在ES段中。3、相對(duì)基址尋址指令中給出基址寄存器及位移量,二者之和為操作數(shù)的有效地址。位移量可以是8位或16位。有效地址=BX/BP+8/16位位移量4、相對(duì)變址尋址指令中給出變址寄存器及位移量,二者之和為操作數(shù)的有效地址。有效地址=SI/DI+8/16位位移量段地址對(duì)應(yīng)BX/SI/DI寄存器默認(rèn)是DS,對(duì)應(yīng)BP寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]5、基址變址尋址方式有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存器(SI或DI)的內(nèi)容構(gòu)成:有效地址=BX/BP+SI/DI段地址對(duì)應(yīng)BX基址寄存器默認(rèn)是DS,對(duì)應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]6、相對(duì)基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個(gè)8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址對(duì)應(yīng)BX基址寄存器默認(rèn)是DS,對(duì)應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOV指令的功能立即數(shù)尋址方式寄存器尋址方式直接尋址方式間接尋址方式相對(duì)尋址方式基址變址尋址方式相對(duì)基址變址尋址方式各種尋址方式綜合舉例設(shè)BX=1200HDI=10A0H位移量=2BC0HDS=2400H求各種尋址方式下的有效地址和物理地址。①直接尋址指令形式:MOVAX,[2BC0H]EA=2BC0H物理地址=24000H+2BC0H=26BC0H②基址尋址指令形式:MOVAX,[BX]EA=1200H物理地址=24000H+1200H=25200H③變址尋址指令形式:MOVAX,[DI]EA=10A0H物理地址=24000H+10A0H=250A0H④相對(duì)基址尋址MOVAX,[BX+2BC0H]EA=1200H+2BC0H=3DC0H物理地址=24000H+3DC0H=27DC0H⑤相對(duì)變址尋址MOVAX,[DI+2BC0H]EA=10A0H+2BC0H=3C60H物理地址=24000H+3C60H=27C60H⑥相對(duì)基址變址尋址MOVAX,[BX+DI+2BC0H]EA=1200H+10A0H+2BC0H=4E60H物理地址=24000H+4E60H=28E60H§28086的指令格式操作碼操作碼11REGR/M操作碼MODREGR/M操作碼(R)單字節(jié)指令(隱含操作數(shù))單字節(jié)指令(寄存器模式)雙字節(jié)指令
(寄存器到寄存器模式)不帶位移量的寄存器和內(nèi)存之間的傳送REG--寄存器MOD--模式R/M--寄存器或內(nèi)存一、指令格式操作碼MODREGR/M位移低位位移高位操作碼11操作碼R/M數(shù)據(jù)低位數(shù)據(jù)高位操作碼MOD操作碼R/M位移低位位移高位數(shù)據(jù)低位數(shù)據(jù)高位REG--寄存器MOD--模式R/M--寄存器或內(nèi)存帶位移量的寄存器和內(nèi)存之間的傳送(設(shè)位移量為16位)立即數(shù)送寄存器(設(shè)立即數(shù)為16位)立即數(shù)送內(nèi)存(設(shè)位移量為16位)四字節(jié)指令六字節(jié)指令在操作碼中一般有3位W、D、SW=0表示字節(jié)操作W=1表示字操作D=0REG是源操作數(shù)D=1是目的操作數(shù)S是擴(kuò)展位(用于加、減和比較和W組合使用)S=0W=08位操作數(shù)S=0W=116位操作數(shù)S=1W=1由8位擴(kuò)展為16位操作數(shù)單字節(jié)指令中可隱含指出寄存器名,此類指令少,但執(zhí)行速度較快。8086規(guī)定:雙操作數(shù)指令中(除立即數(shù)和串操作指令),其中一個(gè)操作數(shù)必須在寄存器中,可縮短指令長(zhǎng)度,另一個(gè)操作數(shù)可以在寄存器中也可以在內(nèi)存單元中。8086指令中第二個(gè)字節(jié),給出兩個(gè)操作數(shù)在什么地方,以及計(jì)算存儲(chǔ)器地址的方法。MODREGR/M尋址方式寄存器名計(jì)算存儲(chǔ)器地址方法MOD數(shù)據(jù)00存儲(chǔ)器尋址不帶位移量01存儲(chǔ)器尋址8位位移量10存儲(chǔ)器尋址16位位移量11寄存器尋址MOD=11,表明第二個(gè)操作數(shù)也在寄存器中,則R/M指明其名稱,與REG編碼相同。REGW=1W=0000AXAL001BXCL010CXDL011DXBL100SPAH101BPCH110SIDH111DIBH000110000[BX+SI][BX+SI+d8][BX+SI+d16]001[BX+DI][BX+DI+d8][BX+DI+d16]010[BP+SI][BP+SI+d8][BP+SI+d16]011[BP+DI][BP+DI+d8][BP+DI+d16]100[SI][SI+d8][SI+d16]101[DI][DI+d8][DI+d16]110直接尋址[BP+d8][BP+d16]111[BX][BX+d8][BX+d16]R/MMOD二、段寄存器的隱含訪問一般指令中不出現(xiàn)段寄存器名稱,而用隱含關(guān)系指明。如與隱含關(guān)系不同,運(yùn)用前綴改變。①[BX]隱含于DS段②
[BP]隱含于SS段③[SI]、[DI]單獨(dú)使用隱含于DS段④基址寄存器和變址寄存器同時(shí)出現(xiàn),以基址寄存器隱含關(guān)系為準(zhǔn)。[SP]
隱含于SS段[SI]、[DI]用于串操作時(shí),[SI]隱含于DS段,
[DI]隱含于ES段。使用前綴的形式
ADDAX,ES:[SI]或ES:ADDAX,[SI]三、指令執(zhí)行時(shí)間一般用所需的時(shí)鐘周期數(shù)表明指令執(zhí)行時(shí)間=基本執(zhí)行時(shí)間+計(jì)算有效地址時(shí)間
+為取操作數(shù)和存放結(jié)果而訪問內(nèi)存的時(shí)間§38086指令系統(tǒng)8086指令系統(tǒng)很豐富,包含133條基本指令,功能強(qiáng)。一般分為五類來介紹傳送指令算術(shù)運(yùn)算指令邏輯運(yùn)算和移位指令串操作指令控制轉(zhuǎn)移指令一、數(shù)據(jù)傳送類指令數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位重點(diǎn)掌握MOVXCHGPUSHPOPXLATLEA1、通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGPUSHPOPMOVXCHGPUSH①基本傳送指令MOV(move)把一個(gè)字節(jié)或字的操作數(shù)從源地址傳送至目的地址MOVreg/mem,imm;立即數(shù)送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存演示MOV指令舉例--立即數(shù)傳送movcl,4 ;cl←4,字節(jié)傳送movdx,0ffh
;dx←00ffh,字傳送movsi,200h
;si←0200h,字傳送movbvar,0ah
;字節(jié)傳送;假設(shè)bvar是一個(gè)字節(jié)變量,定義如下:bvardb0movwvar,0bh
;字傳送;假設(shè)wvar是一個(gè)字變量,定義如下:wvardw0明確指令是字節(jié)操作還是字操作以字母開頭的常數(shù)要有前導(dǎo)0MOV指令舉例--寄存器傳送movah,al ;ah←al,字節(jié)傳送movbvar,ch ;bvar←ch,字節(jié)傳送movax,bx ;ax←bx,字傳送movds,ax ;ds←ax,字傳送mov[bx],al ;[bx]←al,字節(jié)傳送寄存器具有明確的字節(jié)和字類型MOV指令舉例--存儲(chǔ)器傳送moval,[bx] ;al←ds:[bx]movdx,[bp] ;dx←ss:[bp+0]movdx,[bp+4] ;dx←ss:[bp+4]moves,[si] ;es←ds:[si]不存在存儲(chǔ)器向存儲(chǔ)器的傳送指令MOV指令舉例--段寄存器傳送mov[si],dsmovax,ds ;ax←dsmoves,ax ;es←ax←ds對(duì)段寄存器的操作不靈活MOV指令傳送功能圖解MOV指令也并非任意傳送!立即數(shù)段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲(chǔ)器非法指令的主要現(xiàn)象:兩個(gè)操作數(shù)的類型不一致無法確定是字節(jié)量還是字量操作兩個(gè)操作數(shù)都是存儲(chǔ)器段寄存器的操作有一些限制非法指令--兩個(gè)操作數(shù)類型不一致在絕大多數(shù)雙操作數(shù)指令中,目的操作數(shù)和源操作數(shù)必須具有一致的數(shù)據(jù)類型,或者同為字量,或者同為字節(jié)量,否則為非法指令
MOVAL,050AH ;非法指令,修正: ;movax,050ah MOVSI,DL ;非法指令,修正: ;movdh,0
;mov
si,dx非法指令--無法確定是字節(jié)量還是字量操作當(dāng)無法通過任一個(gè)操作數(shù)確定是操作類型時(shí),需要利用匯編語言的操作符顯式指明
MOV[BX+SI],255 ;非法指令,修正: ;mov
byteptr[bx+si],255
;byteptr
說明是字節(jié)操作 ;mov
wordptr[bx+si],255
;wordptr
說明是字操作非法指令--兩個(gè)操作數(shù)都是存儲(chǔ)器8088指令系統(tǒng)除串操作指令外,不允許兩個(gè)操作數(shù)都是存儲(chǔ)單元(存儲(chǔ)器操作數(shù))
MOVbuf2,buf1如MOV[BX],[SI]
此類非法指令修正:
;假設(shè)buf2和buf1是兩個(gè)字變量
;movax,buf1
;movbuf2,ax
;假設(shè)buf2和buf1是兩個(gè)字節(jié)變量
;moval,buf1
;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系統(tǒng)中,能直接對(duì)段寄存器操作的指令只有MOV等個(gè)別傳送指令,并且不靈活
MOVDS,ES ;非法指令,修正: ;mov
ax,es
;mov
ds,ax MOVDS,100H ;非法指令,修正: ;movax,100h
;mov
ds,ax
MOVCS,[SI] ;非法指令 ;指令存在,但不能執(zhí)行②交換指令XCHG(exchange)把兩個(gè)地方的數(shù)據(jù)進(jìn)行互換寄存器與寄存器之間對(duì)換數(shù)據(jù)寄存器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)不能在存儲(chǔ)器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)XCHGreg,reg/mem;regreg/mem演示數(shù)據(jù)交換指令舉例movax,1199h ;ax=1199hxchgah,al ;ax=9911h;等同于xchgal,ahmovwvar,5566h ;wvar是一個(gè)字量變量xchgax,wvar ;ax=5566h,wvar=9911h;等同于xchgwvar,ax
注意:不能在兩個(gè)內(nèi)存單元之間交換 如:XCHG[BX],[SI]錯(cuò)誤!
段寄存器中CS、IP不能做操作數(shù)③堆棧操作指令堆棧是一個(gè)“后進(jìn)先出LIFO”(或說“先進(jìn)后出FILO”)的主存區(qū)域,位于堆棧段中;SS段寄存器記錄其段地址堆棧只有一個(gè)出口,即當(dāng)前棧頂;用堆棧指針寄存器SP指定堆棧只有兩種基本操作:進(jìn)棧和出棧,對(duì)應(yīng)兩條指令PUSH和POP堆棧由棧底向低地址方向生成圖示進(jìn)棧指令PUSH進(jìn)棧指令先使堆棧指針SP減2,然后把一個(gè)字操作數(shù)存入堆棧頂部PUSHr16/m16/seg ;SP←SP-2 ;SS:[SP]←r16/m16/seg演示pushaxpush[2000h]出棧指令POP出棧指令把棧頂?shù)囊粋€(gè)字傳送至指定的目的操作數(shù),然后堆棧指針SP加2POPr16/m16/seg ;r16/m16/seg←SS:[SP] ;SP←SP+2popaxpopwvar演示堆棧操作的特點(diǎn)堆棧操作的單位是字,進(jìn)棧和出棧只對(duì)字進(jìn)行數(shù)據(jù)從棧頂壓入和彈出時(shí),都是低地址送低字節(jié),高地址送高字節(jié)堆棧操作遵循先進(jìn)后出原則,但可用存儲(chǔ)器尋址方式隨機(jī)存取堆棧中的數(shù)據(jù)堆棧段是程序中不可或缺的一個(gè)內(nèi)存區(qū),常用來臨時(shí)存放數(shù)據(jù)傳遞參數(shù)保存和恢復(fù)寄存器應(yīng)用舉例:設(shè)SS=1000HSP=2000HAX=A26FH執(zhí)行PUSHAX指令的過程和結(jié)果SP-2=1FFEH則AX內(nèi)容壓入內(nèi)存11FFEH和11FFFH執(zhí)行后SP=1FFEH(11FFEH)=6FH(11FFFH)=A2HSP12000HSP11FFEH11FFFH6FHA2H棧底練習(xí)1:已知SS=1200H執(zhí)行MOVAX,3765HMOVBX,4288HMOVSP,1020HPUSHAXPUSHBXPOPCX執(zhí)行后AX=()BX=()CX=()SP=()
3765H,4288H,4288H,101EH2、累加器專用傳送指令①輸入輸出指令(IN/OUT指令)格式:INAL,port;port為直接端口地址INAL,DX;DX的內(nèi)容為端口地址(間接方式)INAX,port;INAX,DXOUTport,ALOUTDX,ALOUTport,AXOUTDX,AX注意:①只能用累加寄存器不能用其它寄存器②當(dāng)端口地址在00H—FFH之間可以用直接地址當(dāng)端口地址大于FFH時(shí)必須用DX間址形式例:INAL,40H;(40H)ALINAX,80H;(80H)、(81H)AX
MOVDX,0382HINAL,DX;(0382H)AL
OUT62H,ALMOVDX,0380HOUTDX,AX②換碼指令XLAT(查表指令)將BX指定的緩沖區(qū)中、AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個(gè)字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼表格首地址存放于BX,AL存放相對(duì)表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼XLAT
;al←ds:[bx+al]演示將存儲(chǔ)器操作數(shù)的有效地址送至指定的16位通用寄存器③址傳送指令三條LEA、LDS、LESLEAr16,mem;r16←mem的有效地址EA例1:
有效地址的獲取 LEAAX,[2375H];AX=2375HLEASP,[BX+SI];SP=(BX)+(SI)區(qū)別:LEASI,BUFF;SI=BUFFMOVSI,BUFF;SI=(BUFF)例2MOVBX,400H MOVSI,3CH LEABX,[BX+SI+0F62H] ;BX←400H+3CH+0F62H=139EHLDSr16,mem;ds、r16←mem中的雙字例:LDSBX,[2300H]MDS段2300H2301H2302H2303H34H12H78H56H執(zhí)行后:BX=1234HDS=5678HLESr16,mem;es、r16←mem中的雙字例:LESDI,[SI]MDS段SISI+1SI+2SI+311H22H33H44H執(zhí)行后:DI=2211HES=4433H4、標(biāo)志傳送指令①讀標(biāo)志指令LAHF;標(biāo)志寄存器低字傳送到AH②設(shè)標(biāo)志指令SAHF;AH的內(nèi)容送標(biāo)志寄存器低8位③標(biāo)志寄存器堆棧指令PUSHF;標(biāo)志寄存器內(nèi)容(16位)壓棧標(biāo)志寄存器出棧指令
POPF;彈出標(biāo)志寄存器的內(nèi)容。MOV指令的功能XCHG指令的功能堆棧的圖示SSSP0000H(棧頂)存儲(chǔ)器高地址堆棧段PUSH指令的功能POP指令的功能XLAT指令的功能二、算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令用來執(zhí)行二進(jìn)制的算術(shù)運(yùn)算:加減乘除以及BCD碼調(diào)整。這類指令會(huì)根據(jù)運(yùn)算結(jié)果影響狀態(tài)標(biāo)志,有時(shí)要利用某些標(biāo)志才能得到正確的結(jié)果;使用他們時(shí)請(qǐng)留心有關(guān)狀態(tài)標(biāo)志重點(diǎn)掌握加法指令:ADD、ADC、INC減法指令:SUB、SBB、DEC、CMP、NEG1、加法和減法指令加法指令:ADD,ADC和INC減法指令:SUB,SBB,DEC,NEG和CMP他們分別執(zhí)行字或字節(jié)的加法和減法運(yùn)算,除INC和DEC不影響CF標(biāo)志外,其他按定義影響全部狀態(tài)標(biāo)志位操作數(shù)組合:dest,src運(yùn)算指令助記符reg,imm/reg/mem運(yùn)算指令助記符mem,imm/reg
ADD
dest,src
;加法:dest←dest+src ;ADD指令使目的操作數(shù)加上源操作數(shù),和的結(jié)果送到目的操作數(shù)
SUB
dest,src
;減法:dest←dest-src ;SUB指令使目的操作數(shù)減去源操作數(shù),差的結(jié)果送到目的操作數(shù)①不帶進(jìn)位加和減指令加法例題movax,7348h ;AX=7348Haddal,27h
;AL=48H+27H=6FH,AX=736FH ;OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh
;AX=736FH+3FFFH=B36EH ;OF=1,SF=1,ZF=0,PF=0,CF=0減法例題subah,0f0h ;AH=B3H-F0H=C3H,AX=C36EH ;OF=0,SF=1,ZF=0,PF=1,CF=1movwordptr[200h],0ef00h
;[200H]=EF00H,標(biāo)志不變sub[200h],ax
;[200H]=EF00H-C36EH=2B92H ;OF=0,SF=0,ZF=0,PF=0,CF=0subsi,si ;SI=0 ;OF=0,SF=0,ZF=1,PF=1,CF=0②帶進(jìn)位加和減指令A(yù)DC
dest,src
;加法:dest←dest+src+CF ;ADC指令除完成ADD加法運(yùn)算外,還要加上進(jìn)位CF,結(jié)果送到目的操作數(shù)SBB
dest,src ;減法:dest←dest-src-CF ;SBB指令除完成SUB減法運(yùn)算外,還要減去借位CF,結(jié)果送到目的操作數(shù)例:無符號(hào)雙字加法和減法movax,7856h ;AX=7856Hmovdx,8234h ;DX=8234Haddax,8998h ;AX=01EEH,CF=1adcdx,1234h ;DX=9469H,CF=0subax,4491h ;AX=BD5DH,CF=1sbbdx,8000h ;DX=1468H,CF=0DX.AX=82347856H+12348998H-80004491H=1468BD5DH③比較指令CMP(compare)CMP
dest,src
;做減法運(yùn)算:dest-src ;CMP指令將目的操作數(shù)減去源操作數(shù),但差值不回送目的操作數(shù)比較指令通過減法運(yùn)算影響狀態(tài)標(biāo)志,用于比較兩個(gè)操作數(shù)的大小關(guān)系cmpax,bxcmpal,100如A、B兩數(shù)為無符號(hào)數(shù),則通過以下標(biāo)志判斷ZF=1,A=B;CF=0,A﹥B;CF=1,A﹤B如A、B兩數(shù)為有符號(hào)數(shù),不能通過CF標(biāo)志判斷兩數(shù)的大、小關(guān)系,要使用SF、OF標(biāo)志ZF=1,A=BSF、OF同號(hào),則A﹥BSF、OF異號(hào),則A﹤B實(shí)例驗(yàn)證A=10=00001010BB=-10=11110110BA-B=00001010-11110110=00010100SF=0OF=0,A﹥BB-A=11110110-00001010=11101100SF=1,OF=0,A﹤B④增量和減量指令I(lǐng)NC
reg/mem
;增量(加1):reg/mem←reg/mem+1DEC
reg/mem
;減量(減1):reg/mem←reg/mem-1INC指令和DEC指令是單操作數(shù)指令與加法和減法指令實(shí)現(xiàn)的加1和減1不同的是:INC和DEC不影響CF標(biāo)志incsi ;si←si+1decbyteptr[si] ;[si]←[si]-1⑤求補(bǔ)指令NEG(negtive)NEGreg/mem
;reg/mem←0-reg/memNEG指令對(duì)操作數(shù)執(zhí)行求補(bǔ)運(yùn)算,即用零減去操作數(shù),然后結(jié)果返回操作數(shù)求補(bǔ)運(yùn)算也可以表達(dá)成:將操作數(shù)按位取反后加1NEG指令對(duì)標(biāo)志的影響與用零作減法的SUB指令一樣(總使CF=1)NEG指令也是一個(gè)單操作數(shù)指令求補(bǔ)運(yùn)算例題movax,0ff64hnegal
;AL=0-64H=9CH,AX=FF9CH ;OF=0,SF=1,ZF=0,PF=1,CF=1subal,9dh ;AL=9CH-9DH=FFH,AX=FFFFH ;OF=0,SF=1,ZF=0,PF=1,CF=1negax
;AX=0-FFFFH=0001H ;OF=0,SF=0,ZF=0,PF=0,CF=1decal
;AL=01H-1=0,AX=0000H ;OF=0,SF=0,ZF=1,PF=1,CF=1negax
;AX=0-0=0 ;OF=0,SF=0,ZF=1,PF=1,CF=0乘法指令規(guī)定:8位X8位,積為16位被乘數(shù)必須在AL中,乘積在AX中16位X16位,積為32位被乘數(shù)必須在AX中,乘積在DX(高16位)、AX中對(duì)標(biāo)志位的理解:CF=OF=1,表示結(jié)果為16位或32位有效。CF=0,OF=1,表示只有8位或16位乘積。
2、乘法指令乘法指令分無符號(hào)和有符號(hào)乘法指令MULreg/mem ;無符號(hào)乘法IMULreg/mem ;有符號(hào)乘法例:IMULBLMULCXMULbyteptr[di+04h]IMULwordptr[si]3、除法指令除法指令的規(guī)定:被除數(shù)是16位,必須存放于AX中,此時(shí)除數(shù)只能是8位,得到的商存于AL中,余數(shù)在AH中。被除數(shù)是32位,必須存放于DX、AX中,此時(shí)除數(shù)只能是16位,得到16位的商存于AX中,余數(shù)在DX中。除法運(yùn)算后,狀態(tài)標(biāo)志除ZF外,無意義。當(dāng)有符號(hào)數(shù)相除,商超出表示范圍不表示為溢出,其與除數(shù)為0一樣,產(chǎn)生0號(hào)中斷。(除法出錯(cuò))。有符號(hào)數(shù)相除,會(huì)有兩種結(jié)果,選擇余數(shù)的符號(hào)與被除數(shù)相同。(-30)÷8=-4余+2或-3余-6取后者當(dāng)被除數(shù)只有8位或16位時(shí)必須進(jìn)行擴(kuò)展。除法指令分無符號(hào)和有符號(hào)除法指令DIVreg/mem ;無符號(hào)除法IDIVreg/mem ;有符號(hào)除法例:DIVCL;IDIVBL;DIVwordptr[bx];IDIVbyteptr[2300h]
4、符號(hào)擴(kuò)展指令無符號(hào)數(shù)的擴(kuò)展高位補(bǔ)0,有符號(hào)數(shù)擴(kuò)展使用符號(hào)擴(kuò)展指令。符號(hào)擴(kuò)展是指用一個(gè)操作數(shù)的符號(hào)位(最高位)形成另一個(gè)操作數(shù),即擴(kuò)展符號(hào)位。符號(hào)擴(kuò)展雖然使數(shù)據(jù)位數(shù)加長(zhǎng),但數(shù)據(jù)大小并沒有改變,擴(kuò)展的高位部分僅是低位的符號(hào)擴(kuò)展。符號(hào)擴(kuò)展指令有兩條,用來將字節(jié)轉(zhuǎn)換為字,字轉(zhuǎn)換為雙字 CBW ;AL符號(hào)擴(kuò)展成AX CWD ;AX符號(hào)擴(kuò)展成DX符號(hào)擴(kuò)展例題moval,64h
;AL=64H(機(jī)器數(shù)),表示10進(jìn)制數(shù)100(真值)cbw
;將符號(hào)0擴(kuò)展,AX=0064H,仍然表示100movax,0ff00h ;AX=FF00H,表示有符號(hào)10進(jìn)制數(shù)-256cwd
;將符號(hào)位“1”擴(kuò)展,DX.AX=FFFFFF00H ;仍然表示-2565、十進(jìn)制調(diào)整指令十進(jìn)制數(shù)調(diào)整指令對(duì)BCD運(yùn)算的結(jié)果進(jìn)行十進(jìn)制調(diào)整,以得到正確的十進(jìn)制的運(yùn)算結(jié)果。BCD碼的運(yùn)算只有字節(jié)運(yùn)算,且必須用AL作目的操作數(shù)。8088指令系統(tǒng)支持兩種BCD碼調(diào)整運(yùn)算壓縮BCD碼就是通常的8421碼;它用4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,一個(gè)字節(jié)可以表示兩個(gè)十進(jìn)制位,即00~99非壓縮BCD碼用8個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,只用低4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位0~9,高4位任意,通常默認(rèn)為0①加法調(diào)整指令非壓縮BCD碼相加后用AAA調(diào)整壓縮BCD碼相加后用DAA調(diào)整例1:設(shè)AL=09HCL=07HADDAL,CL;AL=10HAAA;結(jié)果:AH=01HAL=06H調(diào)整的方法:當(dāng)(AL)﹥9或AF=1(AL)+06HAL,然后(AL)∧0FH;(AH)+1AH調(diào)整后AF、CF置1,其他標(biāo)志無意義。例2:設(shè)AL=28HCL=53HADDAL,CL;AL=7BHDAA;結(jié)果:AL=81H調(diào)整的方法:當(dāng)AL中低4位﹥9(AL)+06HAL。調(diào)整指令影響AF、CF、PF、SF、ZF,OF無意義。②減法調(diào)整指令非壓縮BCD碼相減以后用AAS調(diào)整壓縮BCD碼相減以后用DAS調(diào)整AAS指令的方法與AAA相似:
當(dāng)(AL)﹥9或AF=1(半借位)(AL)-06HAL,然后(AL)∧0FH;(AH)-1AHDAS指令的方法與DAA相似(加變減)。③乘法調(diào)整指令BCD碼相乘只能用非壓縮BCD碼,因而只有一條調(diào)整指令即AAM調(diào)整方法(AL)除以0AH,得到的商送到AH,余數(shù)在AL中。例:AL=05H,CL=07HMULCL;AL=23HAAM;AH=03HAL=05H④除法調(diào)整指令除法也只有非壓縮BCD碼相除,用AAD調(diào)整。除法調(diào)整指令用于除法指令之前。調(diào)整的方法是將AX中的2位被除數(shù)調(diào)整好,再除以除數(shù):(AH)X(0AH)+(AL)AL例:AX=0402HCL=06HAAD;AL=2AHDIVCL;AL=07H三、邏輯運(yùn)算和移位指令邏輯運(yùn)算即位操作,指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作當(dāng)需要對(duì)字節(jié)或字?jǐn)?shù)據(jù)中的各個(gè)二進(jìn)制位操作時(shí),可以考慮采用位操作類指令注意這些指令對(duì)標(biāo)志位的影響1.邏輯運(yùn)算指令A(yù)NDORXORNOTTEST2.移位指令SHL(SAL)SHRSAR3.循環(huán)移位指令ROLRORRCLRCR1、邏輯運(yùn)算指令雙操作數(shù)邏輯指令A(yù)ND、OR、XOR和TEST設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義;它們的操作數(shù)組合與ADD、SUB等一樣:運(yùn)算指令助記符reg,imm/reg/mem運(yùn)算指令助記符mem,imm/reg
單操作數(shù)邏輯指令NOT不影響標(biāo)志位,操作數(shù)與INC、DEC和NEG一樣:NOTreg/mem邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)ANDdest,src
;dest←dest∧src
只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0。可以使某些位清0,其余位不變。邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)ORdest,src
;dest←dest∨src只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為0??梢允鼓承┪恢?。邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操作數(shù)XORdest,src
;dest←dest⊕src只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為0??梢允鼓承┪蝗》?。測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操作數(shù),僅按AND指令影響標(biāo)志TESTdest,src
;dest∧src
AND與TEST指令的關(guān)系,同SUB與CMP指令的關(guān)系一樣例:TESTAL,01H;測(cè)試AL的最低位TESTAX,8000H;測(cè)試AX的最高位TESTBX,00FFH;測(cè)試BX的低8位TESTCL,0F0H;測(cè)試CL的高4位利用ZF標(biāo)志判斷被測(cè)試位的狀態(tài)ZF=1,被測(cè)試位為0,否則,為1。邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/mem
;reg/mem←~reg/mem
按位取反,原來是“0”的位變?yōu)椤?”;原來是“1”的位變?yōu)椤?”邏輯運(yùn)算舉例moval,75h ;AL=75Handal,32h ;AL=30H ;CF=OF=0,SF=0,ZF=0,PF=1oral,71h ;AL=71H ;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h ;AL=80H ;CF=OF=0,SF=1,ZF=0,PF=0notal ;AL=7FH,標(biāo)志不變邏輯運(yùn)算指令的應(yīng)用例:將內(nèi)存2000單元的內(nèi)容D0、D3清0,D2、D4置1,D1、D6取反,其余位不變。movbl,[2000h]andbl,11110110b
;BL中D0和D3清0,其余位不變orbl,00010100b
;BL中D2和D4置1,其余位不變xorbl,01000010b
;BL中D1和D6求反,其余位不變mov[2000h],bl2、移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位,分別具有左移或右移操作移位指令的第一個(gè)操作數(shù)是指定的被移位的操作數(shù),可以是寄存器或存儲(chǔ)單元;后一個(gè)操作數(shù)表示移位位數(shù):該操作數(shù)為1,表示移動(dòng)一位該操作數(shù)為CL,CL寄存器值表示移位位數(shù)(移位位數(shù)大于1只能CL表示)按照移入的位設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF、ZF、PF邏輯左移指令SHLSHLreg/mem,1/CL ;reg/mem左移1或CL位 ;最低位補(bǔ)0,最高位進(jìn)入CF演示邏輯右移指令SHRSHRreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位補(bǔ)0,最低位進(jìn)入CF演示算術(shù)左移指令SALSALreg/mem,1/CL ;與SHL是同一條指令演示算術(shù)右移指令SARSARreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不變,最低位進(jìn)入CF演示數(shù)據(jù)移位舉例movdx,6075h
;DX=0110000001110101Bshldx,1
;DX=1100000011101010B ;CF=0,SF=1、ZF=0、PF=0sardx,1 ;DX=1110000001110101B ;CF=0,SF=1、ZF=0、PF=0shrdx,1 ;DX=0111000000111010B ;CF=1,SF=0、ZF=0、PF=1movcl,4
;CL=4,標(biāo)志不變sardx,cl ;DX=0000011100000011B ;CF=1,SF=0、ZF=0、PF=1例:將AL寄存器中的無符號(hào)數(shù)乘以10xorah,ah
;實(shí)現(xiàn)AH=0,同時(shí)使CF=0shlax,1
;AX←2×ALmovbx,ax
;BX←AX=2×ALshlax,1
;AX←4×ALshlax,1
;AX←8×ALaddax,bx
;AX←8×AL+2×AL=10×ALsubah,ahandah,0邏輯左移一位相當(dāng)于無符號(hào)數(shù)乘以2
邏輯右移一位相當(dāng)于無符號(hào)數(shù)除以2循環(huán)移位指令循環(huán)移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環(huán)。分為:ROL
reg/mem,1/CL ;不帶進(jìn)位循環(huán)左移ROR
reg/mem,1/CL ;不帶進(jìn)位循環(huán)右移RCL
reg/mem,1/CL ;帶進(jìn)位循環(huán)左移RCRreg/mem,1/CL ;帶進(jìn)位循環(huán)右移循環(huán)移位指令的操作數(shù)形式與移位指令相同,按指令功能設(shè)置進(jìn)位標(biāo)志CF,但不影響SF、ZF、PF、AF標(biāo)志演示演示演示演示應(yīng)用:32位數(shù)據(jù)移位;將DX.AX中32位數(shù)值左移一位shlax,1rcldx,1DXAXCF0考慮32位數(shù)據(jù)的右移等操作SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能四、控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的常用指令重點(diǎn)掌握:JMP/Jcc/LOOP/JCXZ
CALL/RET控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變1、目標(biāo)地址的尋址方式相對(duì)尋址方式指令代碼中提供目的地址相對(duì)于當(dāng)前IP的位移量,轉(zhuǎn)移到的目的地址(轉(zhuǎn)移后的IP值)就是當(dāng)前IP值加上位移量直接尋址方式指令代碼中提供目的邏輯地址,轉(zhuǎn)移后的CS和IP值直接來自指令操作碼后的目的地址操作數(shù)間接尋址方式指令代碼中指示寄存器或存儲(chǔ)單元,目的地址從寄存器或存儲(chǔ)單元中間接獲得用標(biāo)號(hào)表達(dá)用標(biāo)號(hào)表達(dá)用寄存器或存儲(chǔ)器操作數(shù)表達(dá)目標(biāo)地址的尋址范圍:段內(nèi)尋址段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個(gè)字節(jié)表達(dá),在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段目標(biāo)地址的尋址范圍:段間尋址段間轉(zhuǎn)移——遠(yuǎn)轉(zhuǎn)移(far)從當(dāng)前代碼段跳轉(zhuǎn)到另一個(gè)代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標(biāo)地址必須用一個(gè)32位數(shù)表達(dá),叫做32位遠(yuǎn)指針,它就是邏輯地址代碼段代碼段實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的屬性,自動(dòng)處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移程序員可用操作符short、nearptr
或farptr
強(qiáng)制成為需要的轉(zhuǎn)移類型2、無條件轉(zhuǎn)移指令只要執(zhí)行無條件轉(zhuǎn)移指令JMP,就使程序轉(zhuǎn)到指定的目標(biāo)地址,從目標(biāo)地址處開始執(zhí)行指令操作數(shù)label是要轉(zhuǎn)移到的目標(biāo)地址(目的地址、轉(zhuǎn)移地址)JMP指令分成4種類型:⑴段內(nèi)轉(zhuǎn)移、相對(duì)尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址JMPlabel ;程序轉(zhuǎn)向label標(biāo)號(hào)指定的地址第2章:無條件轉(zhuǎn)移指令JMP(jump)JMPlabel
;段內(nèi)轉(zhuǎn)移、相對(duì)尋址
;IP←IP+位移量
JMPr16/m16 ;段內(nèi)轉(zhuǎn)移、間接尋址
;IP←r16/m16
JMPfarptrlabel
;段間轉(zhuǎn)移、直接尋址
;IP←偏移地址,CS←段地址
JMPfarptrmem
;段間轉(zhuǎn)移,間接尋址
;IP←[mem],CS←[mem+2]演示演示演示演示演示3、條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令Jcc根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移。其通用格式為:
Jcc
label
;條件滿足,發(fā)生轉(zhuǎn)移 ;IP←IP+8位位移量; ;否則,順序執(zhí)行l(wèi)abel是一個(gè)標(biāo)號(hào)、一個(gè)8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移label只支持短轉(zhuǎn)移的相對(duì)尋址方式①Jcc指令的分類Jcc指令不影響標(biāo)志,但要利用標(biāo)志。根據(jù)利用的標(biāo)志位不同,分成三種情況:⑴判斷單個(gè)標(biāo)志位狀態(tài)⑵比較無符號(hào)數(shù)高低⑶比較有符號(hào)數(shù)大小
Jcc指令實(shí)際雖然只有16條,但卻有30個(gè)助記符采用多個(gè)助記符,目的是為了方便記憶和使用②判斷單個(gè)標(biāo)志位狀態(tài)⑴JZ/JE和JNZ/JNE 利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等)⑵JS和JNS 利用符號(hào)標(biāo)志SF,判斷結(jié)果是正是負(fù)⑶JO和JNO 利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出⑷JP/JPE和JNP/JPO 利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個(gè)數(shù)是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE 利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位例題1題目:將AX中存放的無符號(hào)數(shù)除以2,如果是奇數(shù)則加1后除以2問題:如何判斷AX中的數(shù)據(jù)是奇數(shù)還是偶數(shù)?解答:判斷AX最低位是“0”(偶數(shù)),還是“1”(奇數(shù))??梢杂梦徊僮黝愔噶?:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個(gè)數(shù)據(jù)是0,AX就是偶數(shù);否則,為奇數(shù)2:將最低位用移位指令移至進(jìn)位標(biāo)志,判斷進(jìn)位標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù)3:將最低位用移位指令移至最高位(符號(hào)位),判斷符號(hào)標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù)例題1解答—用JZ指令實(shí)現(xiàn) testax,01h;測(cè)試AX的最低位D0(不用AND指令,以免改變AX)
jz
even;標(biāo)志ZF=1,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 addax,1;標(biāo)志ZF=0,即D0=1:AX內(nèi)的奇數(shù),加1even: shrax,1 ;AX←AX÷2用右移一位的方法實(shí)現(xiàn)除以2。例題1解答—用JNC指令實(shí)現(xiàn) movbx,ax shrbx,1;將AX的最低位D0移進(jìn)CF
jnc
even;標(biāo)志CF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 addax,1;標(biāo)志CF=1,即D0=1:AX內(nèi)的奇數(shù),加1even: shrax,1 ;AX←AX÷2還可用SAR、ROR和RCR指令例題1解答—用JNS指令實(shí)現(xiàn) movbx,ax rorbx,1;將AX的最低位D0移進(jìn)最高位(符號(hào)位SF)
jns
even;標(biāo)志SF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 addax,1;標(biāo)志SF=1,即D0=1:AX內(nèi)的奇數(shù),加1even: shrax,1 ;AX←AX÷2錯(cuò)誤!循環(huán)指令不影響SF等標(biāo)志ADDBX,0 ;增加一條指令例2判斷是否為字母Y;寄存器AL中是字母Y(含大小寫),則令A(yù)H=0,否則令A(yù)H=-1 cmpal,’y’ ;比較AL與小寫字母y
jenext
;相等,轉(zhuǎn)移 cmpal,’Y’ ;不相等, ;繼續(xù)比較AL與大寫字母Y
jenext
;相等,轉(zhuǎn)移 movah,-1 ;不相等,令A(yù)H=-1
jmpdone
;無條件轉(zhuǎn)移指令next: movah,0
;相等的處理:令A(yù)H=0done: ……比較無符號(hào)數(shù)高低無符號(hào)數(shù)的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標(biāo)志確定相等(Equal)兩數(shù)的高低分成4種關(guān)系,對(duì)應(yīng)4條指令JB(JNAE):目的操作數(shù)低于(不高于等于)源操作數(shù)JNB(JAE):目的操作數(shù)不低于(高于等于)源操作數(shù)JBE(JNA):目的操作數(shù)低于等于(不高于)源操作數(shù)JNBE(JA):目的操作數(shù)不低于等于(高于)源操作數(shù)比較有符號(hào)數(shù)大小判斷有符號(hào)數(shù)的大(Greater)、?。↙ess),需要組合OF、SF標(biāo)志、并利用ZF標(biāo)志確定相等與否兩數(shù)的大小分成4種關(guān)系,分別對(duì)應(yīng)4條指令JL(JNGE):目的操作數(shù)小于(不大于等于)源操作數(shù)JNL(JGE):目的操作數(shù)不小于(大于等于)源操作數(shù)JLE(JNG):目的操作數(shù)小于等于(不大于)源操作數(shù)JNLE(JG):目的操作數(shù)不小于等于(大于)源操作數(shù)例:求較大值 cmpax,bx ;比較AX和BX
jaenext ;若AX≥BX,轉(zhuǎn)移 xchgax,bx ;若AX<BX,交換next: movwmax,ax如果AX和BX存放的是有符號(hào)數(shù),則條件轉(zhuǎn)移指令應(yīng)采用JGE指令例:求較大值(另解) cmpax,bx ;比較AX和BX
jae
next movwmax,bx ;若AX<BX,wmax←BX
jmp
donenext: movwmax,ax ;若AX≥BX,wmax←AXdone:
……3、循環(huán)指令一段代碼序列多次重復(fù)執(zhí)行就是循環(huán)8088設(shè)計(jì)有針對(duì)CX計(jì)數(shù)器的計(jì)數(shù)循環(huán)指令
LOOPlabel ;循環(huán)指令 ;首先CX←CX-1;然后判斷;若CX≠0,轉(zhuǎn)移
JCXZlabel ;為0循環(huán)指令 :如果CX=0,則轉(zhuǎn)移label操作數(shù)采用相對(duì)短尋址方式還有LOOPZ/LOOPE和LOOPNZ/LOOPNE兩條指令deccxjnzlabel?通常的循環(huán)控制
MOVCX,NBEGIN:….….….循環(huán)體DECCXJNZBEGINLOOPBEGIN有了LOOP指令,程序得到簡(jiǎn)化例:在100個(gè)字符構(gòu)成的字符串中尋找第一個(gè)$字符。(在循環(huán)出口處可以根據(jù)ZF標(biāo)志和CX寄存器的值來確定是否找到以及該字符的位置)MOVCX,100MOVSI,0FFFH;假設(shè)字符串從偏移地址1000H處開始存放NEXT:INCSICMPBYTEPTR[SI],’$’LOOPNZNEXT
?注意,上面程序段中ZF標(biāo)志是由CMP指令設(shè)置的,而與CX減1動(dòng)作無關(guān)。五、串操作指令串指令可以對(duì)字節(jié)或字串進(jìn)行操作。所有串操作指令都默認(rèn)對(duì)DS段中用SI指定的源操作數(shù)及ES段中用DI指定的目的操作數(shù)尋址,可用段超越前綴改變。串操作指令執(zhí)行時(shí),由標(biāo)志位DF決定地址指針的修改方向。當(dāng)DF=1時(shí)作減量修改;當(dāng)DF=0時(shí)作增量修改。因此,在串操作指令執(zhí)行前,需對(duì)SI、DI和DF進(jìn)行設(shè)置。使用串操作指令一般要加重復(fù)前綴。每一條指令即是一段循環(huán)程序,可以被中斷。串操作指令是唯一的一類源操作數(shù)和目的操作數(shù)都為存儲(chǔ)器單元的指令。1、字符串傳送指令串傳送指令MOVSB/MOVSW其功能是把位于DS段由SI指定的內(nèi)存單元的字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)傳送到ES段由DI指定的內(nèi)存單元。指令不影響狀態(tài)標(biāo)志位。例:把DS段1000H起始的100個(gè)字節(jié)的內(nèi)容傳送到ES段2000H起始的內(nèi)存中。MOVSI,1000HMOVDI,2000HMOVCX,100CLD;DF=0REPMOVSB;(SI)(DI)SI+1SIDI+1DICX-1≠0,繼續(xù)傳送重復(fù)前綴串比較指令CMPSB/CMPSW其功能是比較DS和ES段中相對(duì)應(yīng)的內(nèi)容,可以通過重復(fù)前綴指明比較兩段是否完全相同或不同,找出第一個(gè)相等或不相等的字符。重復(fù)前綴:相同重復(fù):REPZ不相同重復(fù):REPNZ2、字符串比較指令例:MOVSI,2050HMOVDI,3000HMOVCX,20CLDREPZCMPSB;JNZNEQ;....NEQ:(SI)與(DI)相比,如ZF=1繼續(xù)比較。(SI)+1、(DI)+1,(CX)-1,當(dāng)CX=0或ZF=0時(shí),停止比較。(CX=0不影響ZF)
編程比較從邏輯地址2000H:100H開始的10個(gè)字節(jié)與邏輯地址4000H:200H開始的10個(gè)字節(jié)是否對(duì)應(yīng)相等,相等則轉(zhuǎn)DONE。MOVAX,2000HMOVDS,AXMOVAX,4000HMOVES,AXMOVDI,200HMOVSI,100H
CLDMOVCX,10REPZCMPSBJZDONERETDONE┇例:判斷是否加電成功
MOVSI,0E2DHMOVDI,0400HCLDMOVCX,0004REPZCMPSBJZDONERET……DONE:04000E2D12233445XXXXXXXXRAMROM3、字符串搜索指令SCAS串搜索指令SCASB/SCASW其功能是把AL或AX中的內(nèi)容與ES段由DI指定的一個(gè)字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)進(jìn)行比較,尋找與AL或AX內(nèi)容相等或不相等的數(shù)據(jù)。例:MOVDI,2000HMOVAL,F(xiàn)FHMOVCX,1000HCLDREPNZSCASB;JZEXC;....EXC:AL與(DI)相比,如ZF=0繼續(xù)比較。(DI)+1,(CX)-1,當(dāng)CX=0或ZF=1時(shí),停止比較。(CX=0不影響ZF)從邏輯地址9000H:100H開始的10個(gè)單元中如果有一個(gè)單元的內(nèi)容為2CH,則BX加1。MOVAX,9000HMOVES,AXMOVDI,100HCLDMOVCX,10MOVAL,2CHREPNZSCASBJNZAAA1INCBXAAA1:┇
4、取字符串指令取字符串指令LODSB/LODSW其功能是把位于DS段由SI指定內(nèi)存單元的內(nèi)容取到寄存器AL或AX中。指令不影響狀態(tài)標(biāo)志位。一般不用重復(fù)前綴,可自動(dòng)改變地址。舉例:將100H:20H單元開始的10個(gè)字節(jié)的內(nèi)容均加5。
CLDMOVCX,10MOVAX,100HMOVDS,AXMOVSI,20HLL1:LODSBADDAL,5MOV[SI-1],ALDECCXJNZLL1HLT
5、存字符串指令存字符串指令STOSB/STOSW其功能是把寄存器AL或AX中的內(nèi)容存到ES段由DI指定的內(nèi)存單元。指令不影響狀態(tài)標(biāo)志位??捎弥貜?fù)前綴。例:MOVDI,2300HCLDMOVCX,100HXORAX,AXREPSTOSW六、子程序指令子程序是完成特定功能的一段程序當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個(gè)功能時(shí),采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行當(dāng)運(yùn)行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行演示
轉(zhuǎn)移指令有去無回子程序調(diào)用需要返回,其中利用堆棧保存返回地址1.子程序調(diào)用指令CALLCALL指令分成4種類型(類似JMP)CALLlabel
;段內(nèi)調(diào)用、直接尋址CALLr16/m16
;段內(nèi)調(diào)用、間接尋址CALLfarptrlabel
;段間調(diào)用、直接尋址CALLfarptrmem
;段間調(diào)用、間接尋址CALL指令需要保存返回地址:段內(nèi)調(diào)用——入棧偏移地址IPSP←SP-2,SS:[SP]←IP段間調(diào)用——入棧偏移地址IP和段地址CSSP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.子程序返回指令RET根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類型RET
;無參數(shù)段內(nèi)返回RETi16
;有參數(shù)段內(nèi)返回RET
;無參數(shù)段間返回RETi16
;有參數(shù)段間返回需要彈出CALL指令壓入堆棧的返回地址段內(nèi)返回——出棧偏移地址IPIP←SS:[SP],SP←SP+2段間返回——出棧偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2例、十六進(jìn)制轉(zhuǎn)換為ASCII碼的子程序;子程序:將DL低4位的一位16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼htoasc proc anddl,0fh ;只取DL的低4位 ordl,30h ;DL高4位變成3 cmpdl,39h ;是0~9,還是0Ah~0Fh? jbehtoend ;是0~9,轉(zhuǎn)移 adddl,7 ;是0Ah~0Fh,加上7htoend: ret ;子程序返回htoasc endp轉(zhuǎn)換原理;主程序:調(diào)用子程序movdl,28hcallhtoasc3、中斷指令和系統(tǒng)功能調(diào)用中斷(Interrupt)是又一種改變程序執(zhí)行順序的方法中斷指令有3條:
INTi8IRETINTO本節(jié)主要掌握類似子程序調(diào)用指令的中斷調(diào)用指令I(lǐng)NTi8,進(jìn)而掌握系統(tǒng)功能調(diào)用七、處理器控制類指令處理器控制類指令用來控制CPU的狀態(tài),使CPU暫停、等待或空操作等NOP ;空操作指令,等同于“xchgax,ax”指令SEG: ;段超越前綴指令:CS:,SS:,DS:,ES:HLT ;暫停指令:CPU進(jìn)入暫停狀態(tài)還有其他指令: LOCKESCWAIT標(biāo)志操作指令STC;CF=1STD;DF=1STI;IF=1CLC;CF=0CLD;DF=0CLI;IF=0CMC;CF取反第2章:總結(jié)本章展開了8088CPU16位指令系統(tǒng)的常用指令希望大家就如下幾個(gè)方面進(jìn)行一下總結(jié):操作數(shù)尋址方式和目的地址尋址方式指令支持的操作數(shù)形式常用指令的助記符和功能指令對(duì)標(biāo)志的影響通過復(fù)習(xí)整理,形成指令系統(tǒng)的整體概念,進(jìn)而掌握常用指令指令執(zhí)行第3章:習(xí)題1.8086常用的尋址方式有哪些?哪幾種尋址方式的指令執(zhí)行速度快?2.如在指令中不具體指明段寄存器,那么段地址如何確定?3.假設(shè)DS=3000H,BX=0870H,SI=010CH,d=45h以MOV指令為例,寫出各種尋址方式下的指令形式,并求出數(shù)據(jù)的有效地址和物理地址。4.請(qǐng)指出下列指令中源操作數(shù)的尋址方式
⑴MOVSI,120⑵MOVBP,[BX]⑶MOVAX,CX⑷POPBX⑸ANDDL,[BX+SI+30H]⑹XCHGAL,BUF5.請(qǐng)指出如下程序段中每條邏輯指令執(zhí)行后標(biāo)志ZF、SF和PF的狀態(tài)MOVAL,0AHANDAL,0FHORAL,4BHXORAL,AL6.判斷指令的對(duì)錯(cuò),說明錯(cuò)誤指令出錯(cuò)原因⑴MOV[SP],BX⑵MOVCX,BX⑶JMPBX⑷XCHG[SI],WED⑸SHLAX,CX
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年間氟氯苯項(xiàng)目可行性研究報(bào)告
- 2024年纖維板項(xiàng)目可行性研究報(bào)告
- 2024年淡青盤項(xiàng)目可行性研究報(bào)告
- 河北省總包合同范例
- 2024年更鞋柜項(xiàng)目可行性研究報(bào)告
- 機(jī)場(chǎng)弱電維保合同范例
- 花崗石倒角合同范例
- 2024年工裝板項(xiàng)目可行性研究報(bào)告
- 推行標(biāo)準(zhǔn)合同范例
- 個(gè)人養(yǎng)魚銷售合同范例
- 冀教版(三起)英語六年級(jí)上冊(cè)知識(shí)點(diǎn)總結(jié)(知識(shí)清單)
- MOOC 中國(guó)天氣-南京信息工程大學(xué) 中國(guó)大學(xué)慕課答案
- 全國(guó)養(yǎng)老護(hù)理職業(yè)技能大賽養(yǎng)老護(hù)理員賽項(xiàng)考試題庫-上(單選題)
- 倉(cāng)管員年度述職報(bào)告總結(jié)
- 口腔科誤吞誤吸應(yīng)急處理
- 2024年福建廣電網(wǎng)絡(luò)集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 武大生物化學(xué)復(fù)習(xí)資料
- 國(guó)家開放大學(xué)《數(shù)據(jù)結(jié)構(gòu)》課程實(shí)驗(yàn)報(bào)告(實(shí)驗(yàn)5-圖的存儲(chǔ)方式和應(yīng)用)參考答案
- 部編版語文五年級(jí)下冊(cè)第二單元走進(jìn)中國(guó)古典名著 大單元整體教學(xué)設(shè)計(jì)
- 開診所可行性分析報(bào)告
- 設(shè)備操作手冊(cè)編寫與更新方法和技巧講解與實(shí)操演示
評(píng)論
0/150
提交評(píng)論