第三章指令(第二講)_第1頁
第三章指令(第二講)_第2頁
第三章指令(第二講)_第3頁
第三章指令(第二講)_第4頁
第三章指令(第二講)_第5頁
已閱讀5頁,還剩119頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第二節8086/8088的指令系統數據傳送指令算術運算指令邏輯運算、移位、循環指令串操作指令控制轉移指令處理器控制指令指令的功能——該指令能夠實現何種操作。通常指令助記符就是指令功能的英文單詞或其縮寫形式指令支持的尋址方式——該指令中的操作數可以采用何種尋址方式指令對標志的影響——該指令執行后是否對各個標志位有影響,以及如何影響其他方面——該指令其他需要特別注意的地方,如指令執行時的約定設置、必須預置的參數、隱含使用的寄存器等學習指令的注意事項

數據傳送指令可以實現CPU的內部寄存器之間,CPU和存儲器之間,CPU和I/O端口之間的數據傳送。這類指令均含兩個操作數,而且除SAHF指令和POPF指令外,其它的指令均不影響狀態標志位中。3.2.1數據傳送類指令通用數據傳送指令(DataTransfer)1.基本傳送指令(MOV)

MOVdst,src;(src)←(dst)src:通用寄存器、段寄存器、存儲器操作數、立即數;dst:通用寄存器、段寄存器、存儲器操作數。

功能:將源操作數src復制到目的操作數dst中,結果目的操作數的內容等于源操作數的內容,源操作數src的內容不變。1)寄存器之間傳送

MOVAL,BL;通用寄存器之間MOVAX,DX;MOVAX,ES;通用寄存其與段寄存器MOVDS,AX;3)立即數送寄存器或存儲器

MOVAL,0FH;立即數送通用寄存MOV[BP+SI],2300H;立即數送存儲器2)寄存器和存儲器之間傳送

MOVAL,[BX];通用寄存器和存儲器之間MOV[BX+DI],DX;MOV[BX],ES;段寄存器和存儲器之間MOVDS,50H[BP+SI];(1)dst與src必須類型匹配,即同時是字節或字類型;(2)兩個操作數不允許同時為存儲器操作數;(3)不允許使用CS段寄存器作目的操作數;(4)兩個操作數不允許同時為段寄存器;(5)不允許使用立即數作目的操作數;(6)不允許直接向段寄存器中傳送立即數。

使用MOV指令應注意以下幾點:例:錯誤的MOV指令如下所示:MOVBL,AX;類型不匹配MOVDS,1000H;不允許立即數送段寄存器MOV[BX],[SI];不允許內存操作數之間傳送MOVES,CS;不允許段寄存器之間傳送MOVCS,AX;CS不能作為目的操作數

存儲單元

段寄存器DS、ES、SS

通用寄存器

立即數8位、16位

段寄存器CS(MOV)數據傳送示意圖堆棧是一個按“后進先出”原則操作的主存區域(暫存數據與地址),堆棧操作必須在SS段寄存器指向的堆棧中進行;堆棧只有一個出口,即當前棧頂;用堆棧指針寄存器SP指定。堆棧只有兩種基本操作:進棧和出棧。對應兩條指令:

PUSHsrc

POPdst2.堆棧操作指令

PUSHPOP堆棧作用:在調用一個過程時,保存返回地址;暫時存放寄存器或存儲器單元操作數的內容。

CPU通用寄存器入/出棧(PUSH/POPreg)

例如:PUSHAXPOPBX

段寄存器入/出棧(PUSH/POPsreg)

例如:PUSHCSPOPDS(CS除外)存儲器單元入/出棧(PUSH/POPmem)

例如:PUSH[BX+DI]POP[2000H]

入棧和出棧指令都有3種格式:(1)入棧指令PUSH指令操作:

①使堆棧指針SP減2;

②將一個字操作數存入堆棧頂部:((SP))←低8位數,((SP+1))←高8位數例PUSHAX

若已知(AX)=1234H,(SS)=1050H,(SP)=000EH則指令操作為:(SP)=(SP)-2=000CH;棧頂的PA=(SS)×16+(SP)=1050CH②

(AX)的內容1234H存入堆棧,指令操作后,堆棧情況如圖:1050EH1050DH(SP)→1050CH12H34H原棧頂現棧頂(2)出棧指令POP指令操作:

①把棧頂的一個字彈出送至指定的目的操作數;

②然后堆棧指針SP加2。如在上例完成后,執行POPDS指令:1050CH1050DH(SP)→1050EH12H34H1234

(DS)出棧后的SP和SS的值SP=000EHSS=1050HSS=1050H(不變)通過PUSH和POP命令可以實現數據的傳送,但要注意堆棧先進后出的原則。8086通過賦值SS和SP建立堆棧建棧

MOVAX,1050HMOVSS,AXMOVSP,000EH

1050EH

10500H初始棧頂SP=000EHSS=1050H堆棧起地址建棧后SP和SS的值SP=000EHSS=1050H高低堆棧的特點與注意問題①堆棧操作指令中,目的操作數是隱含的,這個操作數就是(SP)指示的棧頂存儲單元。

