微機(jī)原理第3章-指令系統(tǒng)課件_第1頁
微機(jī)原理第3章-指令系統(tǒng)課件_第2頁
微機(jī)原理第3章-指令系統(tǒng)課件_第3頁
微機(jī)原理第3章-指令系統(tǒng)課件_第4頁
微機(jī)原理第3章-指令系統(tǒng)課件_第5頁
已閱讀5頁,還剩234頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

及秦紅磊金天微機(jī)原理接口技術(shù)第三章微處理器指令系統(tǒng)(InstructionSet)第一節(jié):指令的基本格式第二節(jié):8086的尋址方式第三節(jié):8086的指令系統(tǒng)第四節(jié):其它微處理器的指令擴(kuò)展第五節(jié):中斷指令和DOS系統(tǒng)功能調(diào)用指令系統(tǒng)是計算機(jī)硬件和軟件之間的橋梁,是匯編語言設(shè)計的基礎(chǔ)。操作碼操作數(shù)匯編指令:操作碼:指令操作類型;操作數(shù):指令所需操作數(shù)或操作數(shù)的地址;操作數(shù)可以有一個,也可以有兩個,一個源操作數(shù),一個目的操作數(shù)。例:MOVAX,CX;將CX的內(nèi)容送入AX中。微機(jī)算機(jī)處理器的指令由幾十種或上百種組成,每種指令由兩個字段(Field)構(gòu)成:第一節(jié)指令的基本格式指令操作數(shù)部分直接給出指令的操作數(shù),操作數(shù)與操作碼一起存入代碼段中。立即數(shù)有8位和16位。例:MOVAL,05H

;源操作數(shù)為立即尋址指令執(zhí)行后,AL=05H,8位數(shù)據(jù)05H存入AL寄存器。例:MOVAX,3064H

;源操作數(shù)為立即尋址指令執(zhí)行后,AX=3064H,16位數(shù)據(jù)3064H存入AX寄存器。1.立即數(shù)尋址(ImmediateAddressing)

立即數(shù)尋址、寄存器尋址的操作數(shù),不用在取完指令后再到內(nèi)存中取數(shù)。尋址方式。其它尋址方式操作數(shù)存放在內(nèi)存中,取完指令后,還需到內(nèi)存取數(shù),指令中給出的是該操作數(shù)的地址,包括段地址和偏移地址。CPU總線內(nèi)存DSESSSCSIP數(shù)據(jù)暫存器PSW標(biāo)志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運(yùn)算器地址加法器、、、指令1指令2指令3指令4、、、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、、、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器

寄存器尋址方式的操作數(shù)是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器??墒褂玫?6位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成兩8位使用。例:MOVAX,CX

;(AX)(CX)

INCCX

;(CX)(CX)+12.寄存器尋址(RegisterAddressing)例:MOVAX,[1000H]

若(DS)=2000H

內(nèi)存操作數(shù)的物理地址為:PA=(DS)×10H+EA=2000H×10H+1000H=21000H

執(zhí)行后(AX)=3040H

思考:

指令MOVAX,[1000H]

與MOVAX,1000H有什么不同?4.間接尋址(IndirectAddressing)按給出偏移地址方式的不同,分為以下5種:寄存器間接尋址

MOVAL,[BX]寄存器相對尋址

MOVAL,[BX+10H]

基址加變址寄存器

MOVAL,[BX+SI]

相對基址加變址寄存器

MOVAL,[BX+SI+10H](1)寄存器間接尋址

寄存器間接尋址方式的操作數(shù)形式為:[reg]操作數(shù)的有效地址包含在基址寄存器BX,基址指針BP或一個變址寄存器(SI或DI)中。寄存器間接尋址要用方括號括起來,以便與寄存器操作數(shù)相區(qū)別。例:MOVAX,[BX];將由BX決定的存儲單元的內(nèi)容送到AX寄存器。0000000100020003CCAATAB:AHAL

AA

BB數(shù)據(jù)段0002BXBB使用BX、SI、DI的寄存器尋址,默認(rèn)段寄存器為DSCPU總線內(nèi)存DSESSSCSIP數(shù)據(jù)暫存器PSW標(biāo)志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運(yùn)算器地址加法器、、、指令1指令2指令3指令4、、、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、、、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器例:

MOVAX,[DI]

若(DS)=3000H(DI)=2000H

則內(nèi)存操作數(shù)的物理地址為:

PA=(DS)×10H+(DI)=32000H

執(zhí)行后(AX)=(32000H)=400BH思考:指令MOVAX,[DI]

與MOVAX,DI有什么不同?用SI、DI、BX、BP作為間接尋址允許段跨越

指令中可以指定段跨越前綴來取得其他段中的數(shù)據(jù)。例:MOVES:[DI],AXMOVDX,DS:[BP]這種尋址方法可以用于表格處理。操作數(shù)

有效地址是一個基址或變址寄存器的內(nèi)容和指令中指定的8位或16位位移量(displacement)之和??捎玫募拇嫫饔蠦X、DI

、SI、BP,與寄存器間接尋址相同如:MOVAL,[BX+10H]MOVAH,[DI+20H]MOVDL,30H[SI]MOVDH,40H[BP]例:

MOVAX,[BX+30H]

若(DS)=2000H(BX)=1000H

則內(nèi)存操作數(shù)的物理地址為:

