2微機系統(tǒng)全3原理第三章_第1頁
2微機系統(tǒng)全3原理第三章_第2頁
2微機系統(tǒng)全3原理第三章_第3頁
2微機系統(tǒng)全3原理第三章_第4頁
2微機系統(tǒng)全3原理第三章_第5頁
已閱讀5頁,還剩196頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

3.48088(8086)的指令系統(tǒng)一、IBMPC(8086/8088)指令系統(tǒng)二、數(shù)據(jù)傳送指令三、算術(shù)運算指令四、邏輯運算指令五、串操作指令六、控制轉(zhuǎn)移指令七、處理機控制指令一、IBMPC(8086/8088)指令系統(tǒng)

8086/8088指令系統(tǒng)可分為六組:

數(shù)據(jù)傳送指令(Datatransfar);算術(shù)指令(Arithmetic);邏輯指令(Logic);串處理指令(Stringmanipulation);控制轉(zhuǎn)移指令(Controltransfar);處理機控制指令(Processorcontrol);二、數(shù)據(jù)傳送指令分類名稱格式功能OSZAPC基本傳送指令MOVDST,SRC字、字節(jié)傳送不影響進棧指令PUSHOPRD字壓入堆棧不影響出棧指令POPOPRD字彈出堆棧不影響交換指令XCHGDST,SRC字、字節(jié)交換不影響有效地址送寄存器指令LEAREG,SRC有效地址寄存器不影響指針送寄存器及DS指令LDSREG,SRC地址指針寄存器,DS不影響指針送寄存器及ES指令LESREG,SRC地址指針寄存器,ES不影響輸入指令I(lǐng)NAL,PORT外設(shè)數(shù)據(jù)

AL不影響輸出指令OUTPORT,ALAL外設(shè)數(shù)據(jù)不影響換碼指令XLATAL中數(shù)據(jù)轉(zhuǎn)換不影響讀取標志指令LAHFFlag低字節(jié)

AH不影響設(shè)置標志指令SAHFAHFlag低字節(jié)ZAPC標志寄存器入棧指令PUSHF把Flag內(nèi)容壓入堆棧不影響標志寄存器出棧指令POPF把Flag內(nèi)容彈出堆棧OSZAPC通用數(shù)據(jù)傳送指令地址傳送指令累加器專用指令標志寄存器傳送指令1.通用數(shù)據(jù)傳送指令

(1)基本傳送指令MOVDST,SRC

源操作數(shù)——寄存器、存儲器、立即數(shù)目的操作數(shù)——寄存器、存儲器執(zhí)行的操作:DST

SRC

MOV指令最簡單、最常用,用來賦初值,或傳送數(shù)據(jù),或?qū)?shù)據(jù)進行暫存等。rSSDIBPICPUINSTmCSr/segESAXDSImmr/rSPIMCXDXr/mSIseg/mmBX其中源操作數(shù)(src)和目的操作數(shù)(dst)均可采用多種尋址方式,其傳送關(guān)系如圖所示:SRMIMCS:IP不能直接改變由圖可知MOV指令有6種格式:(1)

CPU通用寄存器之間傳送(r/r)MOVCL,AL;將AL中的8位數(shù)據(jù)傳到CL(2)通用寄存器和段寄存器之間(r/SEG)MOVDS,AX;將AX中的16位數(shù)據(jù)傳到DS(3)

用寄存器和存儲單元之間(r/M)MOVAL,[BX];將[BX]所指存儲單元內(nèi)容傳到AL(4)

段寄存器和存儲單元之間(seg/M)MOVDS,[2000H];將2000H和2001H兩存儲單元內(nèi)容傳到DS(5)

立即數(shù)到通用寄存器(r/Imm)MOVSP,2000H;將2000H送SP(6)

立即數(shù)到存儲單元(M/Imm)MOVWORDPTR[SI],4501H;將立即數(shù)4501H送(SI)所指的字單元注意:①

MOV指令可以傳8位或16位數(shù)據(jù)例:MOVES,AL;錯

MOVCL,4321H;錯②

MOV指令的操作數(shù)中必用一個寄存器,不允許兩存儲單元之間傳送數(shù)據(jù)MOV[2000H],[3000H];錯例:MOVAL,[SI]MOV[DI],AL③

不能用CS,IP作目的操作數(shù)④

不允許在段寄存器之間直接傳送數(shù)據(jù)例:MOVDS,ES;錯⑤