②8086堆棧操作都是字操作,而不允許對字節操作,例如PUSHAL是錯誤的。③每執行一條入棧指令,(SP)自動減2,入棧時,高位數先入棧;執行彈出時,正好相反,每彈出一個字,(SP)自動加2。④CS寄存器可入棧,但不能隨意彈出一個數據到CS。⑤在使用堆棧操作保存多個寄存器內容和恢復多個寄存器時,要按“先進后出”原則來組織入棧和出棧的順序。

⑥堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數據,如:MOVAX,[BP]。指令格式:XCHGoprd1,oprd2;指令功能:交換oprd1與oprd2的內容3.交換指令XCHG(Exchange)寄存器與寄存器之間交換數據寄存器與存儲器之間交換數據。例如:

XCHGBL,CL;(BL)與(CL)間進行字節交換

XCHG(BX+SI),DX;(DX)與采用基址變址尋址方式尋址的字地址內容進行字交換(1)不能在存儲器與存儲器之間對換數據;(2)任一個操作數都不能是段寄存器,也不能使用立即數。(3)兩操作數類型必須一致。

指令格式:XLAT;AL←((BX)+(AL))指令功能:BX指定的內存表格的首地址、AL指定的序號處一個字節的表數據取出賦給AL查表范圍:255個字節;以BX為表基地址,則表存放在數據段,以DS為段基址;XLAT指令有兩種格式——帶或不帶表首地址。4.換碼指令(查表指令)例求數字0~9對應的7段顯示代碼:方法:先建立表格如圖示,并將表首地址送BX中。取待查表項于AL中,再用查表指令求得對應的7段顯示代碼。程序段如下:TABLEDB40H,79H,24H,30H,19HDB12H,02H,78H,00H,18HMOVBX,TABLEMOVAL,6XLATTABLETABLE40792430191202780018地址傳送指令1.取有效地址指令LEA

(LoadEffectiveAddres)格式:LEAdst,src;功能:將存儲器操作數SRC的有效地址送至指定的16位通用寄存器。例如:

LEASP,[0502H];執行后,使堆棧指針(SP)=0502HLEABX,[BP+SI];執行后,BX中為(BP)+(SI)的值地址傳送指令是用來對地址進行傳送。這類指令傳送到16位目標寄存器中的是存儲器操作數的有效地址EA。LEA指令與MOV指令的區別:LEASI,BUFF指令是將標號BUFF的偏移地址送入寄存器中;MOVSI,BUFF指令是將標號BUFF所指存儲單元的內容送入SI。LEASI,BUFF;執行后:(SI)=0002HMOVSI,BUFF;執行后:(SI)=0048HBUFF=若(DS)=2000H,BUFF=02H,存儲區內容如圖,則:0120002H4800FEFF20003H20004H20005H20001H20000H2.雙字地址指針送DS和寄存器指令格式:LDSdst,src;功能:將源操作數src指定的4個連續字節單元內容(地址指針)分別送入指令指定的寄存器dst及DS中。其中:低16位送到dst,高16位送到DS。3.雙字地址指針送ES和寄存器指令格式:LESdst,src;功能:將源操作數指src定的4個連續字節單元內容(地址指針)分別送入指令指定的寄存器dst及ES中。其中:低16位送到dst,高16位送到ES。使用LDS和LES指令時應注意:(1)指定的寄存器dst,不能是段寄存器;(2)src一定是存儲器操作數。例:若已知(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H57H13H68H24HC2480HC2481HC2482HC2483HLDSSI,[2480]13572468SIDSLDSSI,[2480]狀態標志傳送指令通過這類指令讀出當前標志寄存器中各狀態位的內容,也可以對標志寄存器的狀態設置新的值。這類指令共有4條,均為單字節指令,源操作數和目的操作數都隱含在操作碼中。指令格式:1.LAHF;(AH)←(F的低8位)2.SAHF;(F的低8位)←(AH)3.PUSHF;(SP)←(SP)-2,((SP)+1,(SP))←(F)4.POPF;(F)←((SP)+1,(SP)),(SP)←(SP)+2OF1115DF10IF9TF8SF7ZF65AF43PF21CF0FLAGS說明:

①LAHF/SAHF指令是寄存器AH與標志寄存器F的低字節之間完成的字節型數據傳送。

②PUSHF/POPF指令是標志寄存器F與堆棧間進行的字型數據傳送。

③指令SAHF/POPF將影響標志位。例輸入輸出指令1)、直接尋址

INAL,nOUTn,ALINAX,NOUTN,AX尋址空間為:0~255字節INAL,20HINAX,30HOUT46H,ALOUT80H,AX例2)、間接尋址

INAL,DXOUTDX,ALINAX,DXOUTDX,AX尋址空間為:0000H~FFFFHMOVDX,1000HINAL,DX

INAX,DXOUTDX,AL§數據傳送類指令練習指出下列指令中的非法指令?

MOVBX,AL(2)MOVBH,ALMOV100,CL(4)MOVCL,100MOVSS,2400H(6)XCHGAH,ALMOVAL,AL(8)XCHG200,ALOUT21H,AL(10)OUT21H,AH(11)OUT260H,AL(12)MOV[BX],BX(13)MOV[AX],CX(14)MOV[BX],BL