PA=(DS)×10H+(BX)+30H=21030H

指令執(zhí)行后:

(AX)=(21030H)=8976H(3)基址變址尋址方式:操作數(shù)在存儲器中,指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)內(nèi)容之和作為操作數(shù)所在存儲單元的有效地址。(BX)(SI)(BP)(DI)EA=+PA=(DS)*16+(BX)+(SI)或(DI)PA=(SS)*16+(BP)+(SI)或(DI)

例:MOVAX,[BX+DI]或MOVAX,[BX][DI]DS:(BX)+(DI)字存儲單元內(nèi)容送AX。例:MOVAX,[BP+SI]或MOVAX,[BP][SI]SS:(BP)+(SI)字存儲單元內(nèi)容送AX。

使用BX的基址加變址尋址,默認(rèn)段寄存器為DSCPU總線內(nèi)存DSESSSCSIP數(shù)據(jù)暫存器PSW標(biāo)志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運(yùn)算器地址加法器、、、指令1指令2指令3指令4、、、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、、、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器例:

MOVAX,[BX+SI]

若(DS)=4000H(BX)=2000H(SI)=100H

則內(nèi)存操作數(shù)的物理地址為:

PA=(DS)×10H+(BX)+(SI)=42100H

指令執(zhí)行后

(AX)=(42100H)=2345H

(4)相對基址變址尋址方式操作數(shù)在存儲器內(nèi),指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)的內(nèi)容之和再加上位移量(8位或16位),得到操作數(shù)所在單元的有效地址。

(BX)(SI)DISP8

(BP)(DI)DISP16有效地址=++例:

MOVAX,[BX+SI+10H]

若(DS)=4000H(BX)=3000H(SI)=200H

則內(nèi)存操作數(shù)的物理地址為:

PA=(DS)×10H+(BX)+(SI)+10H=43210H

指令執(zhí)行后

(AX)=(43210H)=8877H第三節(jié)8086的指令系統(tǒng)8086的指令系統(tǒng)包含133條基本指令,這些指令功能可以分為6類:

1.數(shù)據(jù)傳送指令(Datatransfer)

2.算術(shù)運(yùn)算指令(Arithmetic)

3.邏輯指令與移位指令(Logic&Shift)

4.控制轉(zhuǎn)移指令(Controltransfer)

5.處理機(jī)控制指令(ProcessorControl)

6.串操作指令(Stringmanipulation)

一.數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是最簡單、最常用的一類指令,它是負(fù)責(zé)把數(shù)據(jù)、地址、或立即數(shù)傳送到寄存器或存儲單元中

。地址總線AB存儲器I/O接口輸入設(shè)備I/O接口數(shù)據(jù)總線DB控制總線CB輸出設(shè)備CPU寄存器,存儲器,I/O端口1.通用傳送指令MOV、PUSH、POP、XCHGreg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data

可實現(xiàn)(1)MOV傳送指令格式

MOVdst,src執(zhí)行

(dst)←(src)例:

①reg/mem/segreg←reg

通用寄存器/存儲器/段寄存器←通用寄存器

MOVAL,BLMOV[BX],ALMOVDS,AX

②reg/segreg←mem

通用寄存器/段寄存器←存儲器

MOVAL,[BX]MOVDS,[BX+SI]

③reg/mem←segreg

通用寄存器/存儲器←段寄存器

MOVBX,CSMOV[BX],DS

④reg/mem←data

通用寄存器/存儲器←立即數(shù)

MOVAl,9MOVBX,OFFSETbufferMOVBYTEPTR[value],0MOVWORDPTR[BX],1MOV指令特點(diǎn)及注意事項:

雙操作數(shù)指令(注意雙操作指令的特點(diǎn))可進(jìn)行字節(jié)或字傳送不允許存儲器傳送到存儲器MOV[BX],[value]MOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL

可對DS、ES、SS賦值但不允許立即數(shù)直接傳送給段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AXCS不能做目的操作數(shù),不能通過傳送指令改變CS的值

MOVCS,AXMOVAX,CS

不允許段寄存器傳送到段寄存器

MOVES,DSMOVAX,DSMOVES,AXD:\MASM>DEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-

MOV指令應(yīng)用例:實現(xiàn)將AREA1開始的100個數(shù)據(jù)傳送到AREA2開始的單元?!瑼REA1:AREA2:100個數(shù)據(jù)分析題意:

①可以用200條MOV指令來完成100個數(shù)據(jù)傳送,指令操作重復(fù),每個數(shù)據(jù)傳送后的地址是變化的。

②可以利用循環(huán), 但每循環(huán)一次要修改地址(源地址和目的地址),必須把地址放在寄存器當(dāng)中,用寄存器間接尋址來尋找操作數(shù).得到如下程序:

MOVSI,OFFSET

AREA1 MOVDI,OFFSET

AREA2 MOVCX,100AGAIN: MOVAL,[SI] MOV[DI],AL

INCSI ;修改地址指針

INCDI ;修改地址指針

DECCX ;修改個數(shù)

JNZAGAIN

…(2)PUSH(Pushwordontostack)POP(Popwordoffstack)

這是兩條堆棧操作指令。

1)先介紹一下什么是堆棧,為什么需要堆棧

堆棧是按照先進(jìn)后出原則組織的一段內(nèi)存區(qū)域。通常用于存放一些重要數(shù)據(jù),