不允許用立即數(shù)作目的操作數(shù)

MOV2000H,AL;錯⑥

不能向段寄存器送立即數(shù)

MOVDS,3000H;錯例:MOVAX,3000HMOVDS,AX*MOV指令不影響標志位。例1:把地址為AREA1(段內(nèi)偏移量)的存儲單元的內(nèi)容,傳送至同一段內(nèi)的地址為AREA2的存儲單元中。AREA1AREA265F3020024E00500MovAREA2,AREA1MovAL,AREA1MovAREA2,AL例2:若要傳送的不是一個字節(jié),而是一個數(shù)據(jù)塊,(例如內(nèi)有100個字節(jié)),如何實現(xiàn)?

movsi,offsetarea1movdi,offsetarea2movcx,100Again:moval,[si];mov[di],alincsiincdideccxjnzagainint3AREA1AREA265F302……0500100=Leasi,area2

(2)棧操作指令PUSHOPRDPOPOPRD

堆?!凑障冗M后出的原則組織的一段內(nèi)存區(qū)域。8088中規(guī)定堆棧設(shè)置在堆棧段(SS段)內(nèi),堆棧指針SP的初值決定了堆棧的大小。

SP始終指向堆棧的頂部,即始終指向最后推入堆棧的信息所在的單元。操作數(shù):

16位通用寄存器;段寄存器;

16位內(nèi)存操作數(shù)(除立即數(shù)之外的任何尋址方式)。

00000SS:0000SS:SP堆棧段方式:(1)

CPU通用寄存器入/出棧,如:

PUSHAXPOPBX(2)

段寄存器入/出棧,如

PUSHCSPOPDS(3)

存儲單元入/出棧

PUSH

[BX+DI]POP[2000H]PUSHAX指令分兩步執(zhí)行:1.SP-2SP2.將AH內(nèi)容送至SP+1所指單元;3.再將AL內(nèi)容送至SP所指單元;例:MOVAX,1234HPUSHAXPOPAX指令分兩步執(zhí)行:1.先將SP所指單元內(nèi)容送至AL,然后再SP+1所指單元內(nèi)容送至AH,然后SP+2

SP

例:MOVAX,5678HPOPAX

入棧和出棧指令性用于程序保存和恢復(fù)數(shù)據(jù),或用于轉(zhuǎn)子或中斷時保護現(xiàn)場和恢復(fù)現(xiàn)場。其主要注意:(1)

堆棧操作指令中,有一個操作數(shù)是隱含了的,這個操作數(shù)就是(SP)指示的棧頂存儲單元;(2)

8086堆棧都是字操作(3)

每執(zhí)行一條指令,(SP)自動增減2(4)

CS寄存器可以入棧,但不能隨意彈出一個數(shù)據(jù)到CS(5)

在使用堆棧指令時,要按“先進后出”原則來編寫程序(3)交換指令XCHGOPRD1,OPRD2

在寄存器間或寄存器與存儲器間交換信息(不允許使用段寄存器)。

源操作數(shù):寄存器、存儲器目的操作數(shù):寄存器、存儲器執(zhí)行的操作:(OPRD1)

(OPRD2)

例:XCHGBX,[BP+SI](BX)=6F30H(BP)=0200H(SI)=0046H(SS)=2F00H(2F246H)=1234H結(jié)果:(BX)=1234H(2F246H)=6F30H例如:XCHGAL,BL;(AL)與(BL)間進行字節(jié)交換

XCHG[2200H],DX;(DX)與(2200H)、(2201H)兩單元間的字交換使用時注意:(1)

OPR1和OPR2不能同時為存儲器操作數(shù);(2)

任一個操作數(shù)都不能使用段寄存器,也不能使用立即數(shù)。

用來對尋址機構(gòu)進行控制的指令。指令傳送到16位目標寄存器中的是存儲器操作數(shù)的地址,而不是它的內(nèi)容。1.地址傳送指令LEA,LDS,LES

把地址傳送到指定寄存器。

(1)LEA——有效地址送寄存器。

LEAREG,SRC

(REG)(SRC)

目的操作數(shù)源操作數(shù)(16位通用寄存器)(內(nèi)存操作數(shù))

?

該地址常用來設(shè)置一個16位的寄存器作為地址指針;

?

該指令的執(zhí)行效果與movreg,offsetsrc相同。

(三)地址—目標傳送指令例:LEABX,[BP+SI];執(zhí)行后,BX中為(BP)+(SI)的值