(1)、(3)、(5)、(7)、(8)、(10)、(11)、(13)為非法指令算術運算類指令用來執行二進制的算術運算:加、減、乘、除。算術運算指令的特點有:1)在加、減、乘、除基本運算指令中,除±1指令外,都具有兩個操作數;2)這類指令執行后,除±1指令不影響CF標志外,對CF,OF,ZF,SF,PF和AF等6位標志均可產生影響,3-2-2算術運算指令加法運算指令1.加法指令(ADD)指令格式:ADD

dst,src

;dst←dst+src標志寄存器:影響AF、CF、PF、OF、ZF、SF目的操作數:通用寄存器、存儲器;

源操作數:通用寄存器、存儲器、立即數;操作數類型:字或字節注意點:兩操作數必須類型一致;兩操作數不能同時為存儲器操作數。

例:

ADDAX,0F0F0H,設指令執行前(AX)=5463H;

(AX)=0101010001100011+、1111000011110000[1]0100010101010011→AX

進位執行后,結果(AX)=4553H,且CF=1,ZF=0,SF=0,OF=02.帶進位加法指令(AddwithCarry

)指令格式:ADCdst,src

標志寄存器:影響OF、CF、SF、ZF、AF、PF;

目的操作數:通用寄存器、存儲器;源操作數:通用寄存器、存儲器、立即數;操作數類型:字或字節用法:

多字節數相加例:有兩個4字節無符號數放在2000H和3000H單元中,低位在前,高位在后,將兩個數相加,結果放2000H開始的單元中。

10008432H+20007F00H=?1).算法分析:1).可以將兩個4字節無符號數相加看成2個字相加;2).兩個數的低位字相加后,將可能產生進位CF;3).高位字相加,應再加上進位位;

2000H3000H32840010007F0020SIDI2).程序:

CLC ;清進位MOVSI,2000H ;取第一個數的首地址MOVAX,[SI] ;第一個數的低16位送到AXMOVDI,3000H ;取第二個字的首地址ADDAX,[DI] ;第一個數和第二個數相加MOV[SI],AX ;送低16位結果倒2000H單元MOVAX,[SI+2] ;第二個數的高16位送AXADCAX,[DI+2] ;高16位數據相加MOV[SI+2],AX3.加1指令

INC(Increment)指令格式:INCdst指令功能:dst←dst+1標志寄存器:影響OF、SF、ZF、AF、PF;

操作數:8位/16位通用寄存器或存儲器;INCCX;將CX的內容加1后再送回CX中。INCBYTEPTR[BX+100H];將(BX)+100H所指的單元內容加1后,送回此單元。注意:指令不影響CF標志,當用INC指令進行循環計數,試圖以判斷CF=1結束循環,是達不到目的的,而且還會導致程序運行進入死循環1.減法指令(

Subtract

)指令格式:SUB

dst,src

;dst←dst+src標志寄存器:影響AF、CF、PF、OF、ZF、SF目的操作數:通用寄存器、存儲器;

源操作數:通用寄存器、存儲器、立即數;注意點:兩操作數必須類型一致;兩操作數不能同時為存儲器操作數。

減法類指令SUBAX,BX;AX內容減去BX中的內容,結果在AX中SUBSI,[DI十100H];SI內容減法(DI)+100H和(DI)+101H所指的兩單元內容,結果在SI中;例:SUBWORDPTR[DI],1000H;(DI)所指的字單元;中的16位數減去立即數1000H,結果在字單元中SUB[BP+2],CL;將SS段中的(BP)+2所指的單元;內容,減去CL內容,結果在堆棧的該單元中。SUBSI,SI

;SI=0

;OF=0,SF=0,ZF=1,PF=1,CF=0

;寄存器自減清零2.帶借位的減法指令(SubtractwithBorrow

指令格式:SBBdst,src;dst←dst-src-CF

指令功能:SBB指令將目的操作數減去源操作數,再減去借位CF(進位),結果送到目的操作數。

SBB指令與ADC指令一樣,主要用于與SUB配合,實現多字節減法運算。

例如:SBBAX,2010H的運算為:(AX)←(AX)-2010H-(CF)

3.減1指令(DEC)指令格式:DECdst;dst←dst-1減1指令只有1個操作數dst,和INC指令類似,dst可為寄存器或存儲器單元。DECCX;CX內容減1后,送回CX;

DECBYTEPTR[DI+2];將(DI)+2所指字節單元內容減1后,送回該單元。需要注意的是:DEC指令和INC指令一樣,執行后對CF不產生影響。4.求補指令NEG指令格式:NEGdst;dst←0-dst指令功能:

對操作數執行求補運算,即用零減去操作數,然后結果返回操作數;或表示為將操作數按位取反后加1。標志寄存器:影響AF、PF、OF、ZF、SF,CF=1;

操作數:8位/16位通用寄存器或存儲器。例:MOVAH,5NEGAH;AH=11111011B,是-5(補碼)MOVAX,-6(FFFAH)NEGAX;AX=0006H,是+6

注意點:連同符號一起求補,稱為變補。NEG應用舉例設在內存中從AREA1開始存放有100個帶符號數,現需要將這些數的絕對值存放在以AREA2開始的內存中;開始初始化置源地址,置目的地址指針置循環次數取一個帶符號數負數?求補送存地址指針+1循環次數-1循環次數=0?結束NYNY5.比較指令CMP

(Compare)

指令格式:CMPdst,src;dst-src指令功能:

CMP指令執行的功能與SUB指令類似,但結果不回送目的操作數,只是使結果影響標志位。標志寄存器:OF,SF,ZF,PF和CF;

操作數:8位/16位通用寄存器或存儲器用法:由受影響的標志位狀態便可判斷兩操作數比較的結果。比較指令執行后目的-源(N1-N2)各標志位的情況

1)N1=N2CFZFSFOF01002)無符號數N1>N200--N1<N210--3)