如:程序的地址、或是需要恢復(fù)的數(shù)據(jù)。為方便數(shù)據(jù)的存放和恢復(fù),設(shè)置專門的指針,指向堆棧中要操作的單元。段值由SS給出,偏移地址由SP給出

SS→堆棧段寄存器(stacksegment)SP→堆棧指針寄存器(stackpoint)SS:SP

特點(diǎn):下推式的(規(guī)定堆棧設(shè)置在堆棧段內(nèi))改變SP的內(nèi)容,隨著推入堆棧內(nèi)容增加,SP的值減少。先進(jìn)后出工作原則(LastInFirstOut簡稱LIFO)

堆棧在內(nèi)存中的情況:堆棧在內(nèi)存中的情況:可以用一條立即數(shù)傳送指令給SP賦值,確定SP在SS段中的初始位置。例:設(shè):(SS)=9000H,堆棧段為64KBMOVSP,0E200H ;(SP)=0E200H則:

整個堆棧段的物理地址范圍為:

90000H~9FFFFH

棧頂?shù)奈锢淼刂窞椋?E200H堆棧在內(nèi)存中的情況如右圖所示:堆棧在內(nèi)存中的情況2)堆棧操作指令

(堆棧操作指令有兩條):

入棧指令格式:PUSHsrc ;(SP)(SP)-2 ((SP)+1,(SP))(src)

把一個字從源操作數(shù)(src)由SP指向堆棧頂部。

出棧指令格式:POPdest ;(dest)((SP)+1,(SP)) (SP)(SP)+2把現(xiàn)行SP所指向堆棧頂部的一個字指定的目的操作數(shù)(dest),同時進(jìn)行修改堆棧指針的操作。

SS:SP

SS:SP

(src)SS:SP

SS:SP

(dst)PUSH入棧操作格式

PUSHsrc執(zhí)行(SP)←(SP)-2

(SS:SP)←(src)特點(diǎn):

單操作數(shù)指令操作數(shù)為16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字類型SS:SP

SS:SP

(src)例:

PUSHAX若執(zhí)行前:

(SS)=2000H(SP)=1002H(SS:SP)=

2010H

(AX)=1234H3B2A10低高20地址SS:SP2000:1002指令執(zhí)行前(AX)=1234h則執(zhí)行PUSHAX后:

(SS)=2000H(SP)=1000H(SS:SP)=1234H(AX)=1234H123410低高20地址SS:SP2000:1000指令執(zhí)行后(AX)=1234h不變減2變不變

特點(diǎn):單操作數(shù)指令操作數(shù)為16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允許是CSmem:字類型

POP出棧操作SS:SP

SS:SP

(dst)格式

POPdst執(zhí)行(dst)←(SS:SP)(SP)←(SP)+2若執(zhí)行前:

(SS)=2000H(SP)=1000H(SS:SP)=1234H

(BX)=5678H123410低高20SS:SP2000:1000指令執(zhí)行前地址(BX)=5678h例:POPBX123410低高20SS:SP2000:1002指令執(zhí)行后地址(BX)=1234h則執(zhí)行POPBX后:

(SS)=2000H(SP)=1002H

(SS:SP)=2010H

(BX)=1234H

不變加2變

堆棧使用的場合用堆棧保存恢復(fù)信息

子程序的調(diào)用、返回以及中斷調(diào)用、返回

用堆棧傳送數(shù)據(jù)(程序設(shè)計中介紹)主程序子程序:子程序:在一個實際程序中,有些操作要執(zhí)行多次, 把要重復(fù)執(zhí)行(subroutine)操作編為子程序。 也常把一些常用的操作標(biāo)準(zhǔn)化、通用化的子程序。主程序(Mainprogram)——往往要調(diào)用子程序 或處理中斷,

暫停主程序,執(zhí)行子程序或中斷服務(wù)程序。調(diào)用子程序時需保留內(nèi)容:①調(diào)用子程序:將CALL下條指令地址即IP值保留下來 (8088中碼段寄存器CS和指令指針I(yè)P),才能保證子程序執(zhí)行完后準(zhǔn)確返回主程序繼續(xù)執(zhí)行。②執(zhí)行子程序時,通常用到內(nèi)部寄存器,執(zhí)行結(jié)果會影響標(biāo)志位,必須在調(diào)用子程序之前將現(xiàn)狀保護(hù)起來。③子程序嵌套或子程序遞歸(自調(diào)自)保留許多信息,而且保證正確返回(且后進(jìn)先出)。后保留先取出原則(即LIFO-LASTInFirstout)。注意:SP——堆棧指針,始終指向棧頂。

SP初值用MOVSP,data來設(shè)定。

下邊詳細(xì)說明一下堆棧用途:存放CPU寄存器或存儲器中暫時不使用的數(shù)據(jù),

使用數(shù)據(jù)時將其彈出:

PUSHAX ;將(AX)入棧(AX)(AX)使用數(shù)據(jù)時將其彈出:

POPBX調(diào)用子程序(或過程)或發(fā)生中斷時要保護(hù)斷點(diǎn)的地址,子程序或中斷返回時恢復(fù)斷點(diǎn)。子程序嵌套斷點(diǎn)地址壓入和彈出情況注意事項

