版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年旅游服務(wù)代理合同樣本
- 2025年度綠植花卉租賃與城市景觀提升合同范本4篇
- 2025年度綠化工程環(huán)境保護(hù)與節(jié)能減排合同范本4篇
- 2025版綠色建筑項目租賃與能源管理合同4篇
- 2025年度個人二手房交易安全協(xié)議范本4篇
- 個人間短期資金周轉(zhuǎn)合同書版
- 個人買賣合同范文(2024版)
- 二零二五年度風(fēng)力發(fā)電機(jī)組安裝及運(yùn)營維護(hù)協(xié)議3篇
- 2025年度個稅起征點(diǎn)調(diào)整下簽勞務(wù)合同稅務(wù)籌劃合作協(xié)議
- 二零二五年度素食餐飲品牌授權(quán)合作合同
- 車站值班員(中級)鐵路職業(yè)技能鑒定考試題及答案
- 極簡統(tǒng)計學(xué)(中文版)
- JTG∕T E61-2014 公路路面技術(shù)狀況自動化檢測規(guī)程
- 高中英語短語大全(打印版)
- 2024年資格考試-對外漢語教師資格證筆試參考題庫含答案
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運(yùn)算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗
- 五年級數(shù)學(xué)應(yīng)用題100道
評論
0/150
提交評論