




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章教學重點8088/8086的尋址方式8088/8086的基本指令傳送指令算術運算指令邏輯運算和移位指令串操作指令控制轉移指令指令的基本組成操作碼說明計算機要執行哪種操作,如傳送、運算、移位、跳轉等操作,它是指令中不可缺少的組成部分操作數
指明參與操作的數是誰或存放在何處尋找操作數的方法叫尋址方式在轉移調用指令中尋找新的轉移地址也是尋址方式。操作碼操作數指令由操作碼和操作數兩部分組成
§1操作數的尋址方式指令系統設計了多種操作數的來源尋找操作數的過程就是操作數的尋址理解操作數的尋址方式是理解指令功能的前提操作數采取哪一種尋址方式一方面,會影響處理器執行指令的速度和效率另一方面,對程序設計也很重要一、立即數尋址方式指令中直接給出一個常數作為操作數,其緊跟在操作碼之后存放在代碼段中。立即數直接從指令隊列中取得,不用總線周期,執行數度快。這種操作數被稱為立即數可以是8位數值(00H~FFH)也可以是16位數值(0000H~FFFFH)立即數尋址方式常用來給寄存器和存儲單元賦值,多以常量形式出現注意:立即數只能是整數而且是常數。演示MOVAX,0102H ;AX←0102H二、寄存器尋址方式指令中指明某個寄存器其內容即為操作數,寄存器在CPU內,不用總線周期,執行速度快。8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4個段寄存器seg:CS、DS、SS、ES演示MOVAX,BX ;AX←BX三、直接尋址方式指令中直接給出操作數所在內存單元的有效地址(EA即偏移地址)默認的段地址在DS段寄存器,若在其它段可使用段超越前綴改變。用方括號包含有效地址,表達存儲單元的內容直接地址也可用標號代表,方括號可省略。演示MOVAX,[2000H] ;AX←DS:[2000H]MOVAX,ES:[2000H] ;AX←ES:[2000H]四、寄存器間接尋址方式指令中給出的寄存器的內容包含操作數的有效地址。間接尋址中使用的寄存器名要用方括號括起來1、基址尋址用BX或BP作間接尋址寄存器如:MOVAX,[BX];隱含在DS段MOVAX,[BP];隱含在SS段演示MOVAX,[BX] ;AX←DS:[BX]2、變址尋址用SI或DI作間接尋址寄存器如:MOVCL,[SI]MOVAX,[DI]單獨使用SI或DI時,隱含在DS段中在串操作時,SI隱含在DS段中,DI隱含在ES段中。3、相對基址尋址指令中給出基址寄存器及位移量,二者之和為操作數的有效地址。位移量可以是8位或16位。有效地址=BX/BP+8/16位位移量4、相對變址尋址指令中給出變址寄存器及位移量,二者之和為操作數的有效地址。有效地址=SI/DI+8/16位位移量段地址對應BX/SI/DI寄存器默認是DS,對應BP寄存器默認是SS;可用段超越前綴改變演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]5、基址變址尋址方式有效地址由基址寄存器(BX或BP)的內容加上變址寄存器(SI或DI)的內容構成:有效地址=BX/BP+SI/DI段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是SS;可用段超越前綴改變演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]6、相對基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是SS;可用段超越前綴改變演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOV指令的功能立即數尋址方式寄存器尋址方式直接尋址方式間接尋址方式相對尋址方式基址變址尋址方式相對基址變址尋址方式各種尋址方式綜合舉例設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④相對基址尋址MOVAX,[BX+2BC0H]EA=1200H+2BC0H=3DC0H物理地址=24000H+3DC0H=27DC0H⑤相對變址尋址MOVAX,[DI+2BC0H]EA=10A0H+2BC0H=3C60H物理地址=24000H+3C60H=27C60H⑥相對基址變址尋址MOVAX,[BX+DI+2BC0H]EA=1200H+10A0H+2BC0H=4E60H物理地址=24000H+4E60H=28E60H§28086的指令格式操作碼操作碼11REGR/M操作碼MODREGR/M操作碼(R)單字節指令(隱含操作數)單字節指令(寄存器模式)雙字節指令
(寄存器到寄存器模式)不帶位移量的寄存器和內存之間的傳送REG--寄存器MOD--模式R/M--寄存器或內存一、指令格式操作碼MODREGR/M位移低位位移高位操作碼11操作碼R/M數據低位數據高位操作碼MOD操作碼R/M位移低位位移高位數據低位數據高位REG--寄存器MOD--模式R/M--寄存器或內存帶位移量的寄存器和內存之間的傳送(設位移量為16位)立即數送寄存器(設立即數為16位)立即數送內存(設位移量為16位)四字節指令六字節指令在操作碼中一般有3位W、D、SW=0表示字節操作W=1表示字操作D=0REG是源操作數D=1是目的操作數S是擴展位(用于加、減和比較和W組合使用)S=0W=08位操作數S=0W=116位操作數S=1W=1由8位擴展為16位操作數單字節指令中可隱含指出寄存器名,此類指令少,但執行速度較快。8086規定:雙操作數指令中(除立即數和串操作指令),其中一個操作數必須在寄存器中,可縮短指令長度,另一個操作數可以在寄存器中也可以在內存單元中。8086指令中第二個字節,給出兩個操作數在什么地方,以及計算存儲器地址的方法。MODREGR/M尋址方式寄存器名計算存儲器地址方法MOD數據00存儲器尋址不帶位移量01存儲器尋址8位位移量10存儲器尋址16位位移量11寄存器尋址MOD=11,表明第二個操作數也在寄存器中,則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二、段寄存器的隱含訪問一般指令中不出現段寄存器名稱,而用隱含關系指明。如與隱含關系不同,運用前綴改變。①[BX]隱含于DS段②
[BP]隱含于SS段③[SI]、[DI]單獨使用隱含于DS段④基址寄存器和變址寄存器同時出現,以基址寄存器隱含關系為準。[SP]
隱含于SS段[SI]、[DI]用于串操作時,[SI]隱含于DS段,
[DI]隱含于ES段。使用前綴的形式
ADDAX,ES:[SI]或ES:ADDAX,[SI]三、指令執行時間一般用所需的時鐘周期數表明指令執行時間=基本執行時間+計算有效地址時間
+為取操作數和存放結果而訪問內存的時間§38086指令系統8086指令系統很豐富,包含133條基本指令,功能強。一般分為五類來介紹傳送指令算術運算指令邏輯運算和移位指令串操作指令控制轉移指令一、數據傳送類指令數據傳送是計算機中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令傳送指令把數據從一個位置傳送到另一個位置除標志寄存器傳送指令外,均不影響標志位重點掌握MOVXCHGPUSHPOPXLATLEA1、通用數據傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGPUSHPOPMOVXCHGPUSH①基本傳送指令MOV(move)把一個字節或字的操作數從源地址傳送至目的地址MOVreg/mem,imm;立即數送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存演示MOV指令舉例--立即數傳送movcl,4 ;cl←4,字節傳送movdx,0ffh
;dx←00ffh,字傳送movsi,200h
;si←0200h,字傳送movbvar,0ah
;字節傳送;假設bvar是一個字節變量,定義如下:bvardb0movwvar,0bh
;字傳送;假設wvar是一個字變量,定義如下:wvardw0明確指令是字節操作還是字操作以字母開頭的常數要有前導0MOV指令舉例--寄存器傳送movah,al ;ah←al,字節傳送movbvar,ch ;bvar←ch,字節傳送movax,bx ;ax←bx,字傳送movds,ax ;ds←ax,字傳送mov[bx],al ;[bx]←al,字節傳送寄存器具有明確的字節和字類型MOV指令舉例--存儲器傳送moval,[bx] ;al←ds:[bx]movdx,[bp] ;dx←ss:[bp+0]movdx,[bp+4] ;dx←ss:[bp+4]moves,[si] ;es←ds:[si]不存在存儲器向存儲器的傳送指令MOV指令舉例--段寄存器傳送mov[si],dsmovax,ds ;ax←dsmoves,ax ;es←ax←ds對段寄存器的操作不靈活MOV指令傳送功能圖解MOV指令也并非任意傳送!立即數段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲器非法指令的主要現象:兩個操作數的類型不一致無法確定是字節量還是字量操作兩個操作數都是存儲器段寄存器的操作有一些限制非法指令--兩個操作數類型不一致在絕大多數雙操作數指令中,目的操作數和源操作數必須具有一致的數據類型,或者同為字量,或者同為字節量,否則為非法指令
MOVAL,050AH ;非法指令,修正: ;movax,050ah MOVSI,DL ;非法指令,修正: ;movdh,0
;mov
si,dx非法指令--無法確定是字節量還是字量操作當無法通過任一個操作數確定是操作類型時,需要利用匯編語言的操作符顯式指明
MOV[BX+SI],255 ;非法指令,修正: ;mov
byteptr[bx+si],255
;byteptr
說明是字節操作 ;mov
wordptr[bx+si],255
;wordptr
說明是字操作非法指令--兩個操作數都是存儲器8088指令系統除串操作指令外,不允許兩個操作數都是存儲單元(存儲器操作數)
MOVbuf2,buf1如MOV[BX],[SI]
此類非法指令修正:
;假設buf2和buf1是兩個字變量
;movax,buf1
;movbuf2,ax
;假設buf2和buf1是兩個字節變量
;moval,buf1
;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系統中,能直接對段寄存器操作的指令只有MOV等個別傳送指令,并且不靈活
MOVDS,ES ;非法指令,修正: ;mov
ax,es
;mov
ds,ax MOVDS,100H ;非法指令,修正: ;movax,100h
;mov
ds,ax
MOVCS,[SI] ;非法指令 ;指令存在,但不能執行②交換指令XCHG(exchange)把兩個地方的數據進行互換寄存器與寄存器之間對換數據寄存器與存儲器之間對換數據不能在存儲器與存儲器之間對換數據XCHGreg,reg/mem;regreg/mem演示數據交換指令舉例movax,1199h ;ax=1199hxchgah,al ;ax=9911h;等同于xchgal,ahmovwvar,5566h ;wvar是一個字量變量xchgax,wvar ;ax=5566h,wvar=9911h;等同于xchgwvar,ax
注意:不能在兩個內存單元之間交換 如:XCHG[BX],[SI]錯誤!
段寄存器中CS、IP不能做操作數③堆棧操作指令堆棧是一個“后進先出LIFO”(或說“先進后出FILO”)的主存區域,位于堆棧段中;SS段寄存器記錄其段地址堆棧只有一個出口,即當前棧頂;用堆棧指針寄存器SP指定堆棧只有兩種基本操作:進棧和出棧,對應兩條指令PUSH和POP堆棧由棧底向低地址方向生成圖示進棧指令PUSH進棧指令先使堆棧指針SP減2,然后把一個字操作數存入堆棧頂部PUSHr16/m16/seg ;SP←SP-2 ;SS:[SP]←r16/m16/seg演示pushaxpush[2000h]出棧指令POP出棧指令把棧頂的一個字傳送至指定的目的操作數,然后堆棧指針SP加2POPr16/m16/seg ;r16/m16/seg←SS:[SP] ;SP←SP+2popaxpopwvar演示堆棧操作的特點堆棧操作的單位是字,進棧和出棧只對字進行數據從棧頂壓入和彈出時,都是低地址送低字節,高地址送高字節堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數據堆棧段是程序中不可或缺的一個內存區,常用來臨時存放數據傳遞參數保存和恢復寄存器應用舉例:設SS=1000HSP=2000HAX=A26FH執行PUSHAX指令的過程和結果SP-2=1FFEH則AX內容壓入內存11FFEH和11FFFH執行后SP=1FFEH(11FFEH)=6FH(11FFFH)=A2HSP12000HSP11FFEH11FFFH6FHA2H棧底練習1:已知SS=1200H執行MOVAX,3765HMOVBX,4288HMOVSP,1020HPUSHAXPUSHBXPOPCX執行后AX=()BX=()CX=()SP=()
3765H,4288H,4288H,101EH2、累加器專用傳送指令①輸入輸出指令(IN/OUT指令)格式:INAL,port;port為直接端口地址INAL,DX;DX的內容為端口地址(間接方式)INAX,port;INAX,DXOUTport,ALOUTDX,ALOUTport,AXOUTDX,AX注意:①只能用累加寄存器不能用其它寄存器②當端口地址在00H—FFH之間可以用直接地址當端口地址大于FFH時必須用DX間址形式例:INAL,40H;(40H)ALINAX,80H;(80H)、(81H)AX
MOVDX,0382HINAL,DX;(0382H)AL
OUT62H,ALMOVDX,0380HOUTDX,AX②換碼指令XLAT(查表指令)將BX指定的緩沖區中、AL指定的位移處的一個字節數據取出賦給AL換碼指令執行前:在主存建立一個字節量表格,內含要轉換成的目的代碼表格首地址存放于BX,AL存放相對表格首地址的位移量換碼指令執行后:將AL寄存器的內容轉換為目標代碼XLAT
;al←ds:[bx+al]演示將存儲器操作數的有效地址送至指定的16位通用寄存器③址傳送指令三條LEA、LDS、LESLEAr16,mem;r16←mem的有效地址EA例1:
有效地址的獲取 LEAAX,[2375H];AX=2375HLEASP,[BX+SI];SP=(BX)+(SI)區別: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執行后:BX=1234HDS=5678HLESr16,mem;es、r16←mem中的雙字例:LESDI,[SI]MDS段SISI+1SI+2SI+311H22H33H44H執行后:DI=2211HES=4433H4、標志傳送指令①讀標志指令LAHF;標志寄存器低字傳送到AH②設標志指令SAHF;AH的內容送標志寄存器低8位③標志寄存器堆棧指令PUSHF;標志寄存器內容(16位)壓棧標志寄存器出棧指令
POPF;彈出標志寄存器的內容。MOV指令的功能XCHG指令的功能堆棧的圖示SSSP0000H(棧頂)存儲器高地址堆棧段PUSH指令的功能POP指令的功能XLAT指令的功能二、算術運算類指令算術運算類指令用來執行二進制的算術運算:加減乘除以及BCD碼調整。這類指令會根據運算結果影響狀態標志,有時要利用某些標志才能得到正確的結果;使用他們時請留心有關狀態標志重點掌握加法指令:ADD、ADC、INC減法指令:SUB、SBB、DEC、CMP、NEG1、加法和減法指令加法指令:ADD,ADC和INC減法指令:SUB,SBB,DEC,NEG和CMP他們分別執行字或字節的加法和減法運算,除INC和DEC不影響CF標志外,其他按定義影響全部狀態標志位操作數組合:dest,src運算指令助記符reg,imm/reg/mem運算指令助記符mem,imm/reg
ADD
dest,src
;加法:dest←dest+src ;ADD指令使目的操作數加上源操作數,和的結果送到目的操作數
SUB
dest,src
;減法:dest←dest-src ;SUB指令使目的操作數減去源操作數,差的結果送到目的操作數①不帶進位加和減指令加法例題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,標志不變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②帶進位加和減指令ADC
dest,src
;加法:dest←dest+src+CF ;ADC指令除完成ADD加法運算外,還要加上進位CF,結果送到目的操作數SBB
dest,src ;減法:dest←dest-src-CF ;SBB指令除完成SUB減法運算外,還要減去借位CF,結果送到目的操作數例:無符號雙字加法和減法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
;做減法運算:dest-src ;CMP指令將目的操作數減去源操作數,但差值不回送目的操作數比較指令通過減法運算影響狀態標志,用于比較兩個操作數的大小關系cmpax,bxcmpal,100如A、B兩數為無符號數,則通過以下標志判斷ZF=1,A=B;CF=0,A﹥B;CF=1,A﹤B如A、B兩數為有符號數,不能通過CF標志判斷兩數的大、小關系,要使用SF、OF標志ZF=1,A=BSF、OF同號,則A﹥BSF、OF異號,則A﹤B實例驗證A=10=00001010BB=-10=11110110BA-B=00001010-11110110=00010100SF=0OF=0,A﹥BB-A=11110110-00001010=11101100SF=1,OF=0,A﹤B④增量和減量指令INC
reg/mem
;增量(加1):reg/mem←reg/mem+1DEC
reg/mem
;減量(減1):reg/mem←reg/mem-1INC指令和DEC指令是單操作數指令與加法和減法指令實現的加1和減1不同的是:INC和DEC不影響CF標志incsi ;si←si+1decbyteptr[si] ;[si]←[si]-1⑤求補指令NEG(negtive)NEGreg/mem
;reg/mem←0-reg/memNEG指令對操作數執行求補運算,即用零減去操作數,然后結果返回操作數求補運算也可以表達成:將操作數按位取反后加1NEG指令對標志的影響與用零作減法的SUB指令一樣(總使CF=1)NEG指令也是一個單操作數指令求補運算例題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乘法指令規定:8位X8位,積為16位被乘數必須在AL中,乘積在AX中16位X16位,積為32位被乘數必須在AX中,乘積在DX(高16位)、AX中對標志位的理解:CF=OF=1,表示結果為16位或32位有效。CF=0,OF=1,表示只有8位或16位乘積。
2、乘法指令乘法指令分無符號和有符號乘法指令MULreg/mem ;無符號乘法IMULreg/mem ;有符號乘法例:IMULBLMULCXMULbyteptr[di+04h]IMULwordptr[si]3、除法指令除法指令的規定:被除數是16位,必須存放于AX中,此時除數只能是8位,得到的商存于AL中,余數在AH中。被除數是32位,必須存放于DX、AX中,此時除數只能是16位,得到16位的商存于AX中,余數在DX中。除法運算后,狀態標志除ZF外,無意義。當有符號數相除,商超出表示范圍不表示為溢出,其與除數為0一樣,產生0號中斷。(除法出錯)。有符號數相除,會有兩種結果,選擇余數的符號與被除數相同。(-30)÷8=-4余+2或-3余-6取后者當被除數只有8位或16位時必須進行擴展。除法指令分無符號和有符號除法指令DIVreg/mem ;無符號除法IDIVreg/mem ;有符號除法例:DIVCL;IDIVBL;DIVwordptr[bx];IDIVbyteptr[2300h]
4、符號擴展指令無符號數的擴展高位補0,有符號數擴展使用符號擴展指令。符號擴展是指用一個操作數的符號位(最高位)形成另一個操作數,即擴展符號位。符號擴展雖然使數據位數加長,但數據大小并沒有改變,擴展的高位部分僅是低位的符號擴展。符號擴展指令有兩條,用來將字節轉換為字,字轉換為雙字 CBW ;AL符號擴展成AX CWD ;AX符號擴展成DX符號擴展例題moval,64h
;AL=64H(機器數),表示10進制數100(真值)cbw
;將符號0擴展,AX=0064H,仍然表示100movax,0ff00h ;AX=FF00H,表示有符號10進制數-256cwd
;將符號位“1”擴展,DX.AX=FFFFFF00H ;仍然表示-2565、十進制調整指令十進制數調整指令對BCD運算的結果進行十進制調整,以得到正確的十進制的運算結果。BCD碼的運算只有字節運算,且必須用AL作目的操作數。8088指令系統支持兩種BCD碼調整運算壓縮BCD碼就是通常的8421碼;它用4個二進制位表示一個十進制位,一個字節可以表示兩個十進制位,即00~99非壓縮BCD碼用8個二進制位表示一個十進制位,只用低4個二進制位表示一個十進制位0~9,高4位任意,通常默認為0①加法調整指令非壓縮BCD碼相加后用AAA調整壓縮BCD碼相加后用DAA調整例1:設AL=09HCL=07HADDAL,CL;AL=10HAAA;結果:AH=01HAL=06H調整的方法:當(AL)﹥9或AF=1(AL)+06HAL,然后(AL)∧0FH;(AH)+1AH調整后AF、CF置1,其他標志無意義。例2:設AL=28HCL=53HADDAL,CL;AL=7BHDAA;結果:AL=81H調整的方法:當AL中低4位﹥9(AL)+06HAL。調整指令影響AF、CF、PF、SF、ZF,OF無意義。②減法調整指令非壓縮BCD碼相減以后用AAS調整壓縮BCD碼相減以后用DAS調整AAS指令的方法與AAA相似:
當(AL)﹥9或AF=1(半借位)(AL)-06HAL,然后(AL)∧0FH;(AH)-1AHDAS指令的方法與DAA相似(加變減)。③乘法調整指令BCD碼相乘只能用非壓縮BCD碼,因而只有一條調整指令即AAM調整方法(AL)除以0AH,得到的商送到AH,余數在AL中。例:AL=05H,CL=07HMULCL;AL=23HAAM;AH=03HAL=05H④除法調整指令除法也只有非壓縮BCD碼相除,用AAD調整。除法調整指令用于除法指令之前。調整的方法是將AX中的2位被除數調整好,再除以除數:(AH)X(0AH)+(AL)AL例:AX=0402HCL=06HAAD;AL=2AHDIVCL;AL=07H三、邏輯運算和移位指令邏輯運算即位操作,指令以二進制位為基本單位進行數據的操作當需要對字節或字數據中的各個二進制位操作時,可以考慮采用位操作類指令注意這些指令對標志位的影響1.邏輯運算指令ANDORXORNOTTEST2.移位指令SHL(SAL)SHRSAR3.循環移位指令ROLRORRCLRCR1、邏輯運算指令雙操作數邏輯指令AND、OR、XOR和TEST設置CF=OF=0,根據結果設置SF、ZF和PF狀態,而對AF未定義;它們的操作數組合與ADD、SUB等一樣:運算指令助記符reg,imm/reg/mem運算指令助記符mem,imm/reg
單操作數邏輯指令NOT不影響標志位,操作數與INC、DEC和NEG一樣:NOTreg/mem邏輯與指令AND對兩個操作數執行邏輯與運算,結果送目的操作數ANDdest,src
;dest←dest∧src
只有相“與”的兩位都是1,結果才是1;否則,“與”的結果為0。可以使某些位清0,其余位不變。邏輯或指令OR對兩個操作數執行邏輯或運算,結果送目的操作數ORdest,src
;dest←dest∨src只要相“或”的兩位有一位是1,結果就是1;否則,結果為0。可以使某些位置1。邏輯異或指令XOR對兩個操作數執行邏輯異或運算,結果送目的操作數XORdest,src
;dest←dest⊕src只有相“異或”的兩位不相同,結果才是1;否則,結果為0。可以使某些位取反。測試指令TEST對兩個操作數執行邏輯與運算,結果并不送目的操作數,僅按AND指令影響標志TESTdest,src
;dest∧src
AND與TEST指令的關系,同SUB與CMP指令的關系一樣例:TESTAL,01H;測試AL的最低位TESTAX,8000H;測試AX的最高位TESTBX,00FFH;測試BX的低8位TESTCL,0F0H;測試CL的高4位利用ZF標志判斷被測試位的狀態ZF=1,被測試位為0,否則,為1。邏輯非指令NOT對一個操作數執行邏輯非運算NOTreg/mem
;reg/mem←~reg/mem
按位取反,原來是“0”的位變為“1”;原來是“1”的位變為“0”邏輯運算舉例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,標志不變邏輯運算指令的應用例:將內存2000單元的內容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、移位指令將操作數移動一位或多位,分成邏輯移位和算術移位,分別具有左移或右移操作移位指令的第一個操作數是指定的被移位的操作數,可以是寄存器或存儲單元;后一個操作數表示移位位數:該操作數為1,表示移動一位該操作數為CL,CL寄存器值表示移位位數(移位位數大于1只能CL表示)按照移入的位設置進位標志CF,根據移位后的結果影響SF、ZF、PF邏輯左移指令SHLSHLreg/mem,1/CL ;reg/mem左移1或CL位 ;最低位補0,最高位進入CF演示邏輯右移指令SHRSHRreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位補0,最低位進入CF演示算術左移指令SALSALreg/mem,1/CL ;與SHL是同一條指令演示算術右移指令SARSARreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不變,最低位進入CF演示數據移位舉例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,標志不變sardx,cl ;DX=0000011100000011B ;CF=1,SF=0、ZF=0、PF=1例:將AL寄存器中的無符號數乘以10xorah,ah
;實現AH=0,同時使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邏輯左移一位相當于無符號數乘以2
邏輯右移一位相當于無符號數除以2循環移位指令循環移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環。分為:ROL
reg/mem,1/CL ;不帶進位循環左移ROR
reg/mem,1/CL ;不帶進位循環右移RCL
reg/mem,1/CL ;帶進位循環左移RCRreg/mem,1/CL ;帶進位循環右移循環移位指令的操作數形式與移位指令相同,按指令功能設置進位標志CF,但不影響SF、ZF、PF、AF標志演示演示演示演示應用:32位數據移位;將DX.AX中32位數值左移一位shlax,1rcldx,1DXAXCF0考慮32位數據的右移等操作SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能四、控制轉移類指令控制轉移類指令用于實現分支、循環、過程等程序結構,是僅次于傳送指令的常用指令重點掌握:JMP/Jcc/LOOP/JCXZ
CALL/RET控制轉移類指令通過改變IP(和CS)值,實現程序執行順序的改變1、目標地址的尋址方式相對尋址方式指令代碼中提供目的地址相對于當前IP的位移量,轉移到的目的地址(轉移后的IP值)就是當前IP值加上位移量直接尋址方式指令代碼中提供目的邏輯地址,轉移后的CS和IP值直接來自指令操作碼后的目的地址操作數間接尋址方式指令代碼中指示寄存器或存儲單元,目的地址從寄存器或存儲單元中間接獲得用標號表達用標號表達用寄存器或存儲器操作數表達目標地址的尋址范圍:段內尋址段內轉移——近轉移(near)在當前代碼段64KB范圍內轉移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內轉移——短轉移(short)轉移范圍可以用一個字節表達,在段內-128~+127范圍的轉移代碼段代碼段目標地址的尋址范圍:段間尋址段間轉移——遠轉移(far)從當前代碼段跳轉到另一個代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標地址必須用一個32位數表達,叫做32位遠指針,它就是邏輯地址代碼段代碼段實際編程時,匯編程序會根據目標地址的屬性,自動處理成短轉移、近轉移或遠轉移程序員可用操作符short、nearptr
或farptr
強制成為需要的轉移類型2、無條件轉移指令只要執行無條件轉移指令JMP,就使程序轉到指定的目標地址,從目標地址處開始執行指令操作數label是要轉移到的目標地址(目的地址、轉移地址)JMP指令分成4種類型:⑴段內轉移、相對尋址⑵段內轉移、間接尋址⑶段間轉移、直接尋址⑷段間轉移、間接尋址JMPlabel ;程序轉向label標號指定的地址第2章:無條件轉移指令JMP(jump)JMPlabel
;段內轉移、相對尋址
;IP←IP+位移量
JMPr16/m16 ;段內轉移、間接尋址
;IP←r16/m16
JMPfarptrlabel
;段間轉移、直接尋址
;IP←偏移地址,CS←段地址
JMPfarptrmem
;段間轉移,間接尋址
;IP←[mem],CS←[mem+2]演示演示演示演示演示3、條件轉移指令條件轉移指令Jcc根據指定的條件確定程序是否發生轉移。其通用格式為:
Jcc
label
;條件滿足,發生轉移 ;IP←IP+8位位移量; ;否則,順序執行label是一個標號、一個8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標指令的偏移地址的地址位移label只支持短轉移的相對尋址方式①Jcc指令的分類Jcc指令不影響標志,但要利用標志。根據利用的標志位不同,分成三種情況:⑴判斷單個標志位狀態⑵比較無符號數高低⑶比較有符號數大小
Jcc指令實際雖然只有16條,但卻有30個助記符采用多個助記符,目的是為了方便記憶和使用②判斷單個標志位狀態⑴JZ/JE和JNZ/JNE 利用零標志ZF,判斷結果是否為零(或相等)⑵JS和JNS 利用符號標志SF,判斷結果是正是負⑶JO和JNO 利用溢出標志OF,判斷結果是否產生溢出⑷JP/JPE和JNP/JPO 利用奇偶標志PF,判斷結果中“1”的個數是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE 利用進位標志CF,判斷結果是否進位或借位例題1題目:將AX中存放的無符號數除以2,如果是奇數則加1后除以2問題:如何判斷AX中的數據是奇數還是偶數?解答:判斷AX最低位是“0”(偶數),還是“1”(奇數)。可以用位操作類指令1:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個數據是0,AX就是偶數;否則,為奇數2:將最低位用移位指令移至進位標志,判斷進位標志是0,AX就是偶數;否則,為奇數3:將最低位用移位指令移至最高位(符號位),判斷符號標志是0,AX就是偶數;否則,為奇數例題1解答—用JZ指令實現 testax,01h;測試AX的最低位D0(不用AND指令,以免改變AX)
jz
even;標志ZF=1,即D0=0:AX內是偶數,程序轉移 addax,1;標志ZF=0,即D0=1:AX內的奇數,加1even: shrax,1 ;AX←AX÷2用右移一位的方法實現除以2。例題1解答—用JNC指令實現 movbx,ax shrbx,1;將AX的最低位D0移進CF
jnc
even;標志CF=0,即D0=0:AX內是偶數,程序轉移 addax,1;標志CF=1,即D0=1:AX內的奇數,加1even: shrax,1 ;AX←AX÷2還可用SAR、ROR和RCR指令例題1解答—用JNS指令實現 movbx,ax rorbx,1;將AX的最低位D0移進最高位(符號位SF)
jns
even;標志SF=0,即D0=0:AX內是偶數,程序轉移 addax,1;標志SF=1,即D0=1:AX內的奇數,加1even: shrax,1 ;AX←AX÷2錯誤!循環指令不影響SF等標志ADDBX,0 ;增加一條指令例2判斷是否為字母Y;寄存器AL中是字母Y(含大小寫),則令AH=0,否則令AH=-1 cmpal,’y’ ;比較AL與小寫字母y
jenext
;相等,轉移 cmpal,’Y’ ;不相等, ;繼續比較AL與大寫字母Y
jenext
;相等,轉移 movah,-1 ;不相等,令AH=-1
jmpdone
;無條件轉移指令next: movah,0
;相等的處理:令AH=0done: ……比較無符號數高低無符號數的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標志確定相等(Equal)兩數的高低分成4種關系,對應4條指令JB(JNAE):目的操作數低于(不高于等于)源操作數JNB(JAE):目的操作數不低于(高于等于)源操作數JBE(JNA):目的操作數低于等于(不高于)源操作數JNBE(JA):目的操作數不低于等于(高于)源操作數比較有符號數大小判斷有符號數的大(Greater)、小(Less),需要組合OF、SF標志、并利用ZF標志確定相等與否兩數的大小分成4種關系,分別對應4條指令JL(JNGE):目的操作數小于(不大于等于)源操作數JNL(JGE):目的操作數不小于(大于等于)源操作數JLE(JNG):目的操作數小于等于(不大于)源操作數JNLE(JG):目的操作數不小于等于(大于)源操作數例:求較大值 cmpax,bx ;比較AX和BX
jaenext ;若AX≥BX,轉移 xchgax,bx ;若AX<BX,交換next: movwmax,ax如果AX和BX存放的是有符號數,則條件轉移指令應采用JGE指令例:求較大值(另解) cmpax,bx ;比較AX和BX
jae
next movwmax,bx ;若AX<BX,wmax←BX
jmp
donenext: movwmax,ax ;若AX≥BX,wmax←AXdone:
……3、循環指令一段代碼序列多次重復執行就是循環8088設計有針對CX計數器的計數循環指令
LOOPlabel ;循環指令 ;首先CX←CX-1;然后判斷;若CX≠0,轉移
JCXZlabel ;為0循環指令 :如果CX=0,則轉移label操作數采用相對短尋址方式還有LOOPZ/LOOPE和LOOPNZ/LOOPNE兩條指令deccxjnzlabel?通常的循環控制
MOVCX,NBEGIN:….….….循環體DECCXJNZBEGINLOOPBEGIN有了LOOP指令,程序得到簡化例:在100個字符構成的字符串中尋找第一個$字符。(在循環出口處可以根據ZF標志和CX寄存器的值來確定是否找到以及該字符的位置)MOVCX,100MOVSI,0FFFH;假設字符串從偏移地址1000H處開始存放NEXT:INCSICMPBYTEPTR[SI],’$’LOOPNZNEXT
?注意,上面程序段中ZF標志是由CMP指令設置的,而與CX減1動作無關。五、串操作指令串指令可以對字節或字串進行操作。所有串操作指令都默認對DS段中用SI指定的源操作數及ES段中用DI指定的目的操作數尋址,可用段超越前綴改變。串操作指令執行時,由標志位DF決定地址指針的修改方向。當DF=1時作減量修改;當DF=0時作增量修改。因此,在串操作指令執行前,需對SI、DI和DF進行設置。使用串操作指令一般要加重復前綴。每一條指令即是一段循環程序,可以被中斷。串操作指令是唯一的一類源操作數和目的操作數都為存儲器單元的指令。1、字符串傳送指令串傳送指令MOVSB/MOVSW其功能是把位于DS段由SI指定的內存單元的字節數據或字數據傳送到ES段由DI指定的內存單元。指令不影響狀態標志位。例:把DS段1000H起始的100個字節的內容傳送到ES段2000H起始的內存中。MOVSI,1000HMOVDI,2000HMOVCX,100CLD;DF=0REPMOVSB;(SI)(DI)SI+1SIDI+1DICX-1≠0,繼續傳送重復前綴串比較指令CMPSB/CMPSW其功能是比較DS和ES段中相對應的內容,可以通過重復前綴指明比較兩段是否完全相同或不同,找出第一個相等或不相等的字符。重復前綴:相同重復:REPZ不相同重復:REPNZ2、字符串比較指令例:MOVSI,2050HMOVDI,3000HMOVCX,20CLDREPZCMPSB;JNZNEQ;....NEQ:(SI)與(DI)相比,如ZF=1繼續比較。(SI)+1、(DI)+1,(CX)-1,當CX=0或ZF=0時,停止比較。(CX=0不影響ZF)
編程比較從邏輯地址2000H:100H開始的10個字節與邏輯地址4000H:200H開始的10個字節是否對應相等,相等則轉DONE。MOVAX,2000HMOVDS,AXMOVAX,4000HMOVES,AXMOVDI,200HMOVSI,100H
CLDMOVCX,10REPZCMPSBJZDONERETDONE┇例:判斷是否加電成功
MOVSI,0E2DHMOVDI,0400HCLDMOVCX,0004REPZCMPSBJZDONERET……DONE:04000E2D12233445XXXXXXXXRAMROM3、字符串搜索指令SCAS串搜索指令SCASB/SCASW其功能是把AL或AX中的內容與ES段由DI指定的一個字節數據或字數據進行比較,尋找與AL或AX內容相等或不相等的數據。例:MOVDI,2000HMOVAL,FFHMOVCX,1000HCLDREPNZSCASB;JZEXC;....EXC:AL與(DI)相比,如ZF=0繼續比較。(DI)+1,(CX)-1,當CX=0或ZF=1時,停止比較。(CX=0不影響ZF)從邏輯地址9000H:100H開始的10個單元中如果有一個單元的內容為2CH,則BX加1。MOVAX,9000HMOVES,AXMOVDI,100HCLDMOVCX,10MOVAL,2CHREPNZSCASBJNZAAA1INCBXAAA1:┇
4、取字符串指令取字符串指令LODSB/LODSW其功能是把位于DS段由SI指定內存單元的內容取到寄存器AL或AX中。指令不影響狀態標志位。一般不用重復前綴,可自動改變地址。舉例:將100H:20H單元開始的10個字節的內容均加5。
CLDMOVCX,10MOVAX,100HMOVDS,AXMOVSI,20HLL1:LODSBADDAL,5MOV[SI-1],ALDECCXJNZLL1HLT
5、存字符串指令存字符串指令STOSB/STOSW其功能是把寄存器AL或AX中的內容存到ES段由DI指定的內存單元。指令不影響狀態標志位。可用重復前綴。例:MOVDI,2300HCLDMOVCX,100HXORAX,AXREPSTOSW六、子程序指令子程序是完成特定功能的一段程序當主程序(調用程序)需要執行這個功能時,采用CALL調用指令轉移到該子程序的起始處執行當運行完子程序功能后,采用RET返回指令回到主程序繼續執行演示
轉移指令有去無回子程序調用需要返回,其中利用堆棧保存返回地址1.子程序調用指令CALLCALL指令分成4種類型(類似JMP)CALLlabel
;段內調用、直接尋址CALLr16/m16
;段內調用、間接尋址CALLfarptrlabel
;段間調用、直接尋址CALLfarptrmem
;段間調用、間接尋址CALL指令需要保存返回地址:段內調用——入棧偏移地址IPSP←SP-2,SS:[SP]←IP段間調用——入棧偏移地址IP和段地址CSSP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.子程序返回指令RET根據段內和段間、有無參數,分成4種類型RET
;無參數段內返回RETi16
;有參數段內返回RET
;無參數段間返回RETi16
;有參數段間返回需要彈出CALL指令壓入堆棧的返回地址段內返回——出棧偏移地址IPIP←SS:[SP],SP←SP+2段間返回——出棧偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2例、十六進制轉換為ASCII碼的子程序;子程序:將DL低4位的一位16進制數轉換成ASCII碼htoasc proc anddl,0fh ;只取DL的低4位 ordl,30h ;DL高4位變成3 cmpdl,39h ;是0~9,還是0Ah~0Fh? jbehtoend ;是0~9,轉移 adddl,7 ;是0Ah~0Fh,加上7htoend: ret ;子程序返回htoasc endp轉換原理;主程序:調用子程序movdl,28hcallhtoasc3、中斷指令和系統功能調用中斷(Interrupt)是又一種改變程序執行順序的方法中斷指令有3條:
INTi8IRETINTO本節主要掌握類似子程序調用指令的中斷調用指令INTi8,進而掌握系統功能調用七、處理器控制類指令處理器控制類指令用來控制CPU的狀態,使CPU暫停、等待或空操作等NOP ;空操作指令,等同于“xchgax,ax”指令SEG: ;段超越前綴指令:CS:,SS:,DS:,ES:HLT ;暫停指令:CPU進入暫停狀態還有其他指令: LOCKESCWAIT標志操作指令STC;CF=1STD;DF=1STI;IF=1CLC;CF=0CLD;DF=0CLI;IF=0CMC;CF取反第2章:總結本章展開了8088CPU16位指令系統的常用指令希望大家就如下幾個方面進行一下總結:操作數尋址方式和目的地址尋址方式指令支持的操作數形式常用指令的助記符和功能指令對標志的影響通過復習整理,形成指令系統的整體概念,進而掌握常用指令指令執行第3章:習題1.8086常用的尋址方式有哪些?哪幾種尋址方式的指令執行速度快?2.如在指令中不具體指明段寄存器,那么段地址如何確定?3.假設DS=3000H,BX=0870H,SI=010CH,d=45h以MOV指令為例,寫出各種尋址方式下的指令形式,并求出數據的有效地址和物理地址。4.請指出下列指令中源操作數的尋址方式
⑴MOVSI,120⑵MOVBP,[BX]⑶MOVAX,CX⑷POPBX⑸ANDDL,[BX+SI+30H]⑹XCHGAL,BUF5.請指出如下程序段中每條邏輯指令執行后標志ZF、SF和PF的狀態MOVAL,0AHANDAL,0FHORAL,4BHXORAL,AL6.判斷指令的對錯,說明錯誤指令出錯原因⑴MOV[SP],BX⑵MOVCX,BX⑶JMPBX⑷XCHG[SI],WED⑸SHLAX,CX
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年老年人護理專業資格考試試題及答案
- 2025年軍事理論課程考核試卷及答案
- 2025年歷史學教師資格考試試題及答案
- 2018年全國高聯B卷二試答案
- 品牌酒店合同協議
- 戀愛終止協議合同書范本
- 櫥柜供應商合同協議
- 商家聯盟合作合同協議
- 正規臨時用工協議書范本
- 民俗園生意轉讓合同協議
- 2025年wset二級試題及答案
- 《ITIL學習分享》課件
- 2024-2025學年人教版(2024)七年級英語下冊Unit 6 rain or shine Section A 2a-2e 教案
- 《東巴常用字典》東巴文-字典
- 2025年廣東順德控股集團招聘筆試參考題庫含答案解析
- 2025年陜西延長石油集團招聘筆試參考題庫含答案解析
- 《凝結水精處理》課件
- 噢易教育桌面云解決方案
- 執行立案申請書模版
- 大學答題紙模板
- 福建省寧德福鼎市2024-2025學年七年級上學期期中考試語文試題
評論
0/150
提交評論