堆棧是一重要數(shù)據(jù)結(jié)構(gòu),使用堆棧應(yīng)有明確目的。不亂用堆棧操作,不亂修改堆棧內(nèi)容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET

亂修改

SS和SP的內(nèi)容包括亂用BP參與的存儲器操作數(shù)

亂用指令

PUSH和POP指令只能對字操作。

PUSHALPOPBYTEPTR[BX]

可以對段寄存器操作但POP不能對CS操作

PUSHDSPUSHCSPOPES

POPCS自學(xué)堆棧應(yīng)用:比較下邊兩個程序運(yùn)行結(jié)果?

例:用BP的基址指令代替POP指令

…MOVBP,SPPUSHAXPUSHBXPUSHCX …MOVCX,[BP-6]

MOVBX,[BP-4]MOVAX,[BP-2] …ADD

SP,6例:壓入堆棧的內(nèi)容與彈出內(nèi)容順序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX (3)XCHG交換指令

格式

XCHGoprd1,oprd2執(zhí)行

(oprd1)(oprd2)regregregmemmemreg

可實現(xiàn)例

XCHGAX,BX字操作執(zhí)行前(AX)=1122H(BX)=3344H

執(zhí)行后(AX)=3344H(BX)=1122H

例XCHGAH,BL字節(jié)操作執(zhí)行前(AX)=1122H(BX)=3344H

執(zhí)行后(AX)=4422H(BX)=3311HXCHGoprd1,oprd2注意事項:

雙操作數(shù)指令可進(jìn)行字或字節(jié)操作,不影響標(biāo)志位。不允許對立即數(shù)、段寄存器做操作數(shù)

XCHGAX,4

XCHGBX,DS

存儲器之間不能交換,兩個操作數(shù)中必須有一個在寄存器中;

XCHG[BX],[DI] (錯)(1)輸入輸出指令(InputandOutput)

輸入輸出指令共兩種:

IN(Inputbyteorword)

OUT

(Outputbyteorword)

輸入指令用于CPU從外設(shè)端口接受數(shù)據(jù),輸出指令用于CPU向外設(shè)端口發(fā)送數(shù)據(jù)。

無論接受還是發(fā)送數(shù)據(jù),必須通過累加器AX(字)或AL(字節(jié)),又稱累加器專用傳送指令。

輸入、輸出指令不影響標(biāo)志位。2.累加器專用傳送指令每個外設(shè)要占幾個端口:數(shù)據(jù)口,狀態(tài)口和控制口。由圖可見:信息交換要通過端口:在IBMPC機(jī)里,可以配接許多外部設(shè)備,每個外設(shè)與CPU之間交換數(shù)據(jù),狀態(tài)信息和控制命令,每一種信息交換都要通過一個端口來進(jìn)行。端口數(shù):外部設(shè)備最多有65536個I/O端口。

A0~A15譯碼形成。端口號:端口號(即外設(shè)端口地址)為0000H~FFFFH。

PC機(jī)端口數(shù):僅使用A0~A9譯碼形成I/O口地址,即1024H個口地址PC機(jī)端口號:0000H~03FFH

其中:A9=1,表示擴(kuò)充槽上的口地址。長格式:端口號中前256個端口(0~FFH),可以直接寫在指令中,端口號代替指令中的PORT,機(jī)器指令用二字節(jié)表示,第二字節(jié)就是端口號。短格式:當(dāng)端口號≥256時,只能使用短格式,必須先把端口號放到DX寄存器中。不需要用任何段寄存器來修改它的值。1)IN(Inputbyteorword)輸入指令格式:INacc,port;(acc)(port)具體形式有四種:長格式:

INAL,data8;端口地址8位,輸入一個字節(jié)

INAX,data8;端口地址8位,輸入一個字短格式:

INAL,DX ;端口地址16位,輸入一個字節(jié)

INAX,DX ;端口地址16位,輸入一個字必須通過累加器AX(字)或AL(字節(jié))輸入數(shù)據(jù)。2)OUT(Outputbyteorword)輸出指令格式:OUTport,acc ;(port)(acc)具體形式有四種:長格式:OUTdata8,AL;端口地址8位,輸出一個字節(jié)

OUTdata8,AX;端口地址8位,輸出一個字短格式:OUTDX,AL;端口地址16位,輸出一個字節(jié)

OUTDX,AX;端口地址16位,輸出一個字必須通過累加器AX(字)或AL(字節(jié))輸出數(shù)據(jù)。例1:實現(xiàn)(29H)(28H)→(DATA_WORD)長格式:

INAX,28H MOVDATA_WORD,AX例2:從端口3FCH送一個字到AX寄存器短格式: MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

例3:實現(xiàn)將(AL)→(05H)長格式: OUT5,AL;(05H)←(AL)(2)

XLAT(Translate)字節(jié)轉(zhuǎn)換指令(換碼指令):

該指令不影響標(biāo)志位。格式:XLATstr_table ;(AL)←((BX)+(AL))或XLAT str_table——表格符號地址(首地址), 只是為了提高可讀性而設(shè)置,匯編時仍用BX。

XLAT指令使用方法:先建立一個字節(jié)表格;表格首偏移地址存入BX;需要轉(zhuǎn)換代碼的序號(相對與表格首地址位移量)存入AL;(表中第一個元素的序號為0)執(zhí)行XLAT指令后,表中指定序號的元素存于AL中。

