




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微機(jī)原理及其應(yīng)用
信息與計(jì)算機(jī)學(xué)院閆勇yanyong10000@126.com3.3.18086指令系統(tǒng)的特點(diǎn)8086與8088的指令系統(tǒng)由8位的8080/8085指令系統(tǒng)擴(kuò)展而來(lái)的,同時(shí)又能在其后續(xù)的80x86系列的CPU上正確運(yùn)行。其主要特點(diǎn)是:采用可變長(zhǎng)指令,指令格式比較復(fù)雜,編碼形式靈活;尋址方式多樣靈活,處理數(shù)據(jù)的能力比較強(qiáng),可處理字節(jié)或字、帶符號(hào)或無(wú)符號(hào)的二進(jìn)制數(shù)據(jù)以及壓縮型/非壓縮型的十進(jìn)制數(shù)據(jù);有重復(fù)指令和乘、除運(yùn)算指令,擴(kuò)充了條件轉(zhuǎn)移、移位/循環(huán)指令;為加強(qiáng)軟件中斷功能和支持多處理器系統(tǒng)的工作,增設(shè)了有關(guān)的指令。3.3.28086/8088指令的格式
-指令的構(gòu)成1.指令助記符包括操作碼和操作數(shù)。操作碼:表示指令完成什么樣的功能操作數(shù):指令的操作對(duì)象2.指令的一般格式:
操作碼
[操作數(shù)1],[操作數(shù)2];[注釋]
↓
↓
目的操作數(shù)源操作數(shù)3.操作數(shù)的一般來(lái)源:1.立即數(shù)操作數(shù),如MOVAX,1234H2.寄存器操作數(shù),如MOVAH,AL3.存儲(chǔ)器操作數(shù),如MOVAX,[SI]4.I/O端口操作數(shù),如INAL,n指令的格式8086/8088采用可變長(zhǎng)指令,指令長(zhǎng)度為1~6個(gè)字節(jié)。其指令編碼格式有以下幾種基本格式。1.無(wú)操作數(shù)指令這類(lèi)指令一般屬于控制類(lèi)指令,指令中只包含1個(gè)字節(jié)的操作碼OP,故又稱(chēng)為單字節(jié)指令。如:HLT2.單操作數(shù)指令這類(lèi)指令只有1個(gè)操作數(shù)(字節(jié)或字),也只給出1個(gè)操作數(shù)地址。該操作數(shù)可以在寄存器或在存儲(chǔ)器中,也可以是指令中直接給出的立即數(shù)。如: PUSHAX ; INC[1600H];[1600H]是數(shù)據(jù)段中的一個(gè)單元3.雙操作數(shù)指令雙操作數(shù)指令不允許兩個(gè)操作數(shù)均在存儲(chǔ)器中(串操作指令除外)。兩個(gè)操作數(shù)均在寄存器中。如:MOVAX,BX兩個(gè)操作數(shù)中有一個(gè)在寄存器中,另一個(gè)在存儲(chǔ)器中。如:MOVAL,[SI]兩個(gè)操作數(shù)中有一個(gè)在寄存器中,另一個(gè)是指令中給出的立即數(shù)。如:MOVAL,12H兩個(gè)操作數(shù)中,一個(gè)在存儲(chǔ)器中,另一個(gè)操作數(shù)是指令中給出的立即數(shù)。如:MOV[1600H],1200H3.3.3尋址方式在指令中,指定操作數(shù)或操作數(shù)存放位置的方法稱(chēng)為尋址方式。8086/8088的指令系統(tǒng)有以下幾種尋址方式:(一)固定尋址
(二)立即數(shù)尋址(一)固定尋址有些單字節(jié)指令其操作是規(guī)定CPU對(duì)某個(gè)固定的寄存器進(jìn)行的,如加法的ASCII調(diào)整指令A(yù)AA,規(guī)定被調(diào)整的數(shù)總是位于AL中。(二)立即數(shù)尋址操作數(shù)就在指令中,存放在代碼段,當(dāng)執(zhí)行指令需要操作數(shù)時(shí),CPU直接從指令隊(duì)列緩沖器中取得該立即數(shù),不需要額外執(zhí)行總線周期訪問(wèn)存儲(chǔ)器。注意:立即尋址只能用于源操作數(shù)。例如: MOV AX, 1C8FH MOV BYTEPTR[2A00H],8FH錯(cuò)誤例:
×
MOV2A00H,AX(三)寄存器尋址操作數(shù)在寄存器(如AX、BH等)中,而寄存器名在指令中指出。寄存器尋址不需要執(zhí)行總線周期訪問(wèn)存儲(chǔ)器。例: MOVAX,BX ;BX->AX MOV [3F00H],AX ;AX->DS:3F00H MOV CL,AL ;AL
->CL MOV AH,4CH注意:源操作數(shù)與目的操作數(shù)字長(zhǎng)要相同;
寄存器尋址與段地址無(wú)關(guān)。錯(cuò)誤例:
×MOVAX,BL ;字長(zhǎng)不同
×MOVES:AX,DX ;寄存器與段無(wú)關(guān)(四)存儲(chǔ)器尋址操作數(shù)在存儲(chǔ)器中(不是存在于代碼段的立即數(shù)),必須經(jīng)總線控制邏輯電路進(jìn)行存取。當(dāng)EU需要讀/寫(xiě)位于存儲(chǔ)器的操作數(shù)時(shí),由EU中ALU先計(jì)算出操作數(shù)地址的偏移量(即有效地址EA),并將它送給總線接口單元BIU,同時(shí)請(qǐng)求BIU執(zhí)行一個(gè)總線周期;BIU將與該偏移量相應(yīng)的段寄存器的內(nèi)容左移4位,加上由EU送來(lái)的該偏移量形成一個(gè)20位的實(shí)際地址(即物理地址),然后執(zhí)行總線周期,讀/寫(xiě)指令所需的操作數(shù)。有效地址8086/8088CPU所尋址的操作數(shù)地址的偏移量即有效地址EA,或稱(chēng)偏移地址,它是一個(gè)不帶符號(hào)的16位地址碼。計(jì)算EA的通式為:注意:有效地址=偏移地址=偏移量,由ALU根據(jù)操作數(shù)尋址方式計(jì)算得出;位移量≠偏移量,位移量一般在指令中直接給出。1.直接尋址方式指令中以位移量DISP的形式直接給出操作數(shù)的EA,即:EA=DISP;此方式需要將位移量外加[],表示里面存放的是地址而不是操作數(shù)。如: MOVAX,[1680H]注意:操作數(shù)默認(rèn)的段寄存器為DS,也允許在以代碼段、堆棧段、或附加段為基準(zhǔn)的區(qū)域中,但要在指令中顯式地指定其他段寄存器—稱(chēng)為段超越前綴。如:MOVDL,ES:[0100H]。在匯編語(yǔ)言指令中偏移地址一般用符號(hào)地址來(lái)表示。如:MOVSI,TABLE_PTR。為了使指令字不要過(guò)長(zhǎng),規(guī)定雙操作數(shù)指令不能兩個(gè)操作數(shù)都用直接尋址方式。錯(cuò)誤例:
×
MOV[2000H],[3000H]2.間接尋址方式間接尋址方式是指寄存器間接尋址方式,其操作數(shù)一定在存儲(chǔ)器中,而存儲(chǔ)單元的有效地址EA則由寄存器指出。注意:只有SI、DI、BX和BP可作間址寄存器。書(shū)寫(xiě)指令時(shí),這些寄存器帶有方括號(hào)[]。以BX、SI、DI寄存器間接尋址,操作數(shù)在數(shù)據(jù)段;物理地址=DS×10H+BX/SI/DI(BX、SI、DI的某種組合)以BP寄存器間接尋址,操作數(shù)在堆棧段;物理地址=SS×10H+BP例:MOVAX,[SI]若DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H。則指令執(zhí)行后,AX=3344H。44H33H6000H1200HDSSI60000H61200H
61200HAX存儲(chǔ)器數(shù)據(jù)段
+)1200H44H33H(1)基址尋址方式
(2)變址尋址方式(1)基址尋址方式有效地址EA=BX/BP+DISP物理地址=DS/SS×10H+BX/BP+DISP例:MOVSI,[BX+1400H]或MOVSI,1400H[BX]則物理地址為:DS×10H+BX+1400H(2)變址尋址方式有效地址EA=SI/DI+DISP物理地址=DS×10H+SI/DI+DISP例:MOVAX,[SI]則物理地址:DS×10H+SI(3)基址加變址尋址方式有效地址EA=BX/BP+SI/DI+DISP物理地址=DS/SS×10H+BX/BP+SI/DI+DISP例: MOVAX,[BP+SI+6] ;BP默認(rèn)SS段有效地址EA=BP+SI+06H物理地址為:SS×10H+BP+SI+06H注意:有的教材中,當(dāng)指令中的地址位移量不為0時(shí),又稱(chēng)為相對(duì)基址變址尋址方式。例:MOVAX,DATA[DI][BX]或MOVAX,[BX+DI+DATA]若DS=8000H,BX=2000H,DI=1000H,DATA=200H則指令執(zhí)行后AH=(83021H),AL=(83020H)。8320083200HAHALAX+DATA0200操作碼代碼段數(shù)據(jù)段.........YYXXDS8000BX2000
DI1000選講:存儲(chǔ)器尋址的
段默認(rèn)與段超越在存儲(chǔ)器尋址方式中,基址與變址都有默認(rèn)的段;但有時(shí)也可以通過(guò)段超越方式去尋址在其它段中的操作數(shù)。尋址方式操作數(shù)有效地址段默認(rèn)段超越前綴直接尋址[disp]DSES,CS基址尋址[BX+disp]DSES,CS[BP+disp]SSDS,ES,CS變址尋址[SI/DI+disp]DSES,CS基址變址尋址[BX+SI/DI+disp]DSES,CS[BP+SI/DI+disp]SSDS,ES,CS選講注意:不允許使用段超越前綴的情況:與堆棧操作有關(guān)的指令(PUSH,POP,CALL,RET,INT,IRET)使用SP作為指針,只能使用SS為段寄存器。串操作指令規(guī)定用DS:SI來(lái)指定源數(shù)據(jù)區(qū),用ES:DI來(lái)指定目的數(shù)據(jù)區(qū)。
段超越前綴只能用于源,而不能用于目的;即SI可以更換段寄存器,而DI只能使用ES。指令只能存放在代碼段。(五)I/O端口尋址方式輸入/輸出指令對(duì)I/O端口的尋址可采用直接或間接兩種方式。1.直接端口尋址:I/O端口地址以8位立即數(shù)方式在指令中直接給出。所尋址的端口號(hào)只能在0~255范圍內(nèi)。
例如:INAL,n2.間接端口尋址:類(lèi)似于寄存器間接尋址,16位的I/O端口地址在DX寄存器中,即通過(guò)DX間接尋址??蓪ぶ返亩丝谔?hào)為0~65535。
例如:OUTDX,AL ;將AL的內(nèi)容輸出到由DX指定的端口中去。(六)串操作指令尋址方式
(七)轉(zhuǎn)移類(lèi)指令的尋址方式(六)串操作指令尋址方式執(zhí)行數(shù)據(jù)串指令時(shí),源串操作數(shù)第1個(gè)字節(jié)或字的有效地址應(yīng)存放在源變址寄存器SI中(不允許修改),目標(biāo)串操作數(shù)第1個(gè)字節(jié)或字的有效地址應(yīng)存放在目標(biāo)變址寄存器DI中(不允許修改)。(七)轉(zhuǎn)移類(lèi)指令的尋址方式在8086/8088系統(tǒng)中,由于存儲(chǔ)器采用分段結(jié)構(gòu),所以轉(zhuǎn)移類(lèi)指令有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分。所有的條件轉(zhuǎn)移指令只允許實(shí)現(xiàn)段內(nèi)短轉(zhuǎn)移,即只允許轉(zhuǎn)移的地址范圍在-128~+127字節(jié)內(nèi),由指令中直接給出8位地址位移量。尋址方式舉例1.指出下列指令的源操作數(shù)尋址方式,對(duì)于存儲(chǔ)器尋址寫(xiě)出EA的計(jì)算公式。a.MOV AX,[1000H]b.MOV AX,1000H;
c.MOV AX,BXd.MOV AX,[BP] e.MOV AX,1000H[DI] f.MOV AX,[BX+DI] g.IN AL,15H 2.判斷下列指令是否正確,并說(shuō)明原因。a.MOV [AX],[BP]b.MOV1000H,BXc.MOV[1000H],BXd.MOVCL,AX3.3.48086/8088指令的分類(lèi)根據(jù)指令的功能,分為六類(lèi):數(shù)據(jù)傳送類(lèi);
算術(shù)運(yùn)算類(lèi);
邏輯運(yùn)算類(lèi);
串操作類(lèi);
程序控制類(lèi);
CPU控制類(lèi)。
數(shù)據(jù)傳送類(lèi)指令數(shù)據(jù)傳送類(lèi)指令可完成寄存器與寄存器之間、寄存器與存儲(chǔ)器之間以及寄存器與I/O端口之間的字節(jié)或字傳送。一.通用數(shù)據(jù)傳送指令1.MOVd,s ;d←s即將由源s指定的源操作數(shù)送到目標(biāo)d其中。注意:源與目的操作數(shù)要等長(zhǎng)(即類(lèi)型要匹配);源s不能是IP,目標(biāo)d不能為CS、IP和立即數(shù);
源s/目標(biāo)d不能同時(shí)為存儲(chǔ)器操作數(shù);給段寄存器賦值,不能采用立即數(shù)方式。
錯(cuò)誤例: MOVDS,1000H
;×
可改為: MOVAX,DATA ;DATA是預(yù)先分配的段名 MOVDS,AX例:MOVAL,BL;寄存器之間傳送MOVBX,SIMOVCX,[BX+SI];存儲(chǔ)器操作數(shù)傳送到寄存器MOVAX,ARRAY[SI]MOVAX,0B00H;立即數(shù)傳送到寄存器MOVCL,10000000BMOVVALUE,100H;立即數(shù)傳送到存儲(chǔ)器MOVES:[BX],4BH2.PUSHs
;將源操作數(shù)s(16位)壓入堆棧
POPd
;將堆棧當(dāng)前棧頂兩相鄰單元的數(shù)據(jù)字彈出到d這是兩條進(jìn)棧與出棧指令,其中,s和d可以是16位寄存器或存儲(chǔ)器兩相鄰單元,以保證堆棧按字操作。注意:PUSH和POP指令執(zhí)行過(guò)程(即:SP的變化);成對(duì)并且按照對(duì)稱(chēng)的次序使用;堆棧操作按字進(jìn)行,沒(méi)有單字節(jié)的堆棧操作指令;CS寄存器的值可以入棧,但不能反過(guò)來(lái)從堆棧彈出一個(gè)字到CS寄存器;常用于子程序調(diào)用和中斷處理。例:設(shè)AX
=1020H,執(zhí)行PUSHAX示意圖:低地址存儲(chǔ)區(qū)(SS段)(SP)存儲(chǔ)區(qū)(SS段)進(jìn)棧SP變化的方向執(zhí)行后20H10H(AL)(AH)(SP)-2(SP)高地址低地址高地址執(zhí)行前AX=1020H執(zhí)行POPBX的示意圖:低地址存儲(chǔ)區(qū)(SS段)出棧方向執(zhí)行前20H10H(SP)存儲(chǔ)區(qū)(SS段)執(zhí)行后BX=1020H(SP)BX20H10H高地址低地址高地址3.XCHGd,s此指令是將源操作數(shù)與目標(biāo)操作數(shù)相互對(duì)應(yīng)交換位置。注意:可以在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲(chǔ)器之間進(jìn)行交換。不能在兩個(gè)存儲(chǔ)單元之間交換,段寄存器與IP也不能作為一個(gè)源或目的操作數(shù)。例: XCHGAL,BL XCHGBX,CX XCHG[2530H],CX 選講4.XLAT ;[BX+AL]→AL這是一條用于實(shí)現(xiàn)字節(jié)翻譯功能的指令,又稱(chēng)為代碼轉(zhuǎn)換指令,或查表指令。它可以將AL寄存器中設(shè)定的一個(gè)字節(jié)數(shù)值變換為內(nèi)存一段連續(xù)表格中的另一個(gè)相應(yīng)的代碼,以實(shí)現(xiàn)編碼制的轉(zhuǎn)換。執(zhí)行XLAT指令之前,將表的首地址→BX;表中某一項(xiàng)與表首址的位移量(距離)→AL。例:內(nèi)存數(shù)據(jù)段有一張16進(jìn)制數(shù)的ASCII碼表,設(shè)段首偏移地址為2000H,如欲查出表中第11個(gè)代碼(代碼序號(hào)從0開(kāi)始)即十六進(jìn)制數(shù)B的ASCII碼。ASCII表在DS段中,并假設(shè)DS=4000H。執(zhí)行程序:MOVBX,2000H;BX←表首地址MOVAL,0BH;AL←表中序號(hào)XALT;查表轉(zhuǎn)換執(zhí)行后得到:(AL)=42H=‘B’303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’存儲(chǔ)器二.目標(biāo)地址傳送指令1.LEAd,s取有效地址指令,其功能是把用于指定源操作數(shù)(它必須是存儲(chǔ)器操作數(shù))的16位偏移地址(即有效地址)傳送到一個(gè)指定的16位通用寄存器中。例:LEABX,[1600H];則指令執(zhí)行之后,BX
=1600H,是偏移地址。區(qū)別:MOVBX,[1600H] ;指令執(zhí)行后BX等于數(shù)據(jù)段偏移地址為
;1600H的存儲(chǔ)單元的內(nèi)容,一般為操作數(shù)。下面兩條指令等效:
LEABX,BUFFER MOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存儲(chǔ)器單元BUFFER的偏移地址。2.LDSd,s取某變量的32位地址指針的指令,其功能是從由s指定的存儲(chǔ)單元開(kāi)始的4個(gè)連續(xù)存儲(chǔ)單元中取出該變量的地址指針(共4個(gè)字節(jié)),將其前兩個(gè)字節(jié)(即變量的偏移地址)送到由d指定的某16位通用寄存器,后兩字節(jié)(即變量的段地址)傳送到DS段寄存器中。如:LDSSI,[DI+100AH] ;執(zhí)行后 SI=(DS×10H+DI+100AH),DS=(DS×10H+DI+100AH+2)3.LESd,s這條指令與LDSd,s指令的操作基本相同,其區(qū)別僅在于將把由源所指定的某變量的地址指針中后2個(gè)字節(jié)(段地址)傳送到ES段寄存器,而不是DS段寄存器。如:LESSI,[DI+100AH]
三.標(biāo)志位傳送指令1.LAHF將標(biāo)志寄存器F的低字節(jié)(共包含5個(gè)狀態(tài)標(biāo)志位)傳送到AH寄存器中。2.SAHF將AH寄存器內(nèi)容傳送到標(biāo)志寄存器F的低字節(jié)。OFDFIFTFSFZFAFPFCFAHFLAGOFDFIFTFSFZFAFPFAHFLAGCF3.PUSHF將16位標(biāo)志寄存器F內(nèi)容入棧保護(hù)。其操作過(guò)程與前述的PUSH指令類(lèi)似。4.POPF將當(dāng)前棧頂和次棧頂中的數(shù)據(jù)字彈出送回到標(biāo)志寄存器F中。提示:PUSHF與POPF常成對(duì)出現(xiàn),一般用在子程序和中斷處理程序的首尾,用來(lái)保護(hù)和恢復(fù)主程序涉及的標(biāo)志寄存器內(nèi)容.必要時(shí)可以用來(lái)修改標(biāo)志寄存器的內(nèi)容.四.
I/O數(shù)據(jù)傳送指令1.IN累加器,端口號(hào)IN指令是將指定端口中的內(nèi)容輸入到累加器AL/AX中。端口號(hào)可以用8位立即數(shù)直接給出;也可以將端口號(hào)事先安排在DX寄存器中,間接尋址16位端口號(hào)。例如:INAL,PORT;AL←(端口PORT)
INAX,PORT;AX←(端口PORT)
INAL,DX;AL←(端口(DX))
INAX,DX;AX←(端口(DX))2.OUT端口號(hào),累加器OUT指令是將累加器AL/AX中的內(nèi)容輸出到指定的端口。具體如下: OUTPORT,AL ;端口PORT←AL
OUTPORT,AX ;端口PORT←AX
OUTDX,AL ;端口(DX)←AL
OUTDX,AX ;端口(DX)←AX注意:I/O指令只能用累加器AL/AX作為執(zhí)行I/O數(shù)據(jù)傳送的機(jī)構(gòu),而不能用其它寄存器(包括AH)代替。當(dāng)用直接尋址的I/O指令時(shí),尋址范圍為0~255,適用于較小規(guī)模的微機(jī)系統(tǒng);當(dāng)用端口號(hào)由寄存器DX給出的間接尋址的I/O指令時(shí),尋址范圍為0~65535。數(shù)據(jù)傳送指令小結(jié)1.數(shù)據(jù)傳送指令本身不影響標(biāo)志位;2.除XCHG指令外,都是從源到目的的單向傳送;3.注意MOV和LEA的差別;4.指令有多種格式,但一般遵循以下規(guī)則:雙操作數(shù)指令中一般不允許兩個(gè)操作數(shù)都在存儲(chǔ)器中(串操作指令除外);目的操作數(shù)不允許立即數(shù)尋址方式。5.段寄存器只能在MOV、POP、PUSH指令中作為操作數(shù)出現(xiàn)。如:MOVES,AX和PUSHCS和POPDS;但下列指令不合法:MOVCS,reg和POPCS;
算術(shù)運(yùn)算類(lèi)指令
一.加法指令1.ADDd,s;d←d+s目標(biāo)操作數(shù)不允許是立即數(shù),其他同源操作數(shù)。且不允許兩者同時(shí)為存儲(chǔ)器操作數(shù)。ADD指令對(duì)6個(gè)狀態(tài)標(biāo)志均產(chǎn)生影響。例:已知BX=D75FH,指令A(yù)DDBX,8046H執(zhí)行后,狀態(tài)標(biāo)志各是多少?
D75FH=1101011101011111
+8046H=1000000001000110
(1)0101011110100101結(jié)果:CF=1,ZF=0,PF=1,AF=1,OF=1,SF=02.
ADCd,s
;d←d+s+CF帶進(jìn)位的加法指令進(jìn)位標(biāo)志位CF的原狀態(tài)也將一起參與加法運(yùn)算;待運(yùn)算結(jié)束后,CF將根據(jù)結(jié)果置成新的狀態(tài)。例如:ADCAL,68H;AL←AL+68H+CF ADCAX,CX;AX←AX+CX+CF ADCBX,[DI];BX←BX+[DI]+CFADC指令用于多字節(jié)加法運(yùn)算中,一般在ADD之后使用。
例:見(jiàn)下頁(yè)。例:有兩個(gè)4字節(jié)的無(wú)符號(hào)數(shù)相加:2C56F8ACH+309E47BEH=?設(shè)被加數(shù)、加數(shù)分別存放在BUFFER1及BUFFER2開(kāi)始的兩個(gè)存儲(chǔ)區(qū)內(nèi),結(jié)果放回BUFFER1存儲(chǔ)區(qū)。分析:因CPU只能進(jìn)行8/16位的加法運(yùn)算,可將兩數(shù)分成低字和高字分別相加。程序段如下:MOVAX,BUFFER2 ADDBUFFER1,AX ;低字相加MOVAX,BUFFER2+2 ADCBUFFER1+2,AX ;高字相加,包括低字的進(jìn)位56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加數(shù)加數(shù)數(shù)據(jù)段......3.INCd
;d←d+1加1指令將目標(biāo)操作數(shù)當(dāng)作無(wú)符號(hào)數(shù),加1后仍保留在目標(biāo)中;
如:INCAX ;AX←AX+1目標(biāo)操作數(shù)不允許是立即數(shù)。本指令只影響ZF、OF、SF、PF、AF,而不影響CF標(biāo)志;對(duì)于間接尋址的存儲(chǔ)器數(shù)據(jù)加1要求用偽指令BYTEPTR、WORDPTR、DWORDPTR類(lèi)型偽指令來(lái)說(shuō)明數(shù)據(jù)的長(zhǎng)度。
如:INC
BYTEPTR
[BX+1000H]二.減法指令1.SUBd,s
;d←d-s,減法指令不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù),也不允許做段寄存器的減法。2.SBBd,s
;d←d-s-CF帶借位減法指令完成減法運(yùn)算時(shí)還要再減去進(jìn)位標(biāo)志CF的原狀態(tài)。待運(yùn)算結(jié)束,CF將根據(jù)結(jié)果置成新的狀態(tài)。常用于比16字節(jié)寬的多字節(jié)減法中。3.DECd
;d←d-1減1指令目標(biāo)操作數(shù)不允許是立即數(shù)。不影響進(jìn)位標(biāo)志CF,因此不能用INC設(shè)置進(jìn)位位。間接尋址需偽指令說(shuō)明數(shù)據(jù)的長(zhǎng)度。4.NEGd
;d←d+1求補(bǔ)碼指令將d按位取反后加1,實(shí)際為d←0-d,即取負(fù)。系統(tǒng)約定CF一般置1,只有d=0時(shí)CF=0。5.CMPd,s
;d-s,
比較指令不回送結(jié)果,只根據(jù)結(jié)果置標(biāo)志位;不允許做段寄存器比較。比較兩數(shù)的大小時(shí),應(yīng)區(qū)分無(wú)符號(hào)數(shù)與有符號(hào)數(shù)的判斷條件:(1)對(duì)于兩無(wú)符號(hào)數(shù)比較,只需根據(jù)進(jìn)位標(biāo)志CF即可判斷:ZF=1時(shí),表示d=s;ZF=0時(shí):若CF=0,則d≥s;若CF=1,則d<s。(2)對(duì)于兩有符號(hào)數(shù)比較,則要根據(jù)OF和SF兩者的異或運(yùn)算結(jié)果來(lái)判斷:當(dāng)OF⊕SF=0時(shí),d≥s;當(dāng)OF⊕SF=1時(shí),d<s。比較指令CMP在使用時(shí),一般在其后緊跟一條條件轉(zhuǎn)移指令,判斷比較結(jié)果的轉(zhuǎn)向。例:比較AL、BL、CL中有符號(hào)數(shù)的大小,將最小數(shù)放在AL中。
CMPAL,BL ;前兩個(gè)數(shù)相比較
JNGBBB ;若AL較小,則轉(zhuǎn)而與CL比較 XCHGAL,BL ;若AL>BL,將BL中的小數(shù)放入ALBBB: CMPAL,CL ;AL和CL比較
JNGCCC ;若AL≤CL,則AL中為最小的 XCHGAL,CL ;若AL>CL,將CL中的小數(shù)放入ALCCC: HLT三.乘法指令指令格式:OPs進(jìn)行乘法時(shí):
字節(jié)乘法: 8位×8位→16位乘積;
字乘法: 16位×16位→32位乘積。對(duì)被乘數(shù)、乘數(shù)及乘積存放有如下規(guī)定:
被乘數(shù) 乘數(shù) 乘積
字節(jié)乘法 AL s(8bit) AX
字乘法 AX s(16bit) DX||AX注意:由s指定的源操作數(shù)作乘數(shù),它可以是8/16位通用寄存器或存儲(chǔ)器操作數(shù),不能是立即數(shù);若為存儲(chǔ)器操作數(shù),必須在前面加BYTEPTR或WORDPTR說(shuō)明是字節(jié)還是字。如:
MULBYTEPTR[SI]1.MULs
;無(wú)符號(hào)乘法指令它完成兩個(gè)無(wú)符號(hào)的8/16位二進(jìn)制數(shù)相乘的功能。若運(yùn)算結(jié)果的高位字節(jié)(字節(jié)乘)或高位字(字乘)有效,即AH≠0或DX≠0,則CF和OF同時(shí)置1;否則CF=OF=0。
標(biāo)志寄存器其他4個(gè)狀態(tài)位狀態(tài)不定。2.IMULs ;有符號(hào)乘法指令該指令除計(jì)算對(duì)象是有符號(hào)二進(jìn)制數(shù)以外,其他都與MUL一樣。IMUL指令對(duì)OF和CF的影響是:若乘積的高一半是低一半的符號(hào)擴(kuò)展(為全0或全1),則OF=CF=0;否則均為1。
標(biāo)志寄存器其他4個(gè)狀態(tài)位狀態(tài)不定。四.除法指令指令格式:OPs進(jìn)行除法時(shí): 16位/8位→8位商(/8位余數(shù)); 32位/16位→16位商(/16位余數(shù))。對(duì)被除數(shù)、商及余數(shù)存放有如下規(guī)定:
被除數(shù) 除數(shù)
商 余數(shù)
字節(jié)除法 AX s(8bit) AL AH
字除法 DX||AX s(16bit) AX DX注意:由s指定的源操作數(shù)作乘數(shù),它可以是8/16位通用寄存器或存儲(chǔ)器操作數(shù),不能是立即數(shù)。若為存儲(chǔ)器操作數(shù),必須在前面加BYTEPTR或WORDPTR說(shuō)明是字節(jié)還是字。如:
DIVWORDPTR[BX]1.DIVs完成兩個(gè)無(wú)符號(hào)二進(jìn)制數(shù)相除的功能。商和余數(shù)也是無(wú)符號(hào)數(shù),字節(jié)/字除法時(shí)商最大為FFH/FFFFH。2.IDIVs完成將兩個(gè)有符號(hào)的二進(jìn)制數(shù)相除的功能。字節(jié)/字除法允許的最大商數(shù)為+127/+32767,最小商數(shù)為-127/-32767。與DIV指令的主要區(qū)別在于對(duì)符號(hào)位處理的約定:與DIV一樣,如果除數(shù)s是字節(jié)/字?jǐn)?shù)據(jù),被除數(shù)應(yīng)為字/雙字?jǐn)?shù)據(jù)并隱含存放于AX/DX||AX中;如果被除數(shù)也是字節(jié)/字?jǐn)?shù)據(jù)在AL/AX中,應(yīng)將AL/AX的符號(hào)位(AL7)/(AX15)擴(kuò)展到AH/DX后,才能開(kāi)始字節(jié)/字除法運(yùn)算商和余數(shù)均為有符號(hào)數(shù):商數(shù)在AL/AX寄存器中,AL7/AX15是商數(shù)的符號(hào)位;余數(shù)在AH/DX中,AH7/DX15
是余數(shù)的符號(hào)位,它應(yīng)與被除數(shù)的符號(hào)一致。注意事項(xiàng)若字節(jié)除法/字除法的被除數(shù)是字節(jié)/字的長(zhǎng)度,一定要先將AH/AX進(jìn)行處理,再執(zhí)行除法;
其中對(duì)于DIV指令,需要編程事先將AH/AX清零;對(duì)于IDIV指令,需要專(zhuān)門(mén)的符號(hào)擴(kuò)展指令對(duì)AH/AX進(jìn)行設(shè)置。
(請(qǐng)?jiān)趯?shí)驗(yàn)課上驗(yàn)證。)若除法運(yùn)算所得的商數(shù)超出累加器(AL或AX)的容量,則系統(tǒng)將其當(dāng)作除數(shù)為0處理,自動(dòng)產(chǎn)生中斷類(lèi)型號(hào)為0的除法出錯(cuò)中斷,此時(shí)所得的商、余數(shù)均無(wú)效。3.CBW和CWDCBW和CWD是專(zhuān)為IDIV指令設(shè)置的符號(hào)擴(kuò)展指令,用來(lái)擴(kuò)展被除數(shù)字節(jié)/字為字/雙字的符號(hào),所擴(kuò)充的高位字節(jié)/字部分均為低位的符號(hào)位。CBW指令將AL的最高有效位D7擴(kuò)展至AH
即:若D7=0,則(AH)=00000000B=00H;
若D7=1,則(AH)=11111111B=FFH。CWD指令將AX的最高有效位D15擴(kuò)展形成DX。CBW和CWD在使用時(shí)應(yīng)安排在IDIV之前,用來(lái)獲取除法指令所需要的被除數(shù)。執(zhí)行結(jié)果對(duì)標(biāo)志位沒(méi)有影響。五.十進(jìn)制調(diào)整指令8086為完成十進(jìn)制數(shù)運(yùn)算而專(zhuān)設(shè)了一組十進(jìn)制調(diào)整指令。1.DAA
;加法的十進(jìn)制調(diào)整指令。將存于AL寄存器中的2位BCD碼加法運(yùn)算的結(jié)果調(diào)整為2位壓縮型十進(jìn)制數(shù),仍保留在AL中。它必須跟在ADD或ADC指令之后使用。調(diào)整過(guò)程:若(AL∧0FH)>9H或AF=1(低四位非法),則AL+06H→AL,1→AF;若AL>9FH或CF=1(高四位非法),則AL+60H→AH,1→CF。例:計(jì)算54+63,采用BCD碼。 MOVAL,54H MOVBL,63H ADDAL,BL DAA01010100;54H+01100011;63H10110111;B7H>9FH+01100000
;60H100010111;17H,CF=12.DAS
;減法的十進(jìn)制調(diào)整指令將AL寄存器中的減法運(yùn)算結(jié)果調(diào)整為2位壓縮型十進(jìn)制數(shù),仍保留在AL中。減法是加法的逆運(yùn)算,對(duì)減法的調(diào)整操作是減6調(diào)整。調(diào)整過(guò)程:若(AL∧0FH)>9H或AF=1,則AL-06H→AL;若AL>9FH或CF=1,則AL-60H→AL。3.AAA
;加法的ASCII碼調(diào)整指令。將存于AL寄存器中的1位ASCII碼數(shù)加法運(yùn)算的結(jié)果調(diào)整為1位非壓縮型十進(jìn)制數(shù),仍保留在AL中;如果向高位有進(jìn)位(AF=1),則進(jìn)到AH中。該指令只能放在ADD之后。調(diào)整過(guò)程:①若(AL∧0FH)≤9H且AF=0(低四位合法),轉(zhuǎn)③;②若(AL∧0FH)>9H或AF=1(低四位非法),則AL+6→AL,AH+1→AH,1→AF,1→CF;③AL高4位無(wú)意義,參與運(yùn)算也不應(yīng)影響結(jié)果,屏蔽之:
(AL∧0FH)→AL,0→AF→CF。例計(jì)算5+9,采用ASCII碼。用ACSII碼表示:AL=00110101B=35H,BL=00111001B=39H,AH=00H.指令為: MOVAL,35H MOVBL,39H ADDAL,BL AAA結(jié)果:(AH)=00000001B,(AL)=00000100B,即十進(jìn)制14;AF=1,CF=100110101+0011100101101110;低4位>9
+0110
01110100;AF=1CF,AH+1AH∧00001111;屏蔽高4位00000100;AL高4位清0,低4位不變②③4.AAS
;減法的ASCII碼調(diào)整指令,它必須跟在SUB或SBB指令之后,用來(lái)將AL寄存器中的減法運(yùn)算結(jié)果調(diào)整為1位非壓縮型十進(jìn)制數(shù);如有借位,則保留在借位標(biāo)志CF中。調(diào)整過(guò)程:①若(AL∧0FH)≤9H且AF=0(低四位合法),轉(zhuǎn)③;②若(AL∧0FH)>9H或AF=1(低四位非法),則AL-6→AL,AH-1→AH,1→AF,1→CF;③AL高4位無(wú)意義,參與運(yùn)算也不應(yīng)影響結(jié)果,屏蔽之:
(AL∧0FH)→AL,0→AF→CF。5.AAM
;乘法的ASCII碼調(diào)整指令將AL中的乘法運(yùn)算結(jié)果調(diào)整為2位非壓縮型十進(jìn)制數(shù),其高位在AH中,低位在AL中。AAM用于乘法指令之后,參加乘法運(yùn)算的十進(jìn)制數(shù)必須是非壓縮型。調(diào)整過(guò)程:將AL中的乘積除以10,商存于AH中,余數(shù)存于AL中。MUL指令之前一般安排兩條AND指令(為什么?)例: ANDAL,0FH;初始ACSII碼AL=37H,BL=39H ANDBL,0FH;使得AL=07H,BL=09H MULBL;則AL=3FH AAM;則AH=06H,AL=03H6.AAD
;除法的ASCII碼調(diào)整指令將累加器AX中的2位非壓縮型十進(jìn)制的被除數(shù)調(diào)整為二進(jìn)制數(shù),保留在AL中。在除法之前進(jìn)行調(diào)整操作。調(diào)整過(guò)程:(AL+AH×10)→AL。例:十進(jìn)制數(shù)67,非壓縮BCD碼表示時(shí),AH=00000110B,AL=00000111B,
執(zhí)行AAD時(shí),將AH內(nèi)容乘以10,得到00111100,再加到AL中,結(jié)果為01000011B=43H。
算數(shù)運(yùn)算類(lèi)指令小結(jié)包括二進(jìn)制運(yùn)算指令和十進(jìn)制運(yùn)算調(diào)整指令;算數(shù)運(yùn)算指令影響標(biāo)志位;注意有符號(hào)和無(wú)符號(hào)的區(qū)別;乘除法指令是單操作數(shù)指令,另一個(gè)操作數(shù)約定在AX/DX||AX中,運(yùn)算結(jié)果的存放也有相應(yīng)的約定;SUB和CMP指令都做減法運(yùn)算,但CMP指令不改變操作數(shù)的值,而改變標(biāo)志位的值;加1和減1指令,一般用于修改地址指針和修改循環(huán)計(jì)數(shù)器;十進(jìn)制運(yùn)算調(diào)整指令,分為壓縮的和非壓縮的兩種,僅限于字節(jié),只對(duì)AL/AX中的內(nèi)容調(diào)整。
邏輯運(yùn)算和
移位循環(huán)類(lèi)指令一.邏輯運(yùn)算指令1.ANDd,s ;d←d∧s,按位“與”操作,可實(shí)現(xiàn)位清0。例: MOVAL,B6H ANDAL,0FH 10110110
∧ 00001111
;屏蔽字OFH
00000110;高4位清02.ORd,s
;d←d∨s,按位“或”操作;可實(shí)現(xiàn)位置1。例: MOVAL,B6H ORAL,0FH 10110110
∨ 00001111
;屏蔽字0FH10111111;低4位置13.XORd,s
;d←d⊕s,按位“異或”操作主要用于將若干位取反的操作:需取反的位與1異或,保持不變的位與0異或。例:XORAL,AL;可以實(shí)現(xiàn)AL清0,且CF=0。4.NOTd
;d←d,按位取反操作5.TESTd,s
;d∧s,按位“與”操作與AND類(lèi)似,但不送回結(jié)果,后面常跟轉(zhuǎn)移指令。二.移位指令與
循環(huán)移位指令格式:OPd,CNT操作:對(duì)目的操作數(shù)d移動(dòng)由CNT指定的次數(shù);移位結(jié)果送d;移出的位送標(biāo)志位CF。說(shuō)明:d可以是通用寄存器或存儲(chǔ)器操作數(shù);當(dāng)移動(dòng)次數(shù)等于1時(shí),CNT=1;
當(dāng)移動(dòng)次數(shù)大于1時(shí),必須將移動(dòng)次數(shù)事先存入CL,此時(shí)CNT為CL。(一)
移位指令移位指令分為算術(shù)移位和邏輯移位。算術(shù)移位對(duì)有符號(hào)數(shù)移位,移位過(guò)程中保持符號(hào)不變;邏輯移位對(duì)無(wú)符號(hào)數(shù)移位,總是用“0”填補(bǔ)已空出的位。根據(jù)移位的結(jié)果置標(biāo)志寄存器中的狀態(tài)標(biāo)志(AF位除外)。若移1位,并使得最高位(符號(hào)位)發(fā)生變化,則將溢出標(biāo)志OF置“1”;若移多位,則OF標(biāo)志無(wú)效。C0CSAL算數(shù)左移SAR算數(shù)右移C0SHL邏輯左移CSHR邏輯右移0相同不同例:AL=abcdefgh,CL=3。a~h均為0、1二進(jìn)制數(shù)。分別執(zhí)行四種移位指令。 CF AL執(zhí)行前/ abcdefgh1.SALAL,CL c defgh000
2.SARAL,CL f
aaaabcde3.SHLAL,CL c defgh000
4.SHRAL,CL f
000abcdeC0CC0C0(二)
循環(huán)移位指令循環(huán)移位指令是將操作數(shù)首尾相接進(jìn)行移位,它分為不帶進(jìn)位位與帶進(jìn)位位兩種循環(huán)移位。這類(lèi)指令只影響CF和OF標(biāo)志:CF標(biāo)志總是保持移出的最后一位的狀態(tài)。若只循環(huán)移1位,且使最高位發(fā)生變化,則OF標(biāo)志置“1”;若循環(huán)移多位,則OF標(biāo)志無(wú)效。CCROL循環(huán)左移ROR循環(huán)右移CCRCL帶進(jìn)位位循環(huán)左移RCR帶進(jìn)位位循環(huán)右移例:設(shè)AL=abcdefgh,CL=3,CF=i。a~i均為0、1二進(jìn)制數(shù)。分別執(zhí)行四種循環(huán)移位指令。 CF AL執(zhí)行前 i abcdefgh1.ROLAL,CL c defghabc2.RORAL,CL f fghabcde3.RCLAL,CL c defghiab4.RCRAL,CL f ghiabcdeCCCC
串操作類(lèi)指令串操作類(lèi)指令是惟一一類(lèi)在存儲(chǔ)器內(nèi)的源與目標(biāo)之間進(jìn)行操作的指令。使用約定串操作指令均采用隱含尋址:源數(shù)據(jù)串由DS:SI提供;目標(biāo)串由ES:DI提供,即將源串和目標(biāo)串的首元素或末元素的偏移地址分別置入SI和DI中。如果要在同一段內(nèi)進(jìn)行串操作,必須使DS和ES指向同一段。數(shù)據(jù)串的長(zhǎng)度預(yù)先送CX寄存器。使用CLD、STD指令設(shè)置方向標(biāo)志位: DF=0:串操作由低向高地址進(jìn)行,SI和DI內(nèi)容應(yīng)遞增; DF=1:串操作由高向低地址進(jìn)行,SI和DI內(nèi)容應(yīng)遞減。每條指令有兩種形式,分別對(duì)應(yīng)著字節(jié)操作和字操作。
如:MOVS d,s指令有以下兩種形式: MOVSBd,s ;字節(jié)傳送MOVSWd,s ;字傳送一.5個(gè)基本的
串操作指令1.MOVS將DS:SI源串中的1個(gè)字節(jié)或字,傳送到ES:DI作為指針的目標(biāo)串中,自動(dòng)修改SI/DI,使之指向下一個(gè)元素。在MOVS指令之前可以加上重復(fù)前綴REP。具體操作:字節(jié)傳送MOVSB
;
((ES):(DI))←((DS):(SI)),SI±1,DI±1;字傳送MOVSW
;((ES):(DI+1)(DI))←((DS):(SI+1)(SI)),SI±2,DI±2。2.CMPS將DS:SI源串的1個(gè)元素減去由ES:DI作為指針的目標(biāo)串中相對(duì)應(yīng)的1個(gè)元素,不回送結(jié)果,只根據(jù)結(jié)果特征置標(biāo)志位;相應(yīng)地修改SI和DI。在CMPS指令前可以加重復(fù)前綴REPE/REPZ,可用來(lái)確定兩個(gè)串中第一個(gè)不相同的數(shù)據(jù)
。具體操作:字節(jié)比較CMPSB
;
((DS):(SI))←((ES):(DI)),
SI±1,DI±1;字比較CMPSW
;((DS):(SI+1)(SI))←((ES):(DI+1)(DI)), SI±2,DI±2。3.SCAS從目標(biāo)串ES:DI中搜索(查找)某個(gè)關(guān)鍵字,要求將待查找的關(guān)鍵字在事先置入AX或AL中。不傳送結(jié)果,只根據(jù)結(jié)果置標(biāo)志位。具體操作:字節(jié)查找SCASB
;AL-((DI)),DI←DI±1;字查找SCASW;AX-((DI+1)(DI)),DI←DI±2。通常在SCAS前加重復(fù)前綴REPNE/REPNZ,用來(lái)從目標(biāo)串中尋找關(guān)鍵字,操作一直進(jìn)行到ZF=1(查到了某關(guān)鍵字)或CX=0(終未查找到)為止。4.LODS將源串中由SI所指向的元素取到AX/AL寄存器中,修改SI的內(nèi)容。一般不加重復(fù)前綴,常用來(lái)和其他指令結(jié)合使用。具體操作:字節(jié)取LODSB ;AL←((SI)),SI←SI±1;字取LODSW ;AX←((SI+1)(SI)),SI←SI±2。5.STOS將AX/AL寄存器中的1個(gè)字或字節(jié)存入由DI作為指針的目標(biāo)串中,同時(shí)修改DI,一般不加重復(fù)前綴(否則串元素值都相同)。具體操作:字節(jié)存LODSB ;((DI))←AL,DI←DI±1;字取LODSW ;((DI+1)(DI))←AX,DI←DI±2。二.3個(gè)重復(fù)前綴為加快串操作的執(zhí)行,在基本串操作指令的前方加上重復(fù)前綴,共有無(wú)條件重復(fù)(REP)、相等/為0時(shí)重復(fù)(REPE/REPZ)和不等/不為0重復(fù)(REPNE/REPNZ)5種重復(fù)前綴。帶有重復(fù)前綴的串操作指令,每處理完一個(gè)元素能自動(dòng)修改CX的內(nèi)容(按字節(jié)/字處理減1/減2),以完成計(jì)數(shù)功能。當(dāng)CX≠0時(shí),繼續(xù)串操作,直到CX=0才結(jié)束串操作。1.REP ;常與MOVS連用,執(zhí)行到CX=0為止;2.REPE和REPZ;常與CMPS連用。只有當(dāng)ZF=1且CX≠0時(shí),才重復(fù)執(zhí)行串操作,比較操作一直進(jìn)行到ZF=0或CX=0時(shí)為止;3.REPNE和REPNZ;常與SCAS連用。只有當(dāng)ZF=0且CX≠0時(shí)才重復(fù)執(zhí)行串操作,搜索操作一直進(jìn)行到ZF=1或CX=0為止。
程序控制指令一.無(wú)條件轉(zhuǎn)移:3條
對(duì)無(wú)符號(hào)數(shù)的條件轉(zhuǎn)移:4條
二.條件轉(zhuǎn)移:18條
對(duì)有符號(hào)數(shù)的條件轉(zhuǎn)移:4條
單標(biāo)志轉(zhuǎn)移:10條
三.循環(huán)控制:4條
四.中斷:3條一.無(wú)條件轉(zhuǎn)移指令1.JMP目標(biāo)標(biāo)號(hào)允許程序流無(wú)條件地轉(zhuǎn)移到由目標(biāo)標(biāo)號(hào)指定的地址,去繼續(xù)執(zhí)行從該地址開(kāi)始的程序。轉(zhuǎn)移可分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移兩類(lèi)。段內(nèi)轉(zhuǎn)移是指在同一代碼段的范圍之內(nèi)進(jìn)行轉(zhuǎn),此時(shí),只需要改變指令指針I(yè)P寄存器的內(nèi)容,即用新的轉(zhuǎn)移目標(biāo)地址(指偏移地址)代替原有的IP值就可實(shí)現(xiàn)轉(zhuǎn)移。段間轉(zhuǎn)移則是要轉(zhuǎn)移到一個(gè)新的代碼段去執(zhí)行指令,此時(shí)不僅要修改IP的內(nèi)容,還要修改段寄存器CS的內(nèi)容才能實(shí)現(xiàn)轉(zhuǎn)移。此時(shí)的轉(zhuǎn)移目標(biāo)地址應(yīng)由新的段地址和偏移地址兩部分組成。JMP指令的4種格式根據(jù)目標(biāo)地址的位置與尋址方式的不同,JMP指令有4種基本格式。①段內(nèi)直接轉(zhuǎn)移段內(nèi)直接轉(zhuǎn)移是指目標(biāo)地址就在當(dāng)前代碼段內(nèi),其偏移地址(即目標(biāo)地址的偏移量)與本指令當(dāng)前IP值(即JMP指令的下一條指令的地址)之間的字節(jié)距離即位移量將在指令中直接給出。此時(shí),目標(biāo)標(biāo)號(hào)偏移地址為:
目標(biāo)標(biāo)號(hào)偏移地址=(IP)+指令中位移量
式中,(IP)是指IP的當(dāng)前值。位移量的字節(jié)數(shù)則根據(jù)微處理器的位數(shù)而定。不同的位移量若位移量只有1個(gè)字節(jié),則稱(chēng)為段內(nèi)短轉(zhuǎn)移,其目標(biāo)標(biāo)號(hào)與本指令之間的距離不能超過(guò)+127和-128字節(jié)范圍。格式:JMPSHORTOPR
操作:(IP)←(IP)+8位位移量,OPR為即將轉(zhuǎn)移到的指令的偏移地址的符號(hào)。
如:JMPSHORTPROG_S若位移量占2個(gè)字節(jié),則稱(chēng)為段內(nèi)近轉(zhuǎn)移,其目標(biāo)標(biāo)號(hào)與本指令之間的距離不能超過(guò)±32K字節(jié)范圍。格式:JMPNEARPTROPR操作:(IP)←(IP)+16位位移量。如:JMPNEARPTRPROG_N注意:段的偏移地址是周期性循環(huán)計(jì)數(shù)的,這意味著在偏移地址FFFFH之后的一個(gè)位置是偏移地址0000H。因此,若IP指向偏移地址FFFFH,而要轉(zhuǎn)移到存儲(chǔ)器中的后兩個(gè)字節(jié)地址,則程序流將在偏移地址0001H處繼續(xù)執(zhí)行。②段內(nèi)間接轉(zhuǎn)移一種間接尋址方式,它將段內(nèi)的目標(biāo)地址(指偏移地址或按間接尋找方式計(jì)算出的有效地址)先存放在某通用寄存器或存儲(chǔ)器的某兩個(gè)地址連續(xù)的單元中,指令中只需給出該寄存器號(hào)或存儲(chǔ)單元地址即可。格式:JMPWORDPTROPR或JMPreg操作:(IP)←(EA),其中EA由OPR的尋址方式確定。例如:JMPBX ;BX未打[],仍表示BX的內(nèi)容是地址 JMPWORDPTR[1000H]③段間直接(遠(yuǎn))轉(zhuǎn)移程序由當(dāng)前代碼段轉(zhuǎn)移到其他代碼段,轉(zhuǎn)移范圍超過(guò)±32K字節(jié)。指令中直接給出目標(biāo)標(biāo)號(hào)的段地址和偏移地址。格式:JMPFARPTROPR操作:(IP)←OPR的段內(nèi)偏移地址, (CS)←OPR所在段的段地址。例如:JMPFARPTRADDR2 ;ADDR2是當(dāng)前代碼段之
;外的另一個(gè)代碼段中的一個(gè)內(nèi)
;存單元偏移地址。④段間間接轉(zhuǎn)移以間接尋址方式來(lái)實(shí)現(xiàn)由當(dāng)前代碼段轉(zhuǎn)移到其他代碼段。將目標(biāo)地址的段地址和偏移地址先存放于存儲(chǔ)器的4個(gè)連續(xù)地址中,其中前2個(gè)字節(jié)為偏移地址,后2個(gè)字節(jié)為段地址,指令中只需給出存放目標(biāo)地址的4個(gè)連續(xù)地址首字節(jié)的偏移地址值.格式:JMPDWORDPTROPR ;OPR是即將要轉(zhuǎn)移到的指令所在段地址、偏移地址的存放地址操作:(IP)←(OPR+1,OPR),(CS)←(OPR+3,OPR+2)例如:JMPDWORDPTR[BX+ADDR3]2.CALL過(guò)程名
;無(wú)條件調(diào)用過(guò)程指令CALL指令將迫使CPU暫停執(zhí)行主程序后續(xù)的下一條指令(即斷點(diǎn)),轉(zhuǎn)去執(zhí)行指定的過(guò)程;過(guò)程執(zhí)行完畢,再用返回指令RET將程序返回到斷點(diǎn)。8086/8088指令系統(tǒng)中把處于當(dāng)前代碼段的過(guò)程稱(chēng)為近過(guò)程,用NEAR表示,而把其他代碼段的過(guò)程稱(chēng)為遠(yuǎn)過(guò)程,用FAR表示。調(diào)用近過(guò)程,只需將當(dāng)前IP值入棧;如果是遠(yuǎn)過(guò)程,則必須將當(dāng)前CS和IP的值一起入棧。CALL指令的4種格式①段內(nèi)直接調(diào)用如: CALLPROC_N ;PROC_N是一個(gè)近標(biāo)號(hào)②段內(nèi)間接調(diào)用如: CALLBX ;BX未打[],仍表示BX的內(nèi)容是地址 CALLWORDPTR[BX+SI] ③段間直接調(diào)用如:CALLFARPTRPROC_F ;PROC_F是一個(gè)遠(yuǎn)標(biāo)號(hào) CALL2000H:5600H④段間間接調(diào)用如:CALLDWORDPTR[DI]3.RET
;過(guò)程返回指令功能是從堆棧頂部彈出由CALL指令壓入的斷點(diǎn)地址值,迫使CPU返回到調(diào)用過(guò)程的斷點(diǎn)去繼續(xù)執(zhí)行。該指令應(yīng)安排在過(guò)程的出口即過(guò)程的最后一條指令處。RET指令與CALL指令相呼應(yīng),CALL指令安排在調(diào)用過(guò)程中,RET指令安排在被調(diào)用過(guò)程末尾處。并且,為了能正確返回,返回指令的類(lèi)型要和調(diào)用指令的類(lèi)型相對(duì)應(yīng)。在8086/8088指令系統(tǒng)中,段內(nèi)返回與段間返回的指令形式是一樣的,都是RET,但它們的指令代碼卻不同,段內(nèi)返回指令的代碼為C3H(或C2H),而段間返回指令的代碼為CBH(或CAH)。
二.條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令共有18條,這些指令將根據(jù)CPU執(zhí)行上一條指令時(shí),某一個(gè)或某幾個(gè)標(biāo)志位的狀態(tài)而決定是否控制程序轉(zhuǎn)移。如果滿(mǎn)足指令中所要求的條件,則產(chǎn)生轉(zhuǎn)移;否則,將繼續(xù)往下執(zhí)行緊接著條件轉(zhuǎn)移指令后面的一條指令。為縮短指令長(zhǎng)度,所有的條件轉(zhuǎn)移指令都被設(shè)計(jì)成短轉(zhuǎn)移,即轉(zhuǎn)移目標(biāo)與本指令之間的字節(jié)距離在-128~+127范圍以?xún)?nèi)。對(duì)無(wú)符號(hào)數(shù)和有符號(hào)數(shù)
的條件轉(zhuǎn)移指令類(lèi)別指令助記符測(cè)試條件指令功能無(wú)符號(hào)數(shù)測(cè)試比較JA/JNBE目標(biāo)標(biāo)號(hào)JAE/JNB目標(biāo)標(biāo)號(hào)JB/JNAE目標(biāo)標(biāo)號(hào)JBE/JNA目標(biāo)標(biāo)號(hào)CF∧ZF=0CF=0CF=1CF∧ZF=1高于/不低于則轉(zhuǎn)移高于等于/不低于則轉(zhuǎn)移低于/不高于等于則轉(zhuǎn)移低于等于/不高于則轉(zhuǎn)移有符號(hào)數(shù)測(cè)試比較JG/JNLE目標(biāo)標(biāo)號(hào)JGE/JNL目標(biāo)標(biāo)號(hào)JL/JNGE目標(biāo)標(biāo)號(hào)JLE/JNG目標(biāo)標(biāo)號(hào)(SF⊕OF)∧ZF=0SF⊕OF=0SF⊕OF=1(SF⊕OF)∧ZF=1大于/不小于等于則轉(zhuǎn)移大于等于/不小于則轉(zhuǎn)移小于/不大于等于則轉(zhuǎn)移小于等于/不大于則轉(zhuǎn)移單標(biāo)志轉(zhuǎn)移指令指令助記符測(cè)試條件指令功能JC目標(biāo)標(biāo)號(hào)JNC目標(biāo)標(biāo)號(hào)JZ/JE目標(biāo)標(biāo)號(hào)JNZ/JNE目標(biāo)標(biāo)號(hào)JS目標(biāo)標(biāo)號(hào)JNS目標(biāo)標(biāo)號(hào)JO目標(biāo)標(biāo)號(hào)JNO目標(biāo)標(biāo)號(hào)JP/JPE目標(biāo)標(biāo)號(hào)JNP/JPO目標(biāo)標(biāo)號(hào)CF=1CF=0ZF=1ZF=0SF=1SF=0OF=1OF=0PF=1PF=0有進(jìn)位則轉(zhuǎn)移無(wú)進(jìn)位則轉(zhuǎn)移結(jié)果為0/相等則轉(zhuǎn)移結(jié)果不為0/不相等則轉(zhuǎn)移符號(hào)為負(fù)則轉(zhuǎn)移符號(hào)為正則轉(zhuǎn)移溢出則轉(zhuǎn)移不溢出則轉(zhuǎn)移奇偶位為1/為偶則轉(zhuǎn)移奇偶位為0/為奇則轉(zhuǎn)移注意所有條件轉(zhuǎn)移指令都是相對(duì)轉(zhuǎn)移形式,其轉(zhuǎn)移范圍-128B~+127B。
當(dāng)需要轉(zhuǎn)移到較遠(yuǎn)目標(biāo)地址時(shí),可先用條件轉(zhuǎn)移指令轉(zhuǎn)到附近一個(gè)單元,該單元事先放一條無(wú)條件轉(zhuǎn)移指令,可通過(guò)該指令轉(zhuǎn)移到較遠(yuǎn)的目標(biāo)地址去。為無(wú)符號(hào)數(shù)和有符號(hào)數(shù)提供了兩組不同的條件轉(zhuǎn)移指令。有一部分轉(zhuǎn)移指令可用兩種不同助記符表示,其功能相同,如數(shù)M高于數(shù)N=M不低于也不等于N,所以JA與JNBE功能相同。條件轉(zhuǎn)移指令的使用條件轉(zhuǎn)移指令前面常有TEST指令例:AX中存放的無(wú)符號(hào)數(shù),若為偶數(shù),則直接除以2;若為奇數(shù),則加1再除以2。編程實(shí)現(xiàn)該功能。 TESTAX,01H ;最低位與1相與,判斷奇偶性 JZEVEN ;ZF=0,為偶數(shù),則轉(zhuǎn)到EVEN ADDAX,1 ;否則為奇數(shù),需要加1EVEN:SHRAX,1 ;除以2三.循環(huán)控制指令在設(shè)計(jì)循環(huán)程序時(shí),可以用循環(huán)控制指令來(lái)實(shí)現(xiàn)。循環(huán)控制指令實(shí)際上是一組增強(qiáng)型的條件轉(zhuǎn)移指令,它也是根據(jù)測(cè)試狀態(tài)標(biāo)志判定是否滿(mǎn)足條件而控制轉(zhuǎn)移。所不同的是,前述的條件轉(zhuǎn)移指令只能測(cè)試由執(zhí)行前面指令所設(shè)置的標(biāo)志,而循環(huán)控制指令是自己進(jìn)行某種運(yùn)算后來(lái)設(shè)置狀態(tài)標(biāo)志的。循環(huán)控制指令共有4條,都與CX寄存器配合使用,CX中存放著循環(huán)次數(shù),使用這些指令之前都要把循環(huán)次數(shù)存入CX。這些指令所控制的目標(biāo)地址的范圍都在-128~+127字節(jié)之內(nèi)。1.LOOP目標(biāo)標(biāo)號(hào)功能是先將CX減1后送回CX,再判斷CX是否為0,若CX≠0,則轉(zhuǎn)移到目標(biāo)標(biāo)號(hào)所給定的地址繼續(xù)循環(huán);否則,結(jié)束循環(huán),順序執(zhí)行下一條指令。使用LOOP指令前,應(yīng)將循環(huán)次數(shù)送入CX寄存器。其操作過(guò)程與條件轉(zhuǎn)移指令類(lèi)似,只是它的位移量應(yīng)為負(fù)值。2.JCXZ目標(biāo)標(biāo)號(hào)指令不對(duì)CX寄存器內(nèi)容進(jìn)行操作,只根據(jù)CX內(nèi)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 私人借款合同范本【常用版】8篇
- 公路路基工程施工合同
- 2025年江蘇貨運(yùn)從業(yè)資格證模擬考試下載什么軟件
- 中小企業(yè)合同管理流程控制
- 2025年迪慶貨運(yùn)從業(yè)資格證模擬考試題目
- 教育培訓(xùn)范文及案例分享
- 勞務(wù)分包合同臨建
- 訂餐配送合同7篇
- 合同協(xié)議鋼材采購(gòu)合同8篇
- 高層精裝二手房買(mǎi)賣(mài)合同書(shū)7篇
- 2025年上半年潛江市城市建設(shè)發(fā)展集團(tuán)招聘工作人員【52人】易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 旋轉(zhuǎn)類(lèi)機(jī)電設(shè)備故障預(yù)測(cè)、診斷研究
- 旅游電子商務(wù)(第2版) 課件全套 周春林 項(xiàng)目1-8 電子商務(wù)概述-旅游電子商務(wù)數(shù)據(jù)挖掘
- 企業(yè)承包經(jīng)營(yíng)合同范本
- 中學(xué)校長(zhǎng)2025春開(kāi)學(xué)典禮講話(huà):以黃旭華之魂、DeepSeek 之智、哪吒之氣逐夢(mèng)新程
- 【課件】自然環(huán)境課件-2024-2025學(xué)年七年級(jí)地理下冊(cè)人教版
- 2025年01月公安部第三研究所公開(kāi)招聘人民警察筆試筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025-2030全球鋰電池用隔膜行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年南京鐵道職業(yè)技術(shù)學(xué)院高職單招高職單招英語(yǔ)2016-2024歷年頻考點(diǎn)試題含答案解析
- 《抖音高活躍群體研究報(bào)告》
- 2025年高考作文備考訓(xùn)練之二元思辨作文題目解析及范文:我與“別人”
評(píng)論
0/150
提交評(píng)論