LEASP,[0520H];執(zhí)行后,使堆棧指針(SP)

=0520H例:leabx,[bx][si]

執(zhí)行前(bx)=1000h(si)=2000h

執(zhí)行后bx=1000hh=3000h

(2)LDS

把源操作數(shù)指定的內(nèi)存的4個相繼字節(jié)的內(nèi)容送至指定寄存器及DS中

LDSREG,SRC

(REG)(SRC)(DS)(SRC+2)

目的操作數(shù)源操作數(shù)(16位通用寄存器)(內(nèi)存操作數(shù))

(1)該指令完成一個32位地址指針的傳送;

(2)該指令通常指定SI作寄存器REG。

DS=1000h10100h000200200200h2000hSIDS例:ldsSI,[100h]

(3)LES

把源操作數(shù)指定的內(nèi)存的4個相繼字節(jié)的內(nèi)容送至指定寄存器及ES中。

LESREG,SRC

(REG)(SRC)(ES)(SRC+2)

目的操作數(shù)源操作數(shù)(16位通用寄存器)(內(nèi)存操作數(shù))

(1)該指令完成一個32位地址指針的傳送;

(2)該指令通常指定DI作寄存器REG。

ES=1000h10100h000200200200h2000hDIES例:lesdi,[100h]3.累加器專用指令I(lǐng)N,OUT,XLAT

輸入輸出指令

PC機中,所有I/O端口與CPU之間的通信都有IN,OUT指令完成。長格式(直接方式):INAL,PORTOUTPORT,ALPORT——端口地址短格式(間接方式):INAX,DX;從(DX)和(DX)+1所指的兩個端口輸一個字到AX,低地址端口的值輸入到AL,高地址端口的值輸?shù)紸H

1.

輸入/輸出(I/O)指令輸入指令長格式:IN

AL,PORT;將PORT端口字節(jié)數(shù)據(jù)輸入到AL短格式:INAX,DX;從(DX)和(DX)+1所指的兩個端口輸一個字到AX低地址端口的值輸?shù)紸L,高地址端口的值輸?shù)紸H輸出指令:長格式:OUTPORT,AL;將AL中的1個字節(jié)數(shù)據(jù)輸出到PORT端口短格式:OUTDX,AX;將AL中低位字節(jié)輸出到(DX)所指端口,同時將AH中的高位字節(jié)輸出到(DX)+1所指的端口例3—3:欲將12位A/D變換器所得數(shù)字量輸入。這時,A/D變換器應(yīng)使用一個字端口,設(shè)為20H。

MOVDX,02F0HINAX,DX注意:(1)

指令只能用累加器AX/AL作I/O過程機構(gòu),不能用其它寄存器;(2)

長格式的I/O指令端口范圍為0~FFH。(3)

運行有I/O指令的程序時,若無硬件端口的支持,機器將出現(xiàn)死鎖(4)

在使用短格式I/O指令時,端口地址只能賦給DX。(2)換碼指令XLAT

功能:

將AL指向的換碼表中的一個字節(jié)的內(nèi)容送到AL中。

操作數(shù):隱含的寄存器BX,AL

操作:(AL)((BX)+(AL))

應(yīng)先將表格的首地址送入BX寄存器,將待查的值(碼)放入AL中,用它來表示表中某一項與表首址的距離。例3—4:數(shù)字0-9對應(yīng)的格雷碼為:18H、34H、05H…(見圖)。依次放在內(nèi)存以TABLE開始的區(qū)域,當#10端口輸入一位十進制數(shù)時,要求將其轉(zhuǎn)換為相應(yīng)的格雷碼再輸出給該端口。

MOVBX,TABLE;BX指向TABLE的首址

INAL,10;從端口0AH輸入待查值

XLATTABLE;查表轉(zhuǎn)換

OUT10,AL;查表結(jié)果輸出到0AH端口若10端口輸入值為7,則查表轉(zhuǎn)換后輸出值為11H如圖所示:4.標志寄存器傳送指令

(1)

讀取標志指令LAHF

功能:把Flag的低字節(jié)內(nèi)容裝入寄存器AH中。操作數(shù):隱含的操作數(shù)標志寄存器Flag,AH

執(zhí)行的操作:AHFlag的低位字節(jié)。

O

DIT

SZAPCD7D6D4D2D0FlagAH(2)設(shè)置標志指令SAHF