(AL)為轉(zhuǎn)換的代碼。XLAT指令應(yīng)用:若把字符的掃描碼轉(zhuǎn)換成ASCII碼;或數(shù)字0~9轉(zhuǎn)換成7段數(shù)碼所需要的相應(yīng)代碼(字形碼)等就要用XLAT指令。例:內(nèi)存的數(shù)據(jù)段中有一張十六進(jìn)制數(shù)字的ASCII碼表。

首地址為:Hex_table,欲查出表中第10個元素(‘A’)執(zhí)行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLATHex_table假設(shè): (DS)=F000H,

Hex_table=0040H

(AL)=0AH執(zhí)行XLAT以后:(AL)=41H=(F004AH), 即“A”的ASCII碼。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16進(jìn)制數(shù)的ASCII碼表3.目的地址傳送指令(Address-objecttransfer)8086/8088提供三條:

地址指針寫入指定寄存器或寄存器對指令。(1)LEA(LoadEffectiveAddress)(2)LDS(LoadpointerusingDS)(3)LES(LoadpointerusingES)(1)LEA有效地址傳送格式

LEAreg,mem執(zhí)行(reg)←mem的EA

即寄存器←存儲器操作數(shù)的偏移地址

執(zhí)行后

(BX)=1000H注意:

OFFSET是匯編程序提供的一個操作符,不是CPU的指令.LEABX,

buffer例

buffer是一個符號地址表示的內(nèi)存操作數(shù)(變量)。…...12h34h56h…...buffer內(nèi)存DS:1000h若變量buffer的偏移地址=1000H等價于

MOVBX,OFFSETbuffer

LEAreg,mem特點(diǎn)及注意事項:目的操作數(shù)reg應(yīng)是16位通用寄存器

LEAES,[BX]LEAAL,bufferLEA6,[BX+SI]LEA[DI],buffer

源操作數(shù)應(yīng)是存儲器操作數(shù)

LEABX,AX

傳送的是內(nèi)存單元的有效地址,與其內(nèi)容無關(guān)?!?..12h34h56h…...buffer內(nèi)存(2)LDS(LoadpointerusingDS)格式:LDSreg16,mem32 ;(reg16)←(EA) (DS)←((EA)+2))功能:把源操作數(shù)指定的4個相繼字節(jié)送指令指定的寄存器及DS寄存器中。

前兩個單元內(nèi)容(16位偏移量)裝入指定通用寄存器,后兩個單元內(nèi)容(段地址)裝入到DS段寄存器。用于寫遠(yuǎn)地址指針。例:假設(shè):

(DS)=C000H指令: LDSSI,[0010H]執(zhí)行指令后:(SI)=0180H(DS)=2000H

80H01H00H20HC000H:0010H(DS)C0011HC0012HC0013H......存儲器(3)LES(LoadpointerusingES)格式:LESreg16,mem32 ;(reg16)←(EA) (ES)←((EA)+2))功能:把源操作數(shù)指定的4個相繼字節(jié)送指令指定的寄存器及ES寄存器中。前兩個單元內(nèi)容(16位偏移量)裝入指定通用寄存器,后兩個單元內(nèi)容(段地址)裝入到ES段寄存器。此指令常常指定DI寄存器。用于寫遠(yuǎn)地址指針。例:假設(shè):

(DS)=B000H (BX)=080AH指令: LESDI,[BX]執(zhí)行指令后: (DI)=05A2H (ES)=4000HA2H05H00H40HB000H:080AH(DS)B080BHB080CHB080DH......存儲器(BX)4.標(biāo)志傳送指令(Flagregistertransfer)采用了隱含寄存器(AH、Flags)操作數(shù)方式。

8088有四條標(biāo)志傳送操作指令:(1). LAHF(LoadAHfromflags)(2). SAHF(StoreAHintoflags)(3). PUSHF(Pushflagsontostack)(4). POPF(Popflagsoffstack)

(1).LAHF(LoadAHfromflags)格式:LAHF;(AH)←(PSW的低字節(jié))功能:標(biāo)志寄存器低八位(AH)。LAHF指令操作圖示意(2). SAHF(StoreAHintoflags) 格式:SAHF;(PSW的低字節(jié))←(AH) 功能:(AH)送標(biāo)志寄存器低八位。SFZFAFPFCF01234567TFIFDFOF8910111213141501234567FLAGSAHSS:SP

SS:SP

(PSW)(4).POPF標(biāo)志出棧格式

POPF執(zhí)行(PSW)←

(SS:SP)(SP)←

(SP)+2SS:SP

SS:SP

(PSW)(3).PUSHF標(biāo)志入棧格式

PUSHF執(zhí)行(SP)←

(SP)-2

(SS:SP)←

(PSW)注意:(1)標(biāo)志位的影響LAHF、PUSHF不影響標(biāo)志位,SAHF、POPF由裝入的值確定標(biāo)志位的值,即影響標(biāo)志位。(2)PUSHF、POPF用于保護(hù)調(diào)用過程前(PSW),過程返回后恢復(fù)。例:

… PUSH AX PUSHCX PUSHF CALLTRANS

POPFPOPCXPOPAX…二.算術(shù)運(yùn)算指令指令分類:特點(diǎn):帶符號數(shù)用補(bǔ)碼表示如MOVAX,-1