帶符號數N1<N2-010N1<N2-001N1>N2-000N1>N2-011關注ZF關注CF關注SF和OF乘法指令乘法指令中有兩個操作數,其中一個是隱含固定在AL或AX中。1.無符號數的乘法指令MUL(Multiply

)指令格式:

MULsrcAL操作數AHAL(8位)(8位)(16位)AX操作數DXAX(16位)(16位)(32位)例如:MULBL;AL中和BL中的8位數相乘,乘積在AX中;MULCX;AX中和CX中的16位數相乘,乘積在DX和

;AX中;MULBYTEPTR[DI];AL中和(DI)所指的字節單元;中的8位數相乘,乘積在AX中MULWORDPTR[SI];AX中和(SI)所指的字單元中的

;16位數相乘,結果在DX中標志寄存器:字節乘:若乘積高8位AH不為0,則CF=OF=1,若乘積高8位AH=0,則CF=OF=0;字乘:若乘積高16位DX不為0,則CF=OF=1,若乘積高16位DX=0,則CF=OF=0;操作數:可以是通用寄存器、存儲器,不能是立即數。指令格式:

IMULsrc符號數乘法指令指令功能:IMUL指令和MUL指令在功能和格式上類似,只是要求兩個乘數均必須為帶符號數。例如:IMULAX;AX中和AX中的16位帶符號數自乘,;結果在DX和AX中IMULBYTEPTR[BX];AL中和(BX)所指的字節單元中的

;8位帶符號數相乘,結果在AX中標志寄存器:若乘法結果AH或DX包含有效值,則OF=1、CF=1,

若乘法結果AH或DX只是低半部分的符號擴展,則OF=0、CF=0

2.帶符號數的乘法指令(IntegerMultiply)例:比較無符號數和帶符號數乘法指令設指令執行前:(AL)=A4H(BL)=12H(A4H)無符號數帶符號數164D-92D(12H)無符號數帶符號數18D

18D執行IMUL后:(AX)=F988H=-1656DCF=1,OF=1執行MUL后:(AX)=0B88H=2952D CF=1,OF=1IMUL BLMUL BL除法指令(Division)

除法指令有兩個操作數,其中被除數隱含固定在AX中(除數為8位時)或DX,AX中(除數為16位時)。

1.無符號數除法指令

DIVsrc

指令格式:DIVsrc

無符號除法指令

指令功能:字節除:AL(商)←(AX)/(src),余數在AH中,

字除:

AX(商)

←(DX、AX)/(src),余數在DX中。

若除數為0,或商超過AL(字節除)或AX(字除)所能存放的最大值(FFH或FFFFH)時,系統會自動產生0類(除法除出錯)中斷,且商和余數都不確定。