功能:把Ah的內(nèi)容裝入Flag的低字節(jié)。操作數(shù):隱含的操作數(shù)標志寄存器Flag,AH

執(zhí)行的操作:Flag的低位字節(jié)AH

O

DIT

SZAPCFlagAHD7D6D4D2D0注:該指令影響標志位Z、A、P、C、S(3)

標志寄存器入棧指令PUSHF

功能:將標志寄存器Flag的內(nèi)容壓入堆棧保存。(4)

標志寄存器出棧指令POPF

功能:把棧中內(nèi)容彈出至標志寄存器Flag。

PUSHF指令將標志寄存器內(nèi)容推入堆棧頂部,同時修改堆棧指針:(SP)←(SP)-2。該指令執(zhí)行后,標志寄存器內(nèi)容不變。POPF指令功能正好相反。注:該指令影響標志位O、S、Z、A、P、C。三、算術(shù)運算指令分類名稱格式功能OSZAPC加法指令A(yù)DDDST,SRC加法(字、字節(jié))OSZAPC帶進位加法指令A(yù)DCDST,SRC帶進位加法(字、字節(jié))OSZAPC加1指令I(lǐng)NCOPRD加1(字、字節(jié))OSZAP減法指令SUBDST,SRC減法(字、字節(jié))OSZAPC帶借位減法指令SBBDST,SRC帶借位減法(字、字節(jié))OSZAPC減1指令DECOPRD減1(字、字節(jié))OSZAP比較指令CMPDST,SRC比較(字、字節(jié))OSZAPC求補指令NEGOPRD求補碼OSZAPC無符號數(shù)乘法MULSRC不帶符號數(shù)乘法(字,字節(jié))OC帶符號數(shù)乘法IMULSRC帶符號數(shù)乘法(字,字節(jié))OC無符號數(shù)除法DIVSRC不帶符號數(shù)除法(字,字節(jié))帶符號數(shù)乘法IDIVSRC帶符號數(shù)除法(字,字節(jié))符號擴展指令CBW擴展AL中的符號不影響符號擴展指令CWD擴展AX中的符號不影響加法指令減法指令乘法指令除法指令十進制調(diào)整指令1.加法指令

ADDDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DST+SRC

注:該指令影響標志位

注意:該指令適合有符號數(shù)和無符號數(shù)的運算。

DST+SRC

OSZAPC00100100

0

1.加法指令

ADDDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DST+SRC

注:該指令影響標志位

注意:該指令適合有符號數(shù)和無符號數(shù)的運算。

DST+SRC

OSZAPC00100100

0

例1:MOVDX,4652HADDDX,0f0f0h4652+f0f0374210100011001010010+111100001111000000110111010000111執(zhí)行后:(DX)=3742H

z=0s=0c=1o=0

對無符號數(shù)溢出結(jié)果錯對有符號數(shù)不溢出結(jié)果正確

問:對帶符號數(shù)和無符號數(shù)怎樣判斷是否溢出?

有符號數(shù)的溢出用溢出標志o判斷;無符號數(shù)的溢出用進位標志c判斷。

ADCDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DST+SRC+C

功能:主要用于多字節(jié)運算

注:該指令影響標志位

注意:該指令適合有符號數(shù)和無符號數(shù)的運算。

DST+SRC+C

OSZAPC00100100

0

例2:在內(nèi)存的First和Secontd開始的區(qū)域中分存放著2F365H和5E024H兩個數(shù),要求求其和,并存入Third中。

2F365+5E0248D389

FirstSecondThird65F3020024E00500MOVAX,FirstADDAX,SecondMOVThird,AXMOVAX,First+2ADCAX,Second+2MOVThird+2,AX2F365F365+5E024+E0248D389D38910002+0005000821FirstSecondThird65F3020024E0050089D30800INCOPRD

操作數(shù):通用寄存器、存儲器(不能是段寄存器或立即數(shù))執(zhí)行的操作:OPRD

OPRD+1

功能:用于在循環(huán)中修改地址指針及循環(huán)次數(shù)等。注:該指令影響標志位

例:INCCX

;將CX的內(nèi)容加1后再送回CX中

注意:

(1)該指令將操作數(shù)視為無符號數(shù);(2)INC指令只影響OF、SF、ZF和PF,而不影響進位標志

CF,因此不能用INC指令進行循環(huán)計數(shù)來控制循環(huán)的結(jié)束。OPRD+1

OSZAP00100100

0

2.減法指令

SUBDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DST-SRC