等價于

MOVAX,0FFFFh

對加、減運(yùn)算,不區(qū)分無符號數(shù)、帶符號數(shù)對乘、除運(yùn)算,區(qū)分無符號數(shù)、帶符號數(shù)可進(jìn)行字節(jié)或字操作影響狀態(tài)標(biāo)志十進(jìn)制運(yùn)算方法:當(dāng)數(shù)據(jù)用組合(壓縮)或分離(非壓縮)BCD碼表示時,為使運(yùn)算的結(jié)果仍為BCD碼表示,需對結(jié)果進(jìn)行調(diào)整。

十進(jìn)制運(yùn)算=二進(jìn)制運(yùn)算+十進(jìn)制調(diào)整

BCD碼(BinaryCodedDecimal)

用二進(jìn)制編碼表示十進(jìn)制數(shù)。常用8421BCD碼,與十進(jìn)制數(shù)碼對應(yīng)關(guān)系:例

48的BCD碼為(01001000)BCD

根據(jù)在內(nèi)存的存放形式,分組合BCD碼和分離BCD碼

組合BCD碼(又稱壓縮BCD碼)(PackedBCDformat)

用4位二進(jìn)制數(shù)表示一個十進(jìn)制數(shù)位,一字節(jié)存放2個BCD碼。

整個十進(jìn)制數(shù)形式為一個順序的4位為一組的數(shù)串。例:9502d的壓縮BCD碼應(yīng)表示為:

9 5 02分離BCD碼(又稱非壓縮BCD碼)(UnpackedBCDformat)

用8位為一組表示一個十進(jìn)制數(shù)位,一字節(jié)存放1個BCD碼。

8位中的低4位表示8421的BCD碼,而高4位沒有意義。例:9502d的非壓縮BCD碼則表示為:

9 5 0 21001010100000010

ASCII碼是一種分離BCD碼 數(shù)字的ASCII的高4位0011無意義; 低4位是以8421碼形式表示的十進(jìn)制數(shù)位。 符合分離BCD碼高4位無意義的規(guī)定。

2的ASCII碼:

高4位0011無意義當(dāng)數(shù)據(jù)用組合或分離BCD碼表示時,為使運(yùn)算的結(jié)果仍為BCD碼表示,需對結(jié)果進(jìn)行調(diào)整。十進(jìn)制運(yùn)算=二進(jìn)制運(yùn)算+十進(jìn)制調(diào)整例(00001000)

壓縮BCD

+(00001001)

壓縮BCD

=(00010111)

壓縮BCD計算機(jī)計算過程看作壓縮BCD0000100008+0000100109

00010001

11

二進(jìn)制運(yùn)算十進(jìn)制調(diào)整+00000110

00010111171.加法運(yùn)算指令

ADD、ADC為雙操作數(shù)指令

INC為單操作數(shù)指令除INC指令不影響CF外,其余指令6個狀態(tài)標(biāo)志均據(jù)結(jié)果置位ADC帶進(jìn)位加法,實現(xiàn)字以上運(yùn)算(進(jìn)位是上條指令運(yùn)算的進(jìn)位)

CFA1H

1100111110100001+62A0H+0110001010100000111111111113241H0011001001000001例1

加法指令:編程完成

CFA1H+62A0HMOVDX,0CFA1HADDDX,62A0H執(zhí)行后:(DX)=3241HCF=1,OF=0,SF=0,ZF=0(注意:CF和OF的判斷方法)OF=1, 8位帶符號數(shù)相加,和超出范圍(-128~+127),16位帶符號數(shù)相加,和超出范圍(-32768~+32767);

加法:兩個正數(shù)相加,結(jié)果為負(fù);或兩個負(fù)數(shù)相加,結(jié)果為正。 (兩個異號數(shù)相加不可能溢出)

減法:

兩個異號數(shù)相減,結(jié)果與減數(shù)相同。(兩個同號數(shù)相減不可能溢出)

運(yùn)算結(jié)果錯誤。CF=1,8位無符號數(shù)相加,和超過255,

16位無符號數(shù)相加,和超過65535。 運(yùn)算結(jié)果準(zhǔn)確其他條件標(biāo)志(SF,AF,PF,ZF)根據(jù)定義設(shè)定。三組指令執(zhí)行后的結(jié)果均為:(AL)=0FDH,CF=0,OF=0,SF=1,ZF=0

MOVAL,0F1HADDAL,0CH

MOVAL,241ADDAL,12

MOVAL,-15ADDAL,12第一章中的例題

F1H+0CHFDH二進(jìn)制運(yùn)算241+12253看作無符號數(shù)(-15)+12

(-3)看作帶符號數(shù)B0F1040C、、、、、、第一條指令第二條指令三組機(jī)器碼相同:對加、減運(yùn)算,CPU計算時不區(qū)分無符號數(shù)、帶符號數(shù)例2

加1指令:

INCAL執(zhí)行前(AL)=FFH

執(zhí)行后:

(AL)=00HCF=不變,OF=0,ZF=1,SF=0

FFH+01H

11

00H

01FFH+0001H進(jìn)位11

0200H

例3

value是一個字變量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=01FFHvalueFF21000H

01執(zhí)行前value0021000H