指令格式:IDIVsrc指令功能:字節除:AL(商)←(AX)/(src),余數在AH中,字除:AX(商)←(DX、AX)/(src),余數在DX中。IDIV指令用于兩個帶符號數相除,其功能和對操作數長度的要求和DIV指令類似,本指令執行時,將被除數、除數都認作帶符號數。注意:余數的符號和被除數的符號相同。當商超過AL或AX所能存放的范圍值-128~+127(字節除)或-32768~+32767(字除),時,系統會自動產生0(除法錯)類中斷。指令執行后不產生有效標志2.帶符號數的除法指令IDIV3.將字節擴展成字的指令CBW(ConvertBytetoWord

指令系統要求被除數長度是除數的兩倍,若不滿足可將被除數擴展,字節擴展指令用于對帶符號數的擴展。指令格式:CBW指令功能:將AL寄存器中的符號位擴展到AH中,從而使AL中的8位數據擴展成為AX中的16位數。注意:符號擴展雖然使數據位數加長,但數據大小并沒有改變,擴展的高部分僅是低部分的符號擴展。應用:遇到兩個帶符號的字節數相除時,應先執行CBW指令,產生一個雙倍長度的被除數,否則,不能正確執行除法操作。CBW執行后,不影響標志位。指令格式:

CWD(ConvertWordtoDoubleWord

)指令功能:將AX中數的符號位擴展到整個DX中。CWD指令和CBW一樣,用于帶符號數擴展,其功能是將AX寄存器中的符號位擴展到DX中,從而得到(DX),(AX)組成的32位雙字。例:MOVAL,-16;AL=0F0H(-16)

CBW;AX=0FFF0H(-16)

CWD;DXAX=0FFFFFFF0H(-16)

IDIVBX;DX←余數,AX←商4.將字擴展成雙字的指令CWD70AL70AH015AXDX150CBWCWD字節擴展到字指令CBW和字擴展到雙字CWD示意圖:例:如果在內存中有一個緩沖區BUFFER,如果前兩個字節為一個16位帶符號的被除數,第3,4字節為一個帶符號的除數,第5,6字節放結果的商,7,8字節放余數。 則: LEABX,BUFFER ;偏移量到BX MOVAX,[BX] ;BX指向內容(被除數)到AX CWD ;符號擴展 IDIV[BX+2] ;16位帶符號除法 MOV[BX+4],AX ;商到BUFFER+4地址處 MOV[BX+6],DX ;余到BUFFER+6地址處指令格式:DAA(DecimalAdjustforaddition)指令功能:DAA指令用于對壓縮的BCD碼相加的結果進行調整,使結果仍為壓縮的BCD碼。標志寄存器:影響CF、SF、ZF、AF、PF;

調整方法:指令執行時,先對相加結果進行測試,若低4位(或高4位)大于9(非法碼)或產生進位CF或輔助進位AF時,DAA自動對低4位(或高4位)進行加6的調整。注意點:因調整是在AL中進行,因此加法運算后,必須把結果放在AL中;BCD碼運算時,必須用調整指令。1.加法十進制調整指令十進制調整指令2.十進制減法調整指令(DAS)

指令格式:DAS

指令功能:對在AL中的兩個壓縮型BCD數相減的結果,調整成正確的壓縮型BCD數在AL中;

用法:DAS與DAA對加法結果進行調整的作用相似,不同的是DAS對結果是進行減6的調整。該指令執行后,對AF,CF,PF,SF和ZF均產生影響,但OF沒有意義。3.非壓縮的十進制數加法調整指令指令格式:AAA(unpackedBCD[ASCII]adjustforaddition

)指令功能:AL←對AL中的加法結果調整為非壓縮BCD碼AH←AH+調整的進位AAA指令用于對非壓縮BCD碼相加結果進行調整,調整操作仍在AL中進行,調整后的結果在AX中。

4.非壓縮十進制數減法調整指令(AAS)指令格式:AAS指令功能:AAS指令用于對非壓縮BCD碼相減結果進行調整,也是緊跟在減法指令之后,調整后的結果仍為非壓縮的BCD碼。

AAS指令執行后,只影響AF,CF特征,而OF,PF,SF和ZF都沒有意義。指令格式:

AAM指令功能:AAM指令用于對8位的非壓縮BCD碼的乘積AX內容進行調整。調整后的結果仍為一個正確的非壓縮BCD碼,放回AX中。其中高位非壓縮型BCD數在AH中,低位非壓縮型BCD數在AL中;

標志寄存器:對PF,SF,ZF產生影響,對OF,AF和CF無意義。注意點:AAM緊跟在乘法指令之后,因為BCD碼總是當作無符號數看待,所以對非壓縮BCD相乘是用MUL指令,而不是用IMUL指令。5、非壓縮十進制乘法調整指令例

求09X04的程序段為:MOVAL,09MOVCL,04;MULCL;(AL)X(CL)→(AX)=24HAAM;結果:(AH)=03H,(AL)=06H壓縮BCD碼相乘后,對所得結果無法調整,因此8086指令系統沒有提供對壓縮BCD碼乘法的調整指令。指令格式:AAD指令功能:用在兩位非壓縮型BCD數在相除之前,將AX中存放的非壓縮BCD碼表示的十進制數調整為二進制數。使得兩個未壓縮的十進制數相除之后可得到非壓縮的BCD數結果,商在AL中,余數在AH中;標志寄存器:影響PF、SF、ZF。

注意點:該指令必須放在除法指令之前。對十進制數進行除法運算時,和乘法一樣,要求除數、被除數都用非壓縮的BCD碼,否則,不能進行調整。6.非壓縮十進制除法調整指令例:要實現0103÷06=02余01,程序段如下:MOVAX,0103H;取被除數MOVBL,06;取除數AAD;調整為:(AX)=000DHDIVBL;相除,得商(AL)=02,余數(AH)=13-2-3、邏輯運算指令、移位指令8086的邏輯運算指令包括AND(與),OR(或),XOR(異或),TEST(測試)和NOT(非)5條指令。

特點:

①按位操作,②根據結果設置SF、ZF和PF狀態,而對AF未定義;③操作數與ADD、SUB等一樣

目的操作數:通用寄存器、存儲器源操作數:通用寄存器、存儲器、立即數

兩操作數不能都是存儲器操作數

④單操作數邏輯指令NOT不影響標志位邏輯運算邏輯指令:TESTsrcdstNOTANDORXOR0010000100111010111101101.邏輯“與”運算AND指令格式:ANDdst,src指令功能:dst←dst∩src標志寄存器:影響SF、ZF、PF,OF=0、CF=0,AF不確定

用AND指令可對指定位或指定的一些位進行屏蔽(清零)。

例如:ANDAL,0FH;將AL中的高4位清零

0FH稱為屏蔽字,屏蔽字中的0對應于需要清0的位。

2.邏輯或運算OR

指令格式:ORdst,src

指令功能:dst←dst∨src其余同AND指令

用OR指令可對一些指定位置1。例如:ORAL,80H可將AL中的最高位置1,其他位保持不變。3.邏輯非運算NOTNOTreg/mem;reg/mem←reg/mem標志寄存器:不影響;操作數:通用寄存器、存儲器,指令功能:按位取反,原來是“0”的位變為“1”;原來是“1”的位變為“0”指令格式:例如:

NOTBX;(BX)變反碼,結果送回BX中;

NOTBYTEPTR(1000H);將1000H單元中內容變反碼后,;送回1000H單元

4.邏輯異或指令XOR

指令格式:XORdst,src;dst←dst⊕src用法1:XORAX,AX在清CF和影響SF,ZF,PF的同時,也清除AX本身用法2:用XOR指令可以比較兩個操作數是否相同。例如:XORAL,3CH,若執行后,ZF=1,說明(AL)=3CH,否則,就不等于3CH;用法3:通過XOR指令用“1”與某數的對應位異或,可將該位取反,用“0”與某數的對應位異或,可將指定位不變;

其他與AND、OR指令相同例如:XORAL,0FH若指令執行前(AL)=3AH,其操作結果為00111010⊕0000

111100110101執行后,(AL)=35H

4.測試指令TEST

TEST指令和AND指令執行同樣的操作,對兩個操作數執行邏輯與運算,結果并不送目的操作數,僅按AND指令影響標志。TESTdest,src ;dest∧src

AND與TEST指令的關系,同SUB與CMP指令的關系一樣注意點:TEST指令執行后,目的操作數的值保持不變。TEST指令一般用來檢測指定位是1還是0TESTAL,80H;測AL的最高位D7是否為1,——由此可判正、負數;TEST[BX],01H;測(BX)所指存儲單元的最低位D0是否為1,若是,ZF=0,否則ZF=1由此可判斷該數是奇數,還是偶數例、使AL中的數,第0、1位取反。MOVAL,51H;送操作數XORAL,03H;送特征數00000011HLT;暫停

01010001(AL)

XOR0000001101010010例、測試AL中的第0、1、2位是否為零。MOVAL,40HTESTAL,07H;測AL的0、1、2位HLT

01001000AND0000011100000000邏輯指令小結AND指令用于對一個數據的指定位清零OR指令用于對一個數據的指定位置1NOT指令用于取反碼,再加一,得補碼XOR指令用于對寄存器清零TEST指令用于測試一個數據的指定位是1還是0SHLdst,count;邏輯左移SHRdst,count;邏輯右移SALdst,count;算數左移SARdst,count;算數右移CML00MLCCML0MLC非循環移位指令注意:移位指令影響標志位CF、OF、PF、SF和ZF。如果只移一位,指令中用1指出移位的位數,如果超過1位,必須用CL預先指明移位的位數。例1:SALDX,1;DX中的數左移1位MOVCL,4SALAX,CL;AX中的數左移4位SHLAL,CL;SHRAL,CL;AL中的數右移4位例2、將兩個非壓縮BCD碼(高位存BL,低位存于AL中),轉換成一個壓縮的BCD碼,存于AL中。0000****BL0000****ALOR****0000BL

SHL程序段:MOVCL,4SHLBL,CLORAL,BLHLT例2、將AX中的內容乘以10。左移一位,乘以2;右移一位,除以2。程序段:MOVBX,AXMOVCL,2SHLAX,CL;左移2位,乘以4ADDAX,BX;AX為原來5倍SHLAX,1;AX為原來的10倍HLT循環移位指令ROLdst,count;左小循環RORdst,count;右小循環RCLdst,count;左大循環RCRdst,count;右大循環例1、ROLAL,1AL:1001000100100011例2、MOVCL,2ROLBH,CLBH:10101111

10111110算術、邏輯移位可用于:改變數據二進制位的位置(丟失移出的位)二進制的整次冪的乘法(左移)、除法(右移)算術移位用于帶符號數操作邏輯移位用于無符號數操作循環移位可用于:改變數據二進制位的位置(不丟失移動的位)習題1、假設DL=10111001B,CL=3,指令SARDL,CL執行后DL=?2、假設一個48位數存放在DX:AX:BX中,請編程把這個48位數乘以2。DL=10000111BSALBX,1RCLAX,1RCLDX,1MOVCL,3b.MOVCL,7MOVBX,0B7HMOVBX,8D16HROLBX,1SHRBX,CLRORBX,CLa.答案BX=C02DHb.答案BX=011AH3、下列程序執行后,BX=?3-2-4、串(String)操作指令字串傳送:MOVSB/MOVSW字串比較:CMPSB/CMPSW字串掃描:SCASB/SCASW字串裝入:LODSB/LODSW字串存儲:STOSB/STOSW一、串操作的特點1、SI尋址源操作數,段地址在DS,DI尋址目的操作數,段地址在ES;2)每次操作后,SI、DI自動修改:DF=0,SI和DI加1或(+2),DF=1,SI、DI減一或減二。3)若源字串和目的字串在同一段中,則把DS和ES設成相同數字。4)可在串操作指令前加重復前綴(REP等),每重復執行一次,CX內容會自動減1。需注意的是,執行帶有重復前綴的指令時,對CX的檢測是在執行指令前進行的。5)串長度必須放在CX寄存器中二、重復前綴:

1、REP

MOVSB/MOVSW(1).若CX=0,退出重復操作;(2).CX≠0,執行串操作一次,CXCX-1,修改SI、DI,轉(1)。2、相等重復前綴REPZ(REPE)(1).若CX=0,或ZF=0,退出重復操作;(2).CX≠0,執行串操作一次,CXCX-1,修改SI、DI,轉(1)。用途:用于比較兩個字串,找出不同的字。

3、不相等重復前綴REPNZ(REPNE)(1).若CX=0,或ZF=1,退出重復操作;(2).CX≠0,執行串操作一次,CXCX-1,修改SI、DI。用途:1)在一個字串中,找到需要的字。

2)用于比較兩個字串,找出相同的字串

。三、字串傳送指令:MOVS

字節操作:MOVSB字操作:MOVSW1).SI指向源串(數據段DS),DI指向目的(附加段ES);2).CX置入傳送的字節數;3).用CLD 清DF=0:SI+1(或2),DI+1(或2);

用STD置DF=1:SI-1(或2),DI-1(或2);4).用帶REP重復前綴的串傳送指令,每傳送一次,CX中的值減一。例1.將100個數據,從地址為1000H單元傳送到地址為2000H單元區.LEASI,[1000H];SI指向源串地址LEADI,[2000H];DI指向源串地址MOVCX,100;置計數器CLD;清方向標志REPMOVSB;將源地址的100個字節傳送到目的地址單元