注:該指令影響標志位

例如:

SUBAX,BX;AX內(nèi)容減去BX中的內(nèi)容,結(jié)果放在AX中

注意:該指令適合有符號數(shù)和無符號數(shù)的運算。DST-SRC

OSZAPC00100100

0

SBBDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DST-SRC

–C

注:該指令影響標志位

注意:該指令適合有符號數(shù)和無符號數(shù)的運算。

同加法指令有符號數(shù)的溢出用溢出標志o判斷;無符號數(shù)的溢出用進位標志c判斷。DST–SRC-C

OSZAPC00100100

0

例:SUBDH,[BP+4](DH)=41H(SS)=0000H(BP)=00E4H(00E8H)=5AH結(jié)果:(DH)=0E7HS=1Z=0C=1O=0

如果為有符號數(shù)則結(jié)果正確(無溢出)如果為無符號數(shù)則結(jié)果錯誤(有溢出)41-5AE701000001-010110101110011111例3:雙精度數(shù)運算W=X+Y+24-ZXYZW65F3020024E0050089D30800MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;X+YADDAX,24ADCDX,0;X+Y+24SUBAX,ZSBBDX,Z+2;X+Y+24-ZMOVW,AXMOVW+2,DX;送入w

DECOPRD

操作數(shù):通用寄存器、存儲器(不能是段寄存器或立即數(shù))執(zhí)行的操作:OPRD

OPRD-1

功能:用于在循環(huán)中修改地址指針及循環(huán)次數(shù)等。注:該指令影響標志位例:DECBX;將BX的內(nèi)容減1后再送回BX中

DEC[SI]

注意:(1)該指令將操作數(shù)視為無符號數(shù);

(2)該指令不影響進位標志COPRD-1

OSZAP00100100

0

NEGOPRD

操作數(shù):通用寄存器、存儲器執(zhí)行的操作:求補指令,將操作數(shù)按位(連同符號位)取反后加1,再送回操作數(shù)。

注:該指令影響標志位

OPRD

OSZAPC00100100

0

NEG將src中的內(nèi)容變反加1。例如:若(AL)=03H,執(zhí)行NEGAL后,(AL)=0FDH。

0FDH的原碼為10000011,即為-3.CMPDST,SRC

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:

DST-SRC

注:該指令影響標志位

注意:(1)該指令同SUB,但其不保存運算結(jié)果;

(2)該指令后面通常跟一條轉(zhuǎn)移指令,根據(jù)標志位產(chǎn)生不同的程序分支。DST-SRC

OSZAPC00100100

0

比較指令主要用于兩個數(shù)之間的關(guān)系:大、小、相等。如:A,B1.比較相等。只要看Z標志。Z=1——相等

Z=0——不相等。2.比較大小。分兩種情況。

?

無符號數(shù)看進(借)位C標志。C=1,有借位,則A<BC=0,無借位,則A>B

A=A0H10100000A=53H01010011B=53H-01010011B=A0H-10100000

01001101

00110011A>BA<B1?

帶符號數(shù)

*同號:A=24H00100100B=44H-0100010011100000

不會溢出O=0,用符號位S判斷O=0S=0A>BS=1A<B*異號:A=7FH01111111B=F0H-1111000010001111

用符號位S和溢出位O判斷O=1S=1A>BS=0A<BO=0S=0A>BS=1A<B

結(jié)論:O⊕S=0A>BO⊕S=1A<B(詳細述述見P106)8088中有幾條用于判斷有符號數(shù)大小的轉(zhuǎn)移指令,如:

JG/JNLE大于則轉(zhuǎn)移條件為:O⊕S=0且Z=0JL/JNGE小于則轉(zhuǎn)移條件為:O⊕S=1

同樣有幾條用于判斷無符號數(shù)大小的轉(zhuǎn)移指令,如:

JA/JNBE高于則轉(zhuǎn)移條件為:C=0且Z=0JBE/JNA低于或等于則轉(zhuǎn)移條件為:C=1或Z=1

例4:比較兩個無符號數(shù)的大小,并將大數(shù)存入AL中。

XY65F3020024E0050089D30800結(jié)果結(jié)果AL=F3

MOVAL,XMOVBL,YCMPAL,BL;AL-BL

JNCNEXT;當CF=0,轉(zhuǎn)移

XCHGAL,BLNEXT:HLT例5:比較兩個帶符號數(shù)的大小,并將大數(shù)存入AL中。XY65F3020024E0050089D30800結(jié)果AL=65