02執(zhí)行后執(zhí)行后:(21000H)=0200HCF=不變,OF=0,ZF=0,SF=0注意:INCvalue是內(nèi)存單元內(nèi)容加1,而非地址加1INCvalue或?qū)懗?INC[value]例4

將buffer為首的4個字節(jié)內(nèi)存內(nèi)容相加,存放在AL中。

buffer1AB7C5D6注意若編程如下,MOVCX,4MOVAL,0exit:ADDAL,[buffer]INCbufferDECCXJNZexit

不能實現(xiàn),為什么?

…...MOVCX,4

LEABX,bufferMOVAL,0exit:ADDAL,[BX]

INCBXDECCXJNZexit實現(xiàn)的是(1A)+(1B)+(1C)+(1D)指令I(lǐng)NCbuffer將buffer指向的內(nèi)容加1,而不是地址buffer加1例5

帶進(jìn)位加:兩雙字相加0002F365H+0005E024H=?MOVAX,0F365H①ADD

AX,0E024H

②MOVBX,0002H③ADC

BX,0005H④

0002F365H+

0005E024H

進(jìn)位1

0008

D389H結(jié)果存放在:

0008D389(BX)(AX)執(zhí)行完①、②:(AX)=D389HCF=1,OF=0,SF=1,ZF=0

執(zhí)行完③、④:(BX)=0008HCF=0,OF=0,SF=0,ZF=0分析:8086/8088只能按字節(jié)或字相加。位數(shù)在字以上的操作數(shù),先加低位,再加高位,加高位時加入從低位產(chǎn)生的進(jìn)位。用途舉例計算兩個多字節(jié)數(shù)相加3B74AC60F8H+20D59E36C1H=?兩個多字節(jié)數(shù)存放在:DATA1,DATA2的開始單元。流程圖多字節(jié)數(shù)內(nèi)存存放程序:

MOVCX,5 MOVSI,0 ;清SI

CLC

;清CFLOOPER: MOVAL,DATA2[SI]

ADCDATA1[SI],AL INCSI ;(SI)+1(SI) DECCX ;(CX)-1(CX) JNZLOOPER ;(CX)0轉(zhuǎn)

HLT ;停機(jī)以8位二進(jìn)制數(shù)為例分析一下數(shù)的溢出與進(jìn)位情況:下面分4種情況加以討論:(1) 帶符號數(shù)和無符號數(shù)都不溢出(2) 無符號數(shù)溢出(3) 帶符號數(shù)溢出(4) 帶符號數(shù)和無符號數(shù)都溢出(1) 帶符號數(shù)和無符號數(shù)都不溢出。(2) 無符號數(shù)溢出二進(jìn)制數(shù)看作無符號數(shù)看作帶符號數(shù)0000011111111011+000000107251+258+7-5++2相加標(biāo)志CF=1,OF=0CF=1OF=0溢出無符號數(shù)溢出溢出結(jié)果應(yīng)為2,錯不溢出異號數(shù)相加不可能有溢出CF=1(3) 帶符號數(shù)溢出(4) 帶符號數(shù)和無符號數(shù)都溢出結(jié)論:(1)帶符號數(shù)相加溢出

根據(jù)OF=1?,判斷帶符號數(shù)產(chǎn)生溢出?

OF=1,同符號數(shù)相加,結(jié)果符號與其相反,產(chǎn)生溢出;

OF=0,同符號數(shù)相加,結(jié)果符號與其相同,不產(chǎn)生溢出; 異號數(shù)相加,不可能溢出。(2)無符號數(shù)相加溢出

根據(jù)CF=1?,判斷無符號數(shù)產(chǎn)生溢出?

CF=1,無符號數(shù)相加產(chǎn)生溢出,但結(jié)果并沒有錯, 只是結(jié)果放不下。

2.減法運(yùn)算指令

SUB、SBB、

CMP為雙操作數(shù),DEC、NEG為單操作數(shù)

SBB為帶進(jìn)位減法(進(jìn)位是上條指令運(yùn)算的進(jìn)位)。

除DEC不影響CF標(biāo)志外,其余指令6個狀態(tài)標(biāo)志均據(jù)結(jié)果置位。

NEG求補(bǔ)運(yùn)算,等價于用0減去操作數(shù)。其對標(biāo)志位的影響,由0減去該操作數(shù)的過程決定。例1

減法指令:編程完成2D04H–3AB0H執(zhí)行后:

(AX)=0F254HCF=1,OF=0,SF=1,ZF=02D04H0010110100000100-3AB0H-0011101010110000

11111111111F254H1111001001010100MOVAX,2D04HSUBAX,3AB0H

借位也可對(-3AB0)取補(bǔ)作加法0010110100000100

+1100010101010000111111001001010100減法進(jìn)位取反CF=1,其它OF=0,SF=1,ZF=0例2

帶借位減法:用指令完成兩雙字相減運(yùn)算

05467A70H

-F001A543HMOVAX,7A70HSUBAX,A543HMOVBX,0546HSBBBX,0F001H例3

減1指令:value是一個字節(jié)變量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=00HDECvalue

執(zhí)行后:(21000H)=0FFH

CF=不變,OF=0,ZF=0,SF=1注意:DECvalue

是內(nèi)存單元內(nèi)容減1,而非地址減1

00H-01H11FFH

例4

求補(bǔ)指令:

MOVAH,80HNEGAH

00H00000000B

