




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
及秦紅磊金天微機原理接口技術第三章微處理器指令系統(tǒng)(InstructionSet)第一節(jié):指令的基本格式第二節(jié):8086的尋址方式第三節(jié):8086的指令系統(tǒng)第四節(jié):其它微處理器的指令擴展第五節(jié):中斷指令和DOS系統(tǒng)功能調(diào)用指令系統(tǒng)是計算機硬件和軟件之間的橋梁,是匯編語言設計的基礎。操作碼操作數(shù)匯編指令:操作碼:指令操作類型;操作數(shù):指令所需操作數(shù)或操作數(shù)的地址;操作數(shù)可以有一個,也可以有兩個,一個源操作數(shù),一個目的操作數(shù)。例:MOVAX,CX;將CX的內(nèi)容送入AX中。微機算機處理器的指令由幾十種或上百種組成,每種指令由兩個字段(Field)構成:第一節(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標志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運算器地址加法器、、、指令1指令2指令3指令4、、、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、、、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器
寄存器尋址方式的操作數(shù)是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器: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的寄存器尋址,默認段寄存器為DSCPU總線內(nèi)存DSESSSCSIP數(shù)據(jù)暫存器PSW標志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運算器地址加法器、、、指令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)之和。可用的寄存器有BX、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的基址加變址尋址,默認段寄存器為DSCPU總線內(nèi)存DSESSSCSIP數(shù)據(jù)暫存器PSW標志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運算器地址加法器、、、指令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.算術運算指令(Arithmetic)
3.邏輯指令與移位指令(Logic&Shift)
4.控制轉(zhuǎn)移指令(Controltransfer)
5.處理機控制指令(ProcessorControl)
6.串操作指令(Stringmanipulation)
一.數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是最簡單、最常用的一類指令,它是負責把數(shù)據(jù)、地址、或立即數(shù)傳送到寄存器或存儲單元中
。地址總線AB存儲器I/O接口輸入設備I/O接口數(shù)據(jù)總線DB控制總線CB輸出設備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指令特點及注意事項:
雙操作數(shù)指令(注意雙操作指令的特點)可進行字節(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指令應用例:實現(xiàn)將AREA1開始的100個數(shù)據(jù)傳送到AREA2開始的單元。……AREA1:AREA2:100個數(shù)據(jù)分析題意:
①可以用200條MOV指令來完成100個數(shù)據(jù)傳送,指令操作重復,每個數(shù)據(jù)傳送后的地址是變化的。
②可以利用循環(huán), 但每循環(huán)一次要修改地址(源地址和目的地址),必須把地址放在寄存器當中,用寄存器間接尋址來尋找操作數(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)先介紹一下什么是堆棧,為什么需要堆棧
堆棧是按照先進后出原則組織的一段內(nèi)存區(qū)域。通常用于存放一些重要數(shù)據(jù),
如:程序的地址、或是需要恢復的數(shù)據(jù)。為方便數(shù)據(jù)的存放和恢復,設置專門的指針,指向堆棧中要操作的單元。段值由SS給出,偏移地址由SP給出
SS→堆棧段寄存器(stacksegment)SP→堆棧指針寄存器(stackpoint)SS:SP
特點:下推式的(規(guī)定堆棧設置在堆棧段內(nèi))改變SP的內(nèi)容,隨著推入堆棧內(nèi)容增加,SP的值減少。先進后出工作原則(LastInFirstOut簡稱LIFO)
堆棧在內(nèi)存中的情況:堆棧在內(nèi)存中的情況:可以用一條立即數(shù)傳送指令給SP賦值,確定SP在SS段中的初始位置。例:設:(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),同時進行修改堆棧指針的操作。
SS:SP
SS:SP
(src)SS:SP
SS:SP
(dst)PUSH入棧操作格式
PUSHsrc執(zhí)行(SP)←(SP)-2
(SS:SP)←(src)特點:
單操作數(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變不變
特點:單操作數(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變
變
堆棧使用的場合用堆棧保存恢復信息
子程序的調(diào)用、返回以及中斷調(diào)用、返回
用堆棧傳送數(shù)據(jù)(程序設計中介紹)主程序子程序:子程序:在一個實際程序中,有些操作要執(zhí)行多次, 把要重復執(zhí)行(subroutine)操作編為子程序。 也常把一些常用的操作標準化、通用化的子程序。主程序(Mainprogram)——往往要調(diào)用子程序 或處理中斷,
暫停主程序,執(zhí)行子程序或中斷服務程序。調(diào)用子程序時需保留內(nèi)容:①調(diào)用子程序:將CALL下條指令地址即IP值保留下來 (8088中碼段寄存器CS和指令指針I(yè)P),才能保證子程序執(zhí)行完后準確返回主程序繼續(xù)執(zhí)行。②執(zhí)行子程序時,通常用到內(nèi)部寄存器,執(zhí)行結(jié)果會影響標志位,必須在調(diào)用子程序之前將現(xiàn)狀保護起來。③子程序嵌套或子程序遞歸(自調(diào)自)保留許多信息,而且保證正確返回(且后進先出)。后保留先取出原則(即LIFO-LASTInFirstout)。注意:SP——堆棧指針,始終指向棧頂。
SP初值用MOVSP,data來設定。
下邊詳細說明一下堆棧用途:存放CPU寄存器或存儲器中暫時不使用的數(shù)據(jù),
使用數(shù)據(jù)時將其彈出:
PUSHAX ;將(AX)入棧(AX)(AX)使用數(shù)據(jù)時將其彈出:
POPBX調(diào)用子程序(或過程)或發(fā)生中斷時要保護斷點的地址,子程序或中斷返回時恢復斷點。子程序嵌套斷點地址壓入和彈出情況注意事項
堆棧是一重要數(shù)據(jù)結(jié)構,使用堆棧應有明確目的。不亂用堆棧操作,不亂修改堆棧內(nèi)容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET
亂修改
SS和SP的內(nèi)容包括亂用BP參與的存儲器操作數(shù)
亂用指令
PUSH和POP指令只能對字操作。
PUSHALPOPBYTEPTR[BX]
可以對段寄存器操作但POP不能對CS操作
PUSHDSPUSHCSPOPES
POPCS自學堆棧應用:比較下邊兩個程序運行結(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ù)指令可進行字或字節(jié)操作,不影響標志位。不允許對立即數(shù)、段寄存器做操作數(shù)
XCHGAX,4
XCHGBX,DS
存儲器之間不能交換,兩個操作數(shù)中必須有一個在寄存器中;
XCHG[BX],[DI] (錯)(1)輸入輸出指令(InputandOutput)
輸入輸出指令共兩種:
IN(Inputbyteorword)
OUT
(Outputbyteorword)
輸入指令用于CPU從外設端口接受數(shù)據(jù),輸出指令用于CPU向外設端口發(fā)送數(shù)據(jù)。
無論接受還是發(fā)送數(shù)據(jù),必須通過累加器AX(字)或AL(字節(jié)),又稱累加器專用傳送指令。
輸入、輸出指令不影響標志位。2.累加器專用傳送指令每個外設要占幾個端口:數(shù)據(jù)口,狀態(tài)口和控制口。由圖可見:信息交換要通過端口:在IBMPC機里,可以配接許多外部設備,每個外設與CPU之間交換數(shù)據(jù),狀態(tài)信息和控制命令,每一種信息交換都要通過一個端口來進行。端口數(shù):外部設備最多有65536個I/O端口。
A0~A15譯碼形成。端口號:端口號(即外設端口地址)為0000H~FFFFH。
PC機端口數(shù):僅使用A0~A9譯碼形成I/O口地址,即1024H個口地址PC機端口號:0000H~03FFH
其中:A9=1,表示擴充槽上的口地址。長格式:端口號中前256個端口(0~FFH),可以直接寫在指令中,端口號代替指令中的PORT,機器指令用二字節(jié)表示,第二字節(jié)就是端口號。短格式:當端口號≥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)換指令(換碼指令):
該指令不影響標志位。格式:XLATstr_table ;(AL)←((BX)+(AL))或XLAT str_table——表格符號地址(首地址), 只是為了提高可讀性而設置,匯編時仍用BX。
XLAT指令使用方法:先建立一個字節(jié)表格;表格首偏移地址存入BX;需要轉(zhuǎn)換代碼的序號(相對與表格首地址位移量)存入AL;(表中第一個元素的序號為0)執(zhí)行XLAT指令后,表中指定序號的元素存于AL中。
(AL)為轉(zhuǎn)換的代碼。XLAT指令應用:若把字符的掃描碼轉(zhuǎn)換成ASCII碼;或數(shù)字0~9轉(zhuǎn)換成7段數(shù)碼所需要的相應代碼(字形碼)等就要用XLAT指令。例:內(nèi)存的數(shù)據(jù)段中有一張十六進制數(shù)字的ASCII碼表。
首地址為:Hex_table,欲查出表中第10個元素(‘A’)執(zhí)行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLATHex_table假設: (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進制數(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特點及注意事項:目的操作數(shù)reg應是16位通用寄存器
LEAES,[BX]LEAAL,bufferLEA6,[BX+SI]LEA[DI],buffer
源操作數(shù)應是存儲器操作數(shù)
LEABX,AX
傳送的是內(nèi)存單元的有效地址,與其內(nèi)容無關。…...12h34h56h…...buffer內(nèi)存(2)LDS(LoadpointerusingDS)格式:LDSreg16,mem32 ;(reg16)←(EA) (DS)←((EA)+2))功能:把源操作數(shù)指定的4個相繼字節(jié)送指令指定的寄存器及DS寄存器中。
前兩個單元內(nèi)容(16位偏移量)裝入指定通用寄存器,后兩個單元內(nèi)容(段地址)裝入到DS段寄存器。用于寫遠地址指針。例:假設:
(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寄存器。用于寫遠地址指針。例:假設:
(DS)=B000H (BX)=080AH指令: LESDI,[BX]執(zhí)行指令后: (DI)=05A2H (ES)=4000HA2H05H00H40HB000H:080AH(DS)B080BHB080CHB080DH......存儲器(BX)4.標志傳送指令(Flagregistertransfer)采用了隱含寄存器(AH、Flags)操作數(shù)方式。
8088有四條標志傳送操作指令:(1). LAHF(LoadAHfromflags)(2). SAHF(StoreAHintoflags)(3). PUSHF(Pushflagsontostack)(4). POPF(Popflagsoffstack)
(1).LAHF(LoadAHfromflags)格式:LAHF;(AH)←(PSW的低字節(jié))功能:標志寄存器低八位(AH)。LAHF指令操作圖示意(2). SAHF(StoreAHintoflags) 格式:SAHF;(PSW的低字節(jié))←(AH) 功能:(AH)送標志寄存器低八位。SFZFAFPFCF01234567TFIFDFOF8910111213141501234567FLAGSAHSS:SP
SS:SP
(PSW)(4).POPF標志出棧格式
POPF執(zhí)行(PSW)←
(SS:SP)(SP)←
(SP)+2SS:SP
SS:SP
(PSW)(3).PUSHF標志入棧格式
PUSHF執(zhí)行(SP)←
(SP)-2
(SS:SP)←
(PSW)注意:(1)標志位的影響LAHF、PUSHF不影響標志位,SAHF、POPF由裝入的值確定標志位的值,即影響標志位。(2)PUSHF、POPF用于保護調(diào)用過程前(PSW),過程返回后恢復。例:
… PUSH AX PUSHCX PUSHF CALLTRANS
POPFPOPCXPOPAX…二.算術運算指令指令分類:特點:帶符號數(shù)用補碼表示如MOVAX,-1
等價于
MOVAX,0FFFFh
對加、減運算,不區(qū)分無符號數(shù)、帶符號數(shù)對乘、除運算,區(qū)分無符號數(shù)、帶符號數(shù)可進行字節(jié)或字操作影響狀態(tài)標志十進制運算方法:當數(shù)據(jù)用組合(壓縮)或分離(非壓縮)BCD碼表示時,為使運算的結(jié)果仍為BCD碼表示,需對結(jié)果進行調(diào)整。
十進制運算=二進制運算+十進制調(diào)整
BCD碼(BinaryCodedDecimal)
用二進制編碼表示十進制數(shù)。常用8421BCD碼,與十進制數(shù)碼對應關系:例
48的BCD碼為(01001000)BCD
根據(jù)在內(nèi)存的存放形式,分組合BCD碼和分離BCD碼
組合BCD碼(又稱壓縮BCD碼)(PackedBCDformat)
用4位二進制數(shù)表示一個十進制數(shù)位,一字節(jié)存放2個BCD碼。
整個十進制數(shù)形式為一個順序的4位為一組的數(shù)串。例:9502d的壓縮BCD碼應表示為:
9 5 02分離BCD碼(又稱非壓縮BCD碼)(UnpackedBCDformat)
用8位為一組表示一個十進制數(shù)位,一字節(jié)存放1個BCD碼。
8位中的低4位表示8421的BCD碼,而高4位沒有意義。例:9502d的非壓縮BCD碼則表示為:
9 5 0 21001010100000010
ASCII碼是一種分離BCD碼 數(shù)字的ASCII的高4位0011無意義; 低4位是以8421碼形式表示的十進制數(shù)位。 符合分離BCD碼高4位無意義的規(guī)定。
2的ASCII碼:
高4位0011無意義當數(shù)據(jù)用組合或分離BCD碼表示時,為使運算的結(jié)果仍為BCD碼表示,需對結(jié)果進行調(diào)整。十進制運算=二進制運算+十進制調(diào)整例(00001000)
壓縮BCD
+(00001001)
壓縮BCD
=(00010111)
壓縮BCD計算機計算過程看作壓縮BCD0000100008+0000100109
00010001
11
二進制運算十進制調(diào)整+00000110
00010111171.加法運算指令
ADD、ADC為雙操作數(shù)指令
INC為單操作數(shù)指令除INC指令不影響CF外,其余指令6個狀態(tài)標志均據(jù)結(jié)果置位ADC帶進位加法,實現(xià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é)果為負;或兩個負數(shù)相加,結(jié)果為正。 (兩個異號數(shù)相加不可能溢出)
減法:
兩個異號數(shù)相減,結(jié)果與減數(shù)相同。(兩個同號數(shù)相減不可能溢出)
運算結(jié)果錯誤。CF=1,8位無符號數(shù)相加,和超過255,
16位無符號數(shù)相加,和超過65535。 運算結(jié)果準確其他條件標志(SF,AF,PF,ZF)根據(jù)定義設定。三組指令執(zhí)行后的結(jié)果均為:(AL)=0FDH,CF=0,OF=0,SF=1,ZF=0
MOVAL,0F1HADDAL,0CH
MOVAL,241ADDAL,12
MOVAL,-15ADDAL,12第一章中的例題
F1H+0CHFDH二進制運算241+12253看作無符號數(shù)(-15)+12
(-3)看作帶符號數(shù)B0F1040C、、、、、、第一條指令第二條指令三組機器碼相同:對加、減運算,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進位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)指令INCbuffer將buffer指向的內(nèi)容加1,而不是地址buffer加1例5
帶進位加:兩雙字相加0002F365H+0005E024H=?MOVAX,0F365H①ADD
AX,0E024H
②MOVBX,0002H③ADC
BX,0005H④
0002F365H+
0005E024H
進位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)生的進位。用途舉例計算兩個多字節(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 ;停機以8位二進制數(shù)為例分析一下數(shù)的溢出與進位情況:下面分4種情況加以討論:(1) 帶符號數(shù)和無符號數(shù)都不溢出(2) 無符號數(shù)溢出(3) 帶符號數(shù)溢出(4) 帶符號數(shù)和無符號數(shù)都溢出(1) 帶符號數(shù)和無符號數(shù)都不溢出。(2) 無符號數(shù)溢出二進制數(shù)看作無符號數(shù)看作帶符號數(shù)0000011111111011+000000107251+258+7-5++2相加標志CF=1,OF=0CF=1OF=0溢出無符號數(shù)溢出溢出結(jié)果應為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.減法運算指令
SUB、SBB、
CMP為雙操作數(shù),DEC、NEG為單操作數(shù)
SBB為帶進位減法(進位是上條指令運算的進位)。
除DEC不影響CF標志外,其余指令6個狀態(tài)標志均據(jù)結(jié)果置位。
NEG求補運算,等價于用0減去操作數(shù)。其對標志位的影響,由0減去該操作數(shù)的過程決定。例1
減法指令:編程完成2D04H–3AB0H執(zhí)行后:
(AX)=0F254HCF=1,OF=0,SF=1,ZF=02D04H0010110100000100-3AB0H-0011101010110000
11111111111F254H1111001001010100MOVAX,2D04HSUBAX,3AB0H
借位也可對(-3AB0)取補作加法0010110100000100
+1100010101010000111111001001010100減法進位取反CF=1,其它OF=0,SF=1,ZF=0例2
帶借位減法:用指令完成兩雙字相減運算
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
求補指令:
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)容不變,置標志
JNSNEXT ;SF=0轉(zhuǎn)NEXT
NEGAL ;負數(shù)求補
NEXT:MOV[DI],AL;送目標
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ù)關系CF=1A低于BCF=0A高于或等于BCF=1或ZF=1A低于等于BCF=0且ZF=0A高于B利用CMP執(zhí)行后的標志值,比較兩操作數(shù)之間的關系比較指令CMP,進行兩操作數(shù)相減操作,但只影響標志值,不影響操作數(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ù)條件(標志)轉(zhuǎn)移,無符號數(shù)轉(zhuǎn)移指令如下:
CMPA,B③用ZF、SF和OF判斷兩帶符號數(shù)關系
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
正-負=負,結(jié)果SF=1,OF=1
1
但,正>負,知A>B
1
-0
負-正=正,結(jié)果SF=0,OF=1
0
但,負<正,知A<B
OF=1,溢出情況,(由符號位可決定是否溢出)結(jié)合ZF,得到結(jié)論:邏輯運算:條件轉(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ù)條件(標志)轉(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ù)運算
IMUL用于帶符號數(shù)運算
影響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)指令IMUL
字節(jié)相乘:AH=0或AH=FFH,CF=OF=0,否則CF=OF=1
字相乘:DX=0或DX=FFFFH,CF=OF=0,否則CF=OF=1
即:積的高一半為低一半的符號擴展,則CF=0,OF=0;
積的高一半部分不是低一半部分符號的擴展(包括結(jié)果的有效數(shù)字,不光是符號部分),則CF=1,OF=1。積的高一半為低一半的符號擴展的含義:
乘積為正,則(AH)=00H或(DX)=0000H
乘積為負,則(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥電商平臺藥品供應鏈金融與合規(guī)風險管理報告
- 2025年生物質(zhì)能源分布式能源系統(tǒng)能源效率與環(huán)保標準優(yōu)化報告
- 金融科技行業(yè)估值方法與投資策略研究報告-2025年展望
- 現(xiàn)場演藝市場復蘇2025年虛擬現(xiàn)實演出形式研究報告001
- 2025年基層醫(yī)療衛(wèi)生機構信息化建設中的醫(yī)療信息化與醫(yī)療服務互聯(lián)網(wǎng)化監(jiān)管體系報告
- 交通設備制造業(yè)數(shù)字化轉(zhuǎn)型與智能生產(chǎn)質(zhì)量保障報告
- 安全主管試題及答案
- 安全責任試題及答案
- 區(qū)塊鏈技術驅(qū)動2025年數(shù)字貨幣在金融領域應用與風險控制報告
- 安全試題單選竅門及答案
- 2025屆浙江省精誠聯(lián)盟高三下學期適應性聯(lián)考生物試題
- 2025-2030年中國背光單元(BLU)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 夏季高溫安全生產(chǎn)培訓
- 2025浙江中考:化學必背知識點
- 護理職業(yè)安全文化試題及答案
- 《神經(jīng)調(diào)控機制》課件
- DB63-T 2135-2023 鹽湖資源動態(tài)監(jiān)測技術規(guī)程
- 汽車空氣凈化系統(tǒng)原理與效果
- 新能源汽車輕量化設計
- 酒店掛賬信用管理制度
- 公司合伙合同樣本
評論
0/150
提交評論