MOVAL,XMOVBL,YCMPAL,BLJGNEXT;大于則轉(zhuǎn)移

XCHGAL,BLNEXT:HLT例6:若自Block開始的內(nèi)存中有100個帶符號數(shù),找出最大值存入Max單元。Block65F3020024E00500MOVBX,OffsetBlockMOVAX,[BX]INCBXINCBXMOVCX,100Again:CMPAX,[BX]JGNEXTMOVAX,[BX]Next:INCBXINCBXDECCXJNZAgainMOVMAX,AXHLTMax例7:在分別由Data1和Data2開始的兩個內(nèi)存區(qū)域中,分別存放著5個1字節(jié)的無符號數(shù),如果Data1中的第N個數(shù)大于Data2中的第N個數(shù),則進行

Data1[N]-Data2[N]運算,否則進行Data1[N]+Data2[N]運算,運算結(jié)果存回Data1中Data1Data265F3020024E0050089D3LEASI,Data1LEADI,Data2MOVCX,100Again:MOVAL,[SI]CMPAL,[DI]JCAdddatSUBAL,[DI]JMPNextAdddat:ADDAL,[DI]Next:MOV[SI],ALINCSIINCDIDECCXJNZAgainHLTData1Data265F3020024E0050089D33.乘法指令

MULSRC——無符號數(shù)乘法

源操作數(shù):通用寄存器、存儲器(不能是立即數(shù))目的操作數(shù):DX,AX(隱含)執(zhí)行的操作:字節(jié)操作(AH,AL)(AL)(SRC)

字操作(DX,AX)(AX)(SRC)注:該指令影響標志位

AL

SRC

OC00100100

0

注意:若結(jié)果的高半部分(字節(jié)相乘為AH,字相乘為DX)為0則C=0,O=0

為1則C=1,O=1例如:

MULBL;AL中和BL中的8位數(shù)相乘,乘積在AX中

MULWORDPTR[SI];AX中和(SI)所指的字單元中的16位數(shù)相乘,乘積在

DX和AX中IMULSRC——帶符號數(shù)乘法

源操作數(shù):通用寄存器、存儲器(不能是立即數(shù))目的操作數(shù):DX,AX(隱含)執(zhí)行的操作:字節(jié)操作(AH,AL)(AL)(SRC)字操作(DX,AX)(AX)(SRC)

注:該指令影響標志位

AL

SRC

OC00100100

0

注意:若結(jié)果的高半部分不是低半部分的符號擴展的話,則C=1,O=1

否則C=0,O=0符號擴展:從8位擴展到16位

20H+20H0010,00000000,0000,0010,0000-20H1111,11101111,1111,1111,1110符號位例:

IMULCX

;AX中和CX中的16位帶符號數(shù)相乘,乘積在DX和AX中

IMULBYTEPTR[BX];AL中和(BX)所指的存儲單元中的8位帶符號數(shù)相乘,結(jié)果在AX中4.除法指令8086執(zhí)行除法運算時,規(guī)定被除數(shù)必為除數(shù)的雙倍字長;除法有兩個操作數(shù),其中被除數(shù)固定在AX中或DX中。

DIVSRC——無符號數(shù)除法

IDIVSRC——帶符號數(shù)除法

源操作數(shù):通用寄存器、存儲器(不能是立即數(shù))目的操作數(shù):DX,AX(隱含)執(zhí)行的操作:字節(jié)操作

(AL)(AX)/(SRC)——商

(AH)(AX)/(SRC)——余數(shù)

字操作

(AX)(DX,AX)/(SRC)——商

(DX)(DX,AX)/(SRC)——余數(shù)

注:該指令對各標志位均無定義。注意:SRC的類型決定是字或字節(jié)相除。使用除法指令,注意:(1)除法運算后,標志位AF、ZF、PF、SF、PF和CF都是不確定的(2)用IDIV指令時,如果超出帶符號數(shù)的表示范圍,則產(chǎn)生錯誤(3)8086指令規(guī)定:余數(shù)的符號和被除數(shù)相同;(4)如果被除數(shù)沒有除數(shù)的雙倍字長,則要進行符號位的擴展。例如:IDIVCX

;將(DX)和(AX)中32位數(shù)除以(CX)中的16位數(shù),商在AX中,余數(shù)在DX中例如:DIVBYTEPTR[DI]