HLT四、字串比較指令:

CMPSB/CMPSW;SRC-DST字操作指令:CMPSW字節操作指令:CMPSB功能:[SI]—[DI]DIDI1(2)SISI1(2)

操作結果影響標志位。在CMPSW/CMPSB前使用重復前綴:用REPNZ/REPNE,表示兩個字串比較不相等時繼續下次比較,若相等則退出比較。

用REPZ/REPE,表示兩個字串比較相等時繼續下次比較,若不相等則退出比較。用途:用于比較兩個字串,找出第一個相等的字符或不相等的字符五、字串檢索指令:

SCASB/SCASW

操作:AL(AX)—[DI]DIDI1(2)用AL或AX中的一個字串和位于ES段由DI指出的內存單元的字節或字比較。

功能:從一個字串中查找一個與AL或AX中不同的字符,或尋找一個相同的字符.例2.從地址為1000單元開始,存放256個字節的字符串,找出第一個字符$(ASCII碼24H),將$的第一個地址存入BX中,否則將BX清零.

1)分析:要求找指定字符$,可以用指令SCASB;重復前綴用REPNZ,表示表示兩個字串比較不相等時繼續,否則退出循環$的地址應為多少?

1031332445DIDI1000H1001H1002H1003H….2).程序段:MOVDI,1000H;送目標串首地址MOVCX,256CLD;清方向標志MOVAL,‘$’REPNZSCANBJZZER;沒找到$,轉DECDI;退回到$所在地址MOVBX,DI;$所在地址送BXJMPST0ZER:MOVBX,0ST0:HLT

使用SCASB/SCASW注意:目的字串默認在ES段中,字串首址由DI指出。尋找與AL中字節相同的第一個字節,用REPNZSCASB,若找到,退出循環;若字串中沒有任何字節與AL的內容相同,退出循環。六、取字串指令:

LODSB/LODSW

執行的操作:AL(AX)[SI]SISI1(2)將位于DS段由SI指出的內存單元的字節或字的內容取到AL或AX中。注意:因為取來的字或字節放在AX或AL中,LODSB/LODSW前面不能加前綴。七、存儲指令:

STOSB/STOSW例3:將0404H單元開始的256單元清零。

CLD

;清方向標志

LEADI,[0404H]

;DI指向字串地址

MOVCX,256;共256個字節

XORAX,AX;AX清零REPSTOSBHLT

執行的操作:[DI]AL(AX)DIDI1(2)把AL或AX中的一個字串存到位ES段由DI指出的內存單元,并自動修改地址。

8086的指令執行順序由代碼寄存器CS和指令指針IP的內容確定。

控制轉移類指令通過改變IP(和CS)值,實現程序執行順序的改變8086的控制轉移類指令可分為四小類,即無條件轉移與調用返回、條件轉移、循環控制和中斷類指令。除中斷類指令外,其它類指令均不影響標志位。控制轉移類指令用于實現分支、循環、過程等程序結構,是僅次于傳送指令的最常用指令3-2-5控制轉移指令

控制轉移指令的尋址方式8088/8086的尋址方式分為兩類:關于尋找數據的尋址方式關于尋找轉移地址的尋址方式轉移可以分成兩類:段內轉移和段間轉移

段內轉移——只需改變IP寄存器的內容,在同一段的范圍之內進行轉移,稱為段內轉移也稱為近程轉移(稱為NEAR),還將(-128~+127)內轉移稱為短轉移(稱為SHORT)。

段間轉移——是要轉到另一個段去執行程序,即程序轉移后CS、IP均發生了改變,則稱為段間轉移或者稱為遠程轉移(也稱為FAR型轉移)

。1.段內直接尋址段內直接尋址方式也稱為相對尋址方式,轉移的目標地址是當前IP內容和一個8位或16位的位移量之和.(IP)←(IP)+8位或16位位移量。2.段內間接方式

有效的轉移地址EA是一個寄存器或是一個存儲單元的內容,此內容用來更新IP寄存器的內容,所以是絕對偏移量。注意與段內直接方式的相對偏移量的區別。

若目標轉移地址為存儲單元內容,則該存儲單元本身可以是存儲器操作數有關的任何尋址方式尋址。(IP)←16位通用寄存器或字存儲單元的內容3.段間直接尋址這種方式用于段間轉移,指令中給出轉向地址的段地址(CS)和偏移地址(IP),用來更新當前CS和IP,程序轉移到另一代碼段。4.段間間接方式這種方式同樣用于段間轉移,指令中將給出一個存儲器地址,用該存儲器地址所指的二個相繼字單元的內容(32位)來取代當前的IP和CS的內容。

存儲器CS存放轉移地址首地址高字節低字節低字節高字節IP二、無條件轉移指令和條件轉移指令1、無條件轉移指令

段內轉移:JMP1000H;IPIP+1000HJMPSHORTLOP1;LOP1是標號

段間轉移JMPFARPTRLOP2IPLOP2的段內偏移地址CSLOP2的段地址

JMPDWORDPTR[BX]IP[BX]CS[BX+2]A∶Above高于B∶Below低于C∶Carry進位E∶Equal

等于Z:Zero零

G∶Graeter大于L∶Less小于N∶Not非、無O∶Over溢出S∶Sign符號PE∶ParityEven奇校驗PO∶ParityOdd偶校驗2、條件轉移指令

形式:JX短目標地址X:1~3個英文字母跳轉范圍:-128~+127字節1)、JE/JZ;等于,A=BJNZ/JNE;不等于,A<>B2)、無符號數比較JB/JNAE:A<BJNB/JAE:A>=BJA/JNBE:A>B;JNA/JBE:A<=B3)、帶符號數比較指令JL:A<BJNL:A>=BJG:A>BJNG:A<=B4)其它轉移指令JS、JNS;JO、JNO;JP、JPE:P=1JPO、JNP;JCXZ:CX=0轉移

例1比較1000H、1001H單元的兩個無符號數,將大數存2000H單元中。解:MOVBX,1000H MOVAL,[BX];第一數送ALINCBX;指向第二數CMPAL,[BX];兩數比較JALOP1;大于轉MOVAL,[BX];大數送ALLOP1:MOV[2000H],ALHLT三、循環指令LOOP、LOOPZ、LOOPNZ1)、LOOP短目標地址操作:CXCX-1,CX不為零,循環;若CX=0,退出循環。相當于下面的指令:DECCXJNZ短目標地址

例2:延遲子程序:MOVCX,0100H;設循環次數KKK:LOOPKKK;CX-1,CX;不為零,循環

或:MOVCX,0100HKKK:DECCXJNZKKKHLT2)LOOPZ/LOOPE

CX-1,CX不為零且ZF=1,循環;若CX=0,或ZF=0,退出循環。3)LOOPNZ/LOOPNE

CX-1,CX不為零且ZF=0,循環;若CX=0,或ZF=1,退出循環。四、子程序調用和返回指令

指令格式CALL

RET

(1)CALL指令

CALL1000H;段內直接調用

1)、IP入棧:SPSP-2[SP]IP2)、入口地址:IPIP+1000HCALLNEARBCD1;段內直接調用1)IP值入棧:SPSP-2[SP]IP2)入口地址:IPBCD1的偏移地址CALLAX;段內間接調用1)IP值入棧:SPSP-2[SP]IP2)入口地址:IPAX的值CALL2500H:3600H;段間直接調用1)、CS值入棧2)、IP值入棧3)、IP2500HCS3600HCALLDWORDPTR[DI];段間間接調用1)、CS值入棧2)、IP值入棧3)、IP[DI]CS[DI+2](2)、返回指令:RET

1)段內調用返回從堆棧彈出一個字到IP2)段間調用返回從堆棧彈出一個字到IP從堆棧彈出一個字到CS3)RETN:帶參數返回RET6,返回后,使SP+6。五、中斷指令

1)INTn(1)、標志寄存器入棧;(2)、清標志位TF、IF;(3)、CS、DS值入棧;(4)、計算中斷地址:n4:低地址單元入IP高地址單元入CS

2)INTO:溢出中斷3)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論