-80H-10000000B

11

80H10000000B執(zhí)行后:

(AL)=80H,CF=1,OF=0,ZF=0,SF=1例5:求絕對值在內(nèi)存中,從AREA1開始存放100個帶符號數(shù)。求各數(shù)的絕對值存于AREA2的開始單元。流程圖程序:

LEASI,AREA1 LEADI,AREA2 MOVCX,100CHECK:MOVAL,[SI] ADDAL,0;(AL)內(nèi)容不變,置標(biāo)志

JNSNEXT ;SF=0轉(zhuǎn)NEXT

NEGAL ;負(fù)數(shù)求補(bǔ)

NEXT:MOV[DI],AL;送目標(biāo)

INCSI INCDI DECCX JNZCHECK HLT

CMPoprd1,oprd2;(oprd1)-(oprd2)①據(jù)ZF判斷兩數(shù)是否相等CMPA,BZF=1兩數(shù)相等,A=B;ZF=0兩數(shù)不等,A≠B②據(jù)ZF和CF判斷兩無符號數(shù)關(guān)系CF=1A低于BCF=0A高于或等于BCF=1或ZF=1A低于等于BCF=0且ZF=0A高于B利用CMP執(zhí)行后的標(biāo)志值,比較兩操作數(shù)之間的關(guān)系比較指令CMP,進(jìn)行兩操作數(shù)相減操作,但只影響標(biāo)志值,不影響操作數(shù)(減的結(jié)果不保存)比較指令:條件轉(zhuǎn)移指令判斷條件

低于

JB

next

CF=1

低于或等于

JBE

next

CF=1或

ZF=1

高于

JA

next

CF=0且

ZF=0

高于或等于

JAE

next

CF=0

CMPAX,BX;比較

JAEabove;高于或等于則跳轉(zhuǎn)

XCHGAX,BX;低于則交換

above:、、、例將AX和BX中較大的無符號數(shù),存于AX中比較指令常常根據(jù)條件(標(biāo)志)轉(zhuǎn)移,無符號數(shù)轉(zhuǎn)移指令如下:

CMPA,B③用ZF、SF和OF判斷兩帶符號數(shù)關(guān)系

OF=0,不溢出情況,

SF=0,A≥BSF=1,A<BOF=0,SF=0A≥BOF=0,SF=1A<BOF=1,SF=1A>BOF=1,SF=0A<B

0

-

1

正-負(fù)=負(fù),結(jié)果SF=1,OF=1

1

但,正>負(fù),知A>B

1

-0

負(fù)-正=正,結(jié)果SF=0,OF=1

0

但,負(fù)<正,知A<B

OF=1,溢出情況,(由符號位可決定是否溢出)結(jié)合ZF,得到結(jié)論:邏輯運(yùn)算:條件轉(zhuǎn)移指令判斷條件

小于

JL

next

SF∨

OF

=

1

小于或等于

JLE

next

(SF

OF)∨ZF=1

大于

JG

next

(SF

OF)∨ZF

=0

大于或等于

JGE

next

SF∨

OF=0例將AX和BX中較大的帶符號數(shù),存于AX中

CMPAX,BX;比較

JGEgreat

;大于或等于則跳轉(zhuǎn)

XCHGAX,BX;小于則交換

great:、、、比較指令常常根據(jù)條件(標(biāo)志)轉(zhuǎn)移,帶符號數(shù)轉(zhuǎn)移指令如下:3.乘法指令無符號數(shù)乘法帶符號數(shù)乘法MULsrcIMULsrc

單操作數(shù)指令源操作數(shù)(乘數(shù))類型決定操作類型目的操作數(shù)(被乘數(shù))隱含。字節(jié)乘AL字乘AX

字節(jié)相乘的結(jié)果存放在AX中字相乘的結(jié)果存放在DX、AX中

MUL用于無符號數(shù)運(yùn)算

IMUL用于帶符號數(shù)運(yùn)算

影響CF和OF,對其他條件碼無定義(不確定)(1)指令MUL

字節(jié)相乘:AH=0,CF=OF=0,否則CF=OF=1

字相乘:DX=0,CF=OF=0,否則CF=OF=1

即:

積的高一半為0(字節(jié)乘(AH)=0,字乘(DX)=0),則CF=0,OF=0;否則CF=1,OF=1。對其它條件碼不確定(無定義)。狀態(tài)不定。

(2)指令I(lǐng)MUL

字節(jié)相乘:AH=0或AH=FFH,CF=OF=0,否則CF=OF=1

字相乘:DX=0或DX=FFFFH,CF=OF=0,否則CF=OF=1

即:積的高一半為低一半的符號擴(kuò)展,則CF=0,OF=0;

積的高一半部分不是低一半部分符號的擴(kuò)展(包括結(jié)果的有效數(shù)字,不光是符號部分),則CF=1,OF=1。積的高一半為低一半的符號擴(kuò)展的含義:

乘積為正,則(AH)=00H或(DX)=0000H

乘積為負(fù),則(AH)=FFH或(DX)=FFFFH問題思考:乘法中為什么要用MUL,IMUL指令?例:結(jié)論:帶符號數(shù)相乘,必須使用IMUL指令 無符號數(shù)相乘,必須使用MUL指令 否則,出錯。無符號數(shù)帶符號數(shù)(AL)=3(BL)=(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論