;將(AX)中的16位數(shù)除以(DI)所指的8位數(shù),商在AL中,余數(shù)在AH中符號擴展指令:用于帶符號數(shù)的擴展將字節(jié)擴展成字的指令:

CBW——擴展AL寄存器中數(shù)據(jù)的符號,并將其存入AH寄存器中。若AL<80H則擴展后AH=0

若AL>=80H則擴展后AH=FFH將字擴展成雙字的指令:

CWD——擴展AX寄存器中數(shù)據(jù)的符號,并將其存入DX寄存器中。若AX<8000H則擴展后DX=0

若AX>=8000H則擴展后DX=FFFFH

注:該指令不影響標志位。例3-13:編寫45ABH÷2132H的程序段。設(shè)被除數(shù)、除數(shù)分別按低字節(jié)在前,高字節(jié)在后存放在數(shù)據(jù)段中,其起始地址為BUFFER,并在其后保留4個字節(jié)以存放商和余數(shù)。MOVBX,OFFSETBUFFERMOVAX,[BX]CWD;對被除數(shù)進行符號擴展IDIV2[BX]MOV4[BX],AX;商放在AX中MOV6[BX],DX;余數(shù)放在DX中若相除的兩數(shù)為無符號數(shù),則被除數(shù)擴展應(yīng)使用指令:MOVDX,0。BUFFERAB453221例9:計算w=(v-(x

y+z-540))/xx、y、z、v均為16位帶符號數(shù),分別存放在X、Y、Z、V單元中,求結(jié)果并送入W單元中。XYZVW65F3020024E00500MOVAX,XIMULY;結(jié)果在(DX,AX)中MOVCX,AXMOVBX,DXMOVAX,ZCWD;CWD將AX中的字擴展成雙字,結(jié)果(DX,AX)中ADDCX,AXADCBX,DXSUBCX,540SBBBX,0MOVAX,VCWDSUBAX,CXSBBDX,BXIDIVXMOVW,AXMOVW+2,DXw=(v-(x

y+z-540))/x5.十進制調(diào)整指令

前面提到的所有運算指令都是二進制數(shù)的運算指令,怎樣得到十進制的運算結(jié)果呢?8088提供了一套十進制調(diào)整指令。十進制數(shù)的表示:

BCD碼——用二進制編碼的十進制數(shù)。

壓縮00000001001000110100010101100111100010010123456789

非壓縮UUUU0000UUUU0001UUUU0010UUUU10010129調(diào)整指令

加法:

DAA

壓縮的BCD碼加法十進制調(diào)整指令。

AAA

非壓縮的BCD碼加法十進制調(diào)整指令。減法:DAS

壓縮的BCD碼減法十進制調(diào)整指令。

AAS

非壓縮的BCD碼減法十進制調(diào)整指令。乘法:AAM

非壓縮的BCD碼乘法十進制調(diào)整指令。除法:AAD

非壓縮的BCD碼除法十進制調(diào)整指令。(1)組合十進制加法調(diào)整指令DAADAA指令用于對組合BCD碼相加的結(jié)果進行調(diào)整,使結(jié)果仍為組合的BCD碼。

DAA指令應(yīng)緊跟在加法指令之后,執(zhí)行時,先對相加結(jié)果進行測試,若結(jié)果的低4位(或高4位)二進制大于9(非法碼)或大于15(即產(chǎn)生進位CF或輔助進位AF)時,DAA自動對低4位(或高4位)結(jié)果進行加6的調(diào)整。調(diào)整在AL中進行,結(jié)果放在AL中。例如:兩個十進制數(shù)89+75的正確結(jié)果應(yīng)為164,可是,相加運算后的結(jié)果為FEH,要進行以下調(diào)整:89=1000100175=01110101+1111111001100110=FEH+=164011001001例:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHDAA;執(zhí)行后AX=13H(2)非組合十進制數(shù)加法調(diào)整指令A(yù)AAAAA指令用于對非組合BCD碼相加結(jié)果進行調(diào)整,指令的操作如下:若(AL)&0FH>9,或AF=1則(AL)←(AL)+6(AF)←1(CF)←(AF)(AH)←(AH)+1(AX)←(AL)&0FH例如:兩個非組合的十進制數(shù)06+07,結(jié)果應(yīng)為非組合的十進制數(shù)0103,其操作過程如下:0000011000000111000011010001001100000000000000010000111100000011011011&00000001====AX0103+ALAFAH=++06070DH;非組合BCD;不是非組合BCD;調(diào)整;組合BCD;再調(diào)整AF←1;AH←AH+1;AL&0FH;結(jié)果送AX中程序為:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHAAA;執(zhí)行后AX=0103H(3)組合十進制數(shù)減法調(diào)整指令DASDAS指令對組合BCD碼相減結(jié)果進行調(diào)整,緊跟在減法指令之后,調(diào)整后的結(jié)果仍為組合BCD碼,DAS對結(jié)果是進行-6調(diào)整。例:SUBAL,BHDAS

執(zhí)行指令前,AL=86H,BH=07H執(zhí)行SUB指令后,AL=7FH,CF=0,AF=1執(zhí)行DAS指令后,因AF=1,需進行調(diào)整。AL=AL-6=7FH-6=79H。CF=0,AF=1。結(jié)果調(diào)整為79的壓縮BCD碼。(4)非組合十進制數(shù)減法調(diào)整指令A(yù)ASAAS與AAA類似,但有兩點不同:(1)AAA指令中的(AL)←(AL)+6操作對應(yīng)

AAS中則應(yīng)改為(AL)←(AL)-6;(2)AAA指令中的(AH)←(AH)+1操作對應(yīng)AAS中則應(yīng)改為(AH)←(AH)-1;(5)非組合十進制數(shù)乘法調(diào)整指令A(yù)AM調(diào)整后的結(jié)果仍為一個正確的非組合BCD碼,放回AX中。例如:實現(xiàn)08×09=0702的程序為:

MOVAL,08MOVBL,09MULBL;(AL)×(BL)(AX)

AAM;結(jié)果(AX)=0702(6)非組合十進制除法調(diào)整指令A(yù)AD除法調(diào)整指令A(yù)AD應(yīng)放在除法指令之前,先將AX中的非組合BCD碼的被除數(shù)調(diào)整為二進制數(shù),再進行相除。例如:要實現(xiàn)0103÷06=02余01,程序如下:

MOVAX,0103;取被除數(shù)

MOVBL,06;取除數(shù)

AADDIVBL;相除,得(AL)=02,(AH)=1四、邏輯運算指令分類名稱格式功能OSZAPC邏輯與指令A(yù)NDDST,SRC與(字、字節(jié))OSZPC邏輯或指令ORDST,SRC或(字、字節(jié))OSZPC邏輯非指令NOTOPRD非(字、字節(jié))不影響邏輯異或指令XORDST,SRC異或(字、字節(jié))OSZPC測試指令TESTDST,SRC測試(字、字節(jié))OSZPC邏輯左移指令SHLOPRD,COUNT邏輯左移(字、字節(jié))OSZPC算術(shù)左移指令SALOPRD,COUNT算術(shù)左移(字、字節(jié))OSZPC邏輯右移指令SHROPRD,COUNT邏輯右移(字、字節(jié))OSZPC算術(shù)右移移指令SAROPRD,COUNT算術(shù)右移(字、字節(jié))OSZPC循環(huán)左移指令ROLOPRD,COUNT循環(huán)左移(字,字節(jié))OC循環(huán)右移指令ROROPRD,COUNT循環(huán)右移(字,字節(jié))OC帶進位循環(huán)左移指令RCLOPRD,COUNT帶進位循環(huán)左移(字,字節(jié))OC帶進位循環(huán)右移指令RCROPRD,COUNT帶進位循環(huán)右移(字,字節(jié))OC邏輯運算指令移位指令循環(huán)移位指令1.邏輯運算指令

ANDDST,SRC——邏輯與

源操作數(shù):通用寄存器、存儲器、立即數(shù)目的操作數(shù):通用寄存器、存儲器執(zhí)行的操作:DST

DSTandSRC

功能:實現(xiàn)兩個操作數(shù)的按位與運算。

注:該指令影響標志位使O=0,C=0,P,S,Z反映操作的結(jié)果。DST∧

SRC

OSZPC00100100

0

例1:屏蔽AL寄存器的低四位。

MOVAL,F(xiàn)F11111111ANDAL,F(xiàn)0∧1111000011110000例2:屏蔽AL寄存器的高兩位。

MOVAL,F(xiàn)F11111111ANDAL,3F∧0011111100111111使一立即數(shù)的該位為0即可使一立即數(shù)的該位為0即可AND通常用于使某些位置0,其它位不變的情況。ORDST,SRC——

溫馨提示

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

評論

0/150

提交評論