《微處理器與接口技術(shù)》課件第3章 8088 8086指令及程序設(shè)計(jì)_第1頁(yè)
《微處理器與接口技術(shù)》課件第3章 8088 8086指令及程序設(shè)計(jì)_第2頁(yè)
《微處理器與接口技術(shù)》課件第3章 8088 8086指令及程序設(shè)計(jì)_第3頁(yè)
《微處理器與接口技術(shù)》課件第3章 8088 8086指令及程序設(shè)計(jì)_第4頁(yè)
《微處理器與接口技術(shù)》課件第3章 8088 8086指令及程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

3.18088/8086指令格式8088/8086的指令類型多、功能強(qiáng),其指令系統(tǒng)是x86系列處理器的基本指令系統(tǒng),總共有六類92種指令,分別是數(shù)據(jù)傳送、算數(shù)運(yùn)算、邏輯運(yùn)算、串操作、控制轉(zhuǎn)移和處理器控制。微處理器的指令有機(jī)器碼和助記符兩種方式表達(dá)。指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示指令要執(zhí)行的操作,通常是易于記憶的英文縮寫。操作數(shù)表示指令操作的對(duì)象,可以顯式或隱式給出,又分為源操作數(shù)和目標(biāo)操作數(shù)兩種,源操作數(shù)表明參加操作的數(shù)據(jù)或地址,目標(biāo)操作數(shù)表明運(yùn)算結(jié)果的地址。

地址

機(jī)器碼

指令(助記符)1900:001F B409 MOV AH,09H3.18088/8086指令格式根據(jù)存取位置的不同,操作數(shù)可以分為立即數(shù)、寄存器操作數(shù)和存儲(chǔ)器操作數(shù)。1.立即數(shù)操作數(shù)在指令中直接給出的操作數(shù)稱為立即數(shù)操作數(shù),例如MOVAH,09H中,09H就是立即數(shù)操作數(shù)。使用立即數(shù)做操作數(shù)需要注意:(1)立即數(shù)只能作為源操作數(shù),不能做目標(biāo)操作數(shù);(2)立即數(shù)取值不能超出字長(zhǎng)的數(shù)值表達(dá)范圍。2.寄存器操作數(shù)將8088/8086的通用寄存器和段寄存器作為操作數(shù)稱為寄存器操作數(shù),可用作源操作數(shù)或目標(biāo)操作數(shù)。例如MOVAH,09H中,AH是寄存器操作數(shù),而且是源操作數(shù)。3.存儲(chǔ)器操作數(shù)存儲(chǔ)在在內(nèi)存中的操作數(shù),稱為存儲(chǔ)器操作數(shù),可用作源操作數(shù)或目標(biāo)操作數(shù),字長(zhǎng)為8位或16位。3.28088/8086尋址方式尋址方式指的是獲取操作數(shù)地址的方法,一般分為數(shù)據(jù)地址尋址方式和程序地址尋址方式。在8088/8086指令系統(tǒng)中,操作數(shù)的尋址方式有8種。1.立即尋址立即尋址(ImmediateAddressing)方式,指令中包含8位或16位的操作數(shù)存放于代碼段中,隨指令碼直接參加運(yùn)算。MOVAL,12H ;AL←12HMOVAX,1234H ;AX←1234H立即尋址只能用于源操作數(shù),可以理解為復(fù)制數(shù)據(jù),復(fù)制后源操作數(shù)不會(huì)失去數(shù)據(jù),常用于賦初值。3.28088/8086尋址方式2.寄存器尋址寄存器尋址(RegisterAddressing)方式,指令的操作數(shù)在內(nèi)部寄存器中,可以是8位或16位操作數(shù),由所存放的寄存器決定。執(zhí)行指令的時(shí)候,不需要訪問(wèn)存儲(chǔ)器,是最快的尋址方式。寄存器號(hào)比存儲(chǔ)地址短,因此編譯后的機(jī)器碼長(zhǎng)度最短。源操作數(shù)和目標(biāo)操作數(shù)都是寄存器時(shí),兩個(gè)寄存器必須等字長(zhǎng)操作數(shù)不能都是段寄存器;代碼段寄存器不能作為目標(biāo)操作數(shù)。AX=1234H,指令MOVDX,AX執(zhí)行后,DX寄存器中的值為1234H。3.28088/8086尋址方式3.直接尋址指令中給出存放操作數(shù)的存儲(chǔ)單元地址,用中括號(hào)“[]”括起16位的有效地址,默認(rèn)段為數(shù)據(jù)段,可以段重設(shè)。直接尋址允許操作數(shù)不在數(shù)據(jù)段,但要用段重設(shè)符號(hào)說(shuō)明。例如,指令MOVAL,ES:[1100H]表示將附加段內(nèi)偏移地址1100H存儲(chǔ)單元的內(nèi)容賦給AL寄存器;在匯編程序中,可以用一個(gè)符號(hào)代表數(shù)值,表示操作數(shù)的偏移地址,稱為符號(hào)地址。VARDB1200HMOVAL,VAR或 MOVAL,[VAR]3.28088/8086尋址方式3.直接尋址例如,DS=2000H,指令MOVAX,[1200H]的執(zhí)行情況如圖3-2所示,其過(guò)程如下:(1)操作數(shù)默認(rèn)在數(shù)據(jù)段,因此從DS寄存器中獲得數(shù)據(jù)段段基地址,從指令中獲得偏移地址,因此源操作數(shù)的物理地址為:20000H+1200H=21200H。(2)因?yàn)槟繕?biāo)操作數(shù)是16位的AX,所以,從存儲(chǔ)單元21200H和21201H中獲得12H和34H。(3)在8088/8086中,字(Word)的存儲(chǔ)占兩個(gè)單元,低8位在低地址,高8位在高地址,所以將3412H存放在AX中。3.28088/8086尋址方式4.寄存器間接尋址將操作數(shù)所在儲(chǔ)單元的偏移地址存放于寄存器中,指令中給出寄存器名,并用中括號(hào)“[]”括起,只允許使用基址寄存器BX和BP(也稱為基址尋址方式),以及變址寄存器SI和DI(也稱為變址尋址方式)。使用SI、DI和BX寄存器,默認(rèn)數(shù)據(jù)存放在數(shù)據(jù)段中,使用BP寄存器,默認(rèn)數(shù)據(jù)存放在附加段中,可以段重設(shè)。3.28088/8086尋址方式4.寄存器間接尋址DS=2000H,SI=1200H,指令MOVAX,[1200H]的執(zhí)行情況如圖所示。由圖可見(jiàn),因?yàn)槭褂昧薙I寄存器存放操作數(shù)所在存儲(chǔ)單元的偏移地址,所以操作數(shù)默認(rèn)在數(shù)據(jù)段,從DS寄存器中獲得數(shù)據(jù)段的段基地址,從SI寄存器中獲得偏移地址,源操作數(shù)的物理地址為:20000H+1200H=21200H。從存儲(chǔ)單元21200H和21201H中獲得12H和34H,將3412H存放在AX中。3.28088/8086尋址方式5.寄存器相對(duì)尋址將操作數(shù)所在存儲(chǔ)單元的偏移地址分為兩部分,一部分存放于一個(gè)基址或變址寄存器中,另一部分,以一個(gè)8位或16位的相對(duì)偏移量在指令中給出。不同寄存器對(duì)應(yīng)不同的段,遵循與寄存器間接選址相同的段選取規(guī)則。用中括號(hào)“[]”括起“寄存器名+相對(duì)偏移量”,或只括起寄存器名。寄存器相對(duì)尋址方式可以用查表訪問(wèn),例如,在數(shù)據(jù)段中,某字節(jié)型數(shù)據(jù)表的首地址為BUF,要將該表中的第5個(gè)存儲(chǔ)單元的值存放到AH中,可以先用指令MOVSI,5使SI等于5,然后執(zhí)行指令MOVAH,[BUF+SI]。寄存器相對(duì)尋址的格式有多種等價(jià)形式,例如:MOV AL,BUF[DI]和MOV AL,[DI]BUF。MOV AL,BUF+[DI]和MOV AL,[DI]+BUF。3.28088/8086尋址方式5.寄存器相對(duì)尋址如果DS=2000H,SI=1100H,指令“MOVAX,[SI+100H]”由圖可見(jiàn),從DS寄存器中獲得數(shù)據(jù)段段基地址,從SI寄存器中獲得偏移地址1100H,還有指令給出的相對(duì)偏移量1100H,源操作數(shù)的物理地址為:20000H+1100H+100H=21200H。3.28088/8086尋址方式基址-變址尋址將操作數(shù)所在儲(chǔ)單元的偏移地址分為兩部分,一部分存放在基址寄存器BX或BP,另一部分存放在變址寄存器SI或DI,不同的基址寄存器對(duì)應(yīng)不同的段。用中括號(hào)“[]”分別括起兩個(gè)寄存器名,允許段重設(shè)。指令中不能同時(shí)出現(xiàn)兩個(gè)基址寄存器,或不能同時(shí)出現(xiàn)兩個(gè)變址寄存器。例如MOVAX,[BX][BP]和MOVAX,[SI][DI]都是錯(cuò)誤的。3.28088/8086尋址方式基址-變址尋址DS=2000H,BX=0100H,SI=1100H,指令MOVAX,[BX][SI]的執(zhí)行情況3.28088/8086尋址方式7.基址-變址-相對(duì)尋址將操作數(shù)所在儲(chǔ)單元的偏移地址分為三部分,一部分存放在基址寄存器BX或BP,另一部分存放在變址寄存器SI或DI,還有一部分為8位或16位的相對(duì)偏移量。用中括號(hào)“[]”分別括起兩個(gè)寄存器名,允許段重設(shè)。DS=2000H,BX=0100H,SI=1000H,指令MOVAX,[BX+SI+100H]的執(zhí)行情況。基址-變址-相對(duì)尋址方式也有多種等價(jià)形式,例如:MOVAL,BUF[DI][BX]、MOVAL,[BX+BUF][DI]、MOV AL,[BX+DI+BUF]、MOVAL,[BX]BUF[DI]和MOV AL,[BX+DI]BUF等等。注意:指令中不能同時(shí)出現(xiàn)兩個(gè)基址寄存器,或不能同時(shí)出現(xiàn)兩個(gè)變址寄存器。3.28088/8086尋址方式8.隱含尋址指令的操作數(shù)隱含在操作碼中,例如字位擴(kuò)展指令CBW,將AL寄存器中的字節(jié)擴(kuò)展到AX中成為字,隱含了源操作數(shù)AL和目標(biāo)操作數(shù)AX。3.38088/8086指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是使用最頻繁的一類指令,可以完成內(nèi)部寄存器之間,CPU與存儲(chǔ)器之和I/O端口之間的數(shù)據(jù)傳送。數(shù)據(jù)傳送指令一般都不會(huì)影響狀態(tài)寄存器。通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令包括MOV、PUSH、POP、XCHG和XLAT等。3.38088/8086指令系統(tǒng)最常用數(shù)據(jù)傳送指令MOV指令格式:MOVDST,SRC;(DST)←(SRC)MOV指令將源操作數(shù)復(fù)制到目標(biāo)操作數(shù),源操作數(shù)的內(nèi)容不變。其中,DST為目的操作數(shù),SRC為源操作數(shù),源操作數(shù)和目標(biāo)操作數(shù)必須等字長(zhǎng)。指令含雙操作數(shù)時(shí),目標(biāo)操作數(shù)在操作碼后面,接著用一個(gè)逗號(hào)隔開(kāi),再給出源操作數(shù)。①寄存器←立即數(shù)或存儲(chǔ)器←立即數(shù)②寄存器←寄存器或寄存器←段寄存器③寄存器←存儲(chǔ)器或存儲(chǔ)器←寄存器3.38088/8086指令系統(tǒng)最常用數(shù)據(jù)傳送指令MOVMOV指令還需要注意以下要求:①不能將FLAGS作為操作數(shù)。②不能通過(guò)MOV指令修改IP和CS,這兩個(gè)寄存器不能是目標(biāo)操作數(shù),但可以是源操作數(shù)。③兩個(gè)操作數(shù)不能都是存儲(chǔ)器操作數(shù),如果需要在兩個(gè)存儲(chǔ)器單元之間傳送數(shù)據(jù),需要兩條MOV指令實(shí)現(xiàn)其功能。④立即數(shù)不能直接傳送給段寄存器,需要兩條MOV指令實(shí)現(xiàn)其功能。⑤MOV指令的兩個(gè)操作數(shù)不能都是段寄存器,需要兩條MOV指令實(shí)現(xiàn)其功能。3.38088/8086指令系統(tǒng)(2)壓棧指令PUSH和出棧指令POP堆棧是一種數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)的存取遵循“先進(jìn)后出,后進(jìn)先出”的原則。8088/8086處理器在存儲(chǔ)空間中為堆棧設(shè)定的一個(gè)特定區(qū)域,稱為堆棧段,用來(lái)存放存儲(chǔ)器單元或寄存器內(nèi)重要但是暫時(shí)不用的數(shù)據(jù)。在8088/8086處理器中,堆棧段的基地址存放在堆棧段寄存器SS中,棧頂?shù)钠频刂反娣旁诙褩V羔樇拇嫫鱏P中,棧底是堆棧固定不變的另外一端。需要注意,堆棧的存取是雙字節(jié)的操作,所以必須是16位寄存器或存儲(chǔ)器的操作數(shù),不能是立即數(shù)。在入棧過(guò)程中,數(shù)據(jù)從棧頂進(jìn)入堆棧,地址從高地址向低地址方向變化,SP減2保持指向棧頂;在出棧過(guò)程中,數(shù)據(jù)從棧頂讀取,地址從低地址向高地址方向變化,SP加2以保持指向棧頂。堆棧操作不影響標(biāo)志位。PUSH SRC;SP←SP-2,[SP+1]←SRC高8位,[SP]←SRC低8位POP DST;DST低8位←[SP],DST高8位←[SP+1],SP←SP+23.38088/8086指令系統(tǒng)(2)壓棧指令PUSH和出棧指令POPPUSHAXPOPAX3.38088/8086指令系統(tǒng)(3) 交換指令XCHG指令格式:XCHGDST,SRC ;(DST)?(SRC)交換指令是把字長(zhǎng)相同的源操作數(shù)與目標(biāo)操作數(shù)的內(nèi)容互換,指令中的操作數(shù)可以是寄存器或存儲(chǔ)器單元,但是不能兩個(gè)操作數(shù)都是存儲(chǔ)器單元,也不能是段寄存器。(4) 查表轉(zhuǎn)換指令XLAT指令格式:XLAT;(AL)←(BX+AL)XLAT指令的源操作數(shù)和目標(biāo)操作數(shù)都是隱含尋址,把數(shù)據(jù)段內(nèi)偏移地址為BX+AL的單元的內(nèi)容傳送到寄存器AL中,可以實(shí)現(xiàn)查表功能。3.38088/8086指令系統(tǒng)2.輸入輸出指令輸入輸出指令是兩條對(duì)I/O端口進(jìn)行讀寫的指令:IN和OUT。IN指令從I/O端口讀取數(shù)據(jù)到累加器AL或AX中,OUT指令把累加器AL或AX的內(nèi)容寫入I/O端口,I/O端口的訪問(wèn)與存儲(chǔ)器訪問(wèn)類似,但引腳信號(hào)不一樣。端口訪問(wèn)有兩種形式:直接尋址和間接尋址。直接尋址時(shí),采用8位的I/O端口地址,尋址范圍為0~FFH,即總共256個(gè)端口,可以在指令中直接給出端口地址。間接尋址時(shí),采用16位的I/O端口地址,尋址范圍為0~FFFFH,即總共65536個(gè)端口,端口地址存放在寄存器DX中。3.38088/8086指令系統(tǒng)2.輸入輸出指令(1) 輸入指令I(lǐng)N指令格式:INAL/AX,PORT ;直接尋址,8位立即數(shù)PORT給出端口地址或INAL/AX,DX ;間接尋址,16位寄存器DX給出端口地址(2) 輸出指令OUT指令格式:OUTPORT,AL/AX;直接尋址,8位立即數(shù)PORT給出端口地址或OUTDX,AL/AX ;間接尋址,16位寄存器DX給出端口地址3.38088/8086指令系統(tǒng)3.取偏移地址指令LEA DST,ADD(SRC)LEA指令將存儲(chǔ)器操作數(shù)SRC所在段的16位偏移地址存放在指定的16位寄存器DST中,由于通常將獲得的地址作為地址指針,因此,常用BX、BP、SI和DI這4個(gè)間址寄存器存儲(chǔ)地址。3.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令1.加法運(yùn)算指令(1) 加法指令A(yù)DD指令格式:ADDDST,SRC;DST←DST+SRCADD指令將操作數(shù)DST和SRC相加,結(jié)果送回DST中。DST和SRC可以是寄存器(除段寄存器外)或存儲(chǔ)器操作數(shù),操作數(shù)SRC可以是立即數(shù),注意不能都是存儲(chǔ)器操作數(shù)。執(zhí)行結(jié)果會(huì)影響6個(gè)狀態(tài)標(biāo)志位。MOV AL,6FH ;AL←6FHADD AL,6AH ;AL←6FH+6AH指令執(zhí)行后,AL=D9H,標(biāo)志位的狀態(tài)如下:AF=1,CF=0,OF=1,PF=0,SF=1,ZF=0。3.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令1.加法運(yùn)算指令(2) 帶進(jìn)位的加法指令A(yù)DC指令格式:ADDDST,SRC;DST←DST+SRC+CFADC與ADD指令對(duì)操作數(shù)要求及對(duì)標(biāo)志位的影響都基本相同,區(qū)別在于CF參與運(yùn)算。如果CF=1,分析以下指令執(zhí)行后的值和狀態(tài)標(biāo)志位情況。MOV AX,0E75H ;AX←0E75H,其中AH=0EH,AL=75HADC AH,AL ;AH←AH+AL指令執(zhí)行后:AH=0EH+75H+1=84H,即AX=08475H。標(biāo)志位的狀態(tài)為:AF=1,CF=0,OF=1,PF=0,SF=1,ZF=0。3.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令1.加法運(yùn)算指令(3) 加l指令I(lǐng)NC指令格式:INC DST;DST←DST+1INC將操作數(shù)的內(nèi)容加1,類似C語(yǔ)言的“++”運(yùn)算符,操作數(shù)DST可以是8位或16位寄存器或存儲(chǔ)器操作數(shù),但不能是段寄存器和立即數(shù)。INC影響OF、SF、PF、AF及ZF,不影響CF。常用于修改地址指針及循環(huán)次數(shù)。INC SI ;(SI)←(SI)+1INC BYTEPTR[DI];將偏移地址為DI的存儲(chǔ)單元內(nèi)容+13.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令2.減法運(yùn)算指令(1) 不帶借位的減法指令SUB指令格式:SUBDST,SRC;DST←DST-SRCSUB指令將操作數(shù)DST減去SRC,結(jié)果送回DST中。DST和SRC可以是寄存器(除段寄存器外)或存儲(chǔ)器操作數(shù),源操作數(shù)可以是立即數(shù),執(zhí)行結(jié)果對(duì)6個(gè)狀態(tài)標(biāo)志位的影響與ADD指令類似。(2) 帶借位的減法指令SBB指令格式:SBB DST,SRC;DST←DST-SRC-CFSBB與SUB指令對(duì)操作數(shù)要求及對(duì)標(biāo)志位的影響都基本相同,區(qū)別在于CF參與相減運(yùn)算。SBB指令可以用于多字節(jié)減法運(yùn)算,先減低位數(shù)據(jù),再減高位數(shù)據(jù)和低位的借位。3.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令2.減法運(yùn)算指令(3) 減1指令DEC指令格式:DEC DST;DST←DST-1DEC是單字節(jié)指令,將操作數(shù)的內(nèi)容減1,類似C語(yǔ)言的“--”運(yùn)算符,對(duì)操作數(shù)DST可以是8位或16位寄存器或存儲(chǔ)器操作數(shù),但不能是段寄存器和立即數(shù)。INC只影響OF、SF、PF、AF及ZF,不影響CF。(4) 求補(bǔ)指令NEG指令格式:NEG DST;DST←0-DSTNEG指令用0減去操作數(shù)DST,操作數(shù)DST可以是8位或16位寄存器或存儲(chǔ)器操作數(shù),但不能是段寄存器和立即數(shù)。NEG指令對(duì)狀態(tài)標(biāo)志位均有影響。3.38088/8086指令系統(tǒng)3.3.2算數(shù)運(yùn)算指令2.減法運(yùn)算指令(5) 比較指令CMP指令格式:CMP DST,SRC ;DST-SRC,只影響標(biāo)志位CMP指令實(shí)現(xiàn)目標(biāo)操作數(shù)減源操作數(shù),但是結(jié)果不保存,操作數(shù)的內(nèi)容不變,通過(guò)影響6個(gè)狀態(tài)標(biāo)志位,判斷DST與SRC之間的大小關(guān)系,對(duì)標(biāo)志位的影響與減法指令相同。有以下幾種情況:①用CF標(biāo)志位判斷兩個(gè)無(wú)符號(hào)數(shù)的大小。②用OF標(biāo)志位判斷兩個(gè)有符號(hào)數(shù)的大小。對(duì)于有符號(hào)數(shù),當(dāng)OF⊕SF=0時(shí),DST>SRC;當(dāng)OF⊕SF=1時(shí),DST<SRC。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令(1) 邏輯“與”指令A(yù)ND指令格式:AND DST,SRC ; DST←DST∧SRCAND指令將DST和SRC按位進(jìn)行邏輯與運(yùn)算,結(jié)果存放在DST。SRC可以是寄存器、存儲(chǔ)器或立即數(shù)操作數(shù),DST可以是寄存器或存儲(chǔ)器操作數(shù)。AND指令常用于使目標(biāo)操作數(shù)中某些位屏蔽,可以將需將要屏蔽的位和0進(jìn)行與運(yùn)算,不需將要屏蔽的位和1進(jìn)行與運(yùn)算,例如:ANDBL,F(xiàn)0H,將BL的低4位清0,高4位保持不變。AND指令還可以對(duì)數(shù)據(jù)自身按位進(jìn)行與運(yùn)算,只影響狀態(tài)標(biāo)志位,并將CF或OF設(shè)為0。例如:執(zhí)行ANDCX,CX,不改變CX的內(nèi)容,但影響6個(gè)狀態(tài)標(biāo)志位。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令(2) 邏輯“或”指令OR指令格式:OR DST,SRC ; DST←DST∨SRCOR指令將DST和SRC按位進(jìn)行邏輯或運(yùn)算,結(jié)果存放在DST。SRC可以是寄存器、存儲(chǔ)器或立即數(shù)操作數(shù),DST可以是寄存器或存儲(chǔ)器操作數(shù)。OR指令常用于使目標(biāo)操作數(shù)中某些位置1,可以將需將要置1的位和1進(jìn)行或運(yùn)算,不需將要置1的位和0進(jìn)行或運(yùn)算,例如:ORBL,01H,將BL的低D0位置1,D7~D1位保持不變。OR指令還可以對(duì)數(shù)據(jù)自身按位進(jìn)行或運(yùn)算,只影響狀態(tài)標(biāo)志位,并將CF或OF設(shè)為0。例如:執(zhí)行ORCX,CX,不改變CX的內(nèi)容,但影響6個(gè)狀態(tài)標(biāo)志位。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令(3) 邏輯“非”指令NOT指令格式:NOT DSTNOT指令對(duì)目的操作數(shù)DST按位取反,結(jié)果存放在DST,DST可以是寄存器或存儲(chǔ)器操作數(shù),但不能是立即數(shù)。NOT指令不影響狀態(tài)標(biāo)志位。(4) 邏輯“異或”指令XOR指令格式:XOR DST,SRC ;DST←DST⊕SRCXOR指令將DST和SRC按位進(jìn)行邏輯異或運(yùn)算,結(jié)果存放在DST。SRC可以是寄存器、存儲(chǔ)器或立即數(shù)操作數(shù),DST可以是寄存器或存儲(chǔ)器操作數(shù)。因?yàn)楫惢蜻\(yùn)算會(huì)使兩個(gè)操作數(shù)相同的位的結(jié)果為1,不相同的位的結(jié)果為0,所以XOR指令常用于將某些寄存器置為0,例如:XORCX,CX,使CX清零。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令(5) 測(cè)試指令TEST指令格式:TEST DST,SRC ; DST∧SRC影響標(biāo)志位TEST指令將DST和SRC按位進(jìn)行邏輯與運(yùn)算,除了執(zhí)行結(jié)果不保存,對(duì)操作數(shù)的要求及對(duì)狀態(tài)標(biāo)志位的影響都與AND指令相同,因此,TEST指令常用于不改變操作數(shù)情況下,檢測(cè)操作數(shù)中某位是否為1,即可以對(duì)被檢測(cè)位與1進(jìn)行邏輯與運(yùn)算,其他位與0進(jìn)行邏輯與運(yùn)算。如果被檢測(cè)位為0,指令執(zhí)行結(jié)果則為0,并且ZF=1;如果被檢測(cè)位為1,指令執(zhí)行結(jié)果則為1,并且ZF=0。因此,可以根據(jù)ZF對(duì)被檢測(cè)位進(jìn)行判斷。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令2.移位指令(1) 算術(shù)左移指令SAL(ShiftArithmeticLeft)指令格式:SALDST,CNT SAL指令按照CNT指定的移位位數(shù),對(duì)DST進(jìn)行左移操作。DST每向左邊移動(dòng)一位,右邊補(bǔ)一位0,最高位移入CF中(2) 邏輯左移指令SHL(ShiftLogicLeft)指令格式:SHLDST,CNT SHL指令按照CNT指定的移位位數(shù),對(duì)DST進(jìn)行左移操作。DST每向左邊移動(dòng)一位,右邊補(bǔ)一位0,最高位移入CF中。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令2.移位指令(3)算術(shù)右移指令SAR(ShiftArithmeticRight)指令格式:SARDST,CNT SAR指令按照CNT指定的移位位數(shù),對(duì)DST中的有符號(hào)操作數(shù)進(jìn)行右移。DST每向右邊移動(dòng)一位,都將最右邊一位移入CF中,但是最高位保持不變。(4)邏輯右移指令SHR(ShiftLogicRight)指令格式:SHRDST,CNT SHR指令按照CNT指定的移位位數(shù),對(duì)DST中的無(wú)符號(hào)操作數(shù)進(jìn)行右移。DST每向右邊移動(dòng)一位,左邊就補(bǔ)一位0,最低位移入CF中。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令2.移位指令(5)不帶CF的循環(huán)左移指令ROL指令格式:ROLDST,CNT ROL指令按照CNT指定的移位位數(shù),對(duì)DST進(jìn)行循環(huán)左移操作,最高位移入CF和最低位,構(gòu)成8位的循環(huán)。(6) 不帶CF的循環(huán)右移指令ROR指令格式:RORDST,CNT ROR指令按照CNT指定的移位位數(shù),對(duì)DST進(jìn)行循環(huán)右移操作,最低位移入CF和最高位,構(gòu)成8位的循環(huán)。3.38088/8086指令系統(tǒng)3.3.3邏輯運(yùn)算和移位指令2.移位指令(7) 帶CF的循環(huán)左移指令RCL指令格式:RCLDST,CNT RCL指令按照CNT指定的移位位數(shù),對(duì)CF和DST一起進(jìn)行循環(huán)左移操作,CF移入操作數(shù)最低位,操作數(shù)最高位移入CF,構(gòu)成9位的循環(huán)。(8) 帶CF的循環(huán)右移指令RCR指令格式:RCRDST,CNT RCR指令按照CNT指定的移位位數(shù),對(duì)CF和DST一起進(jìn)行循環(huán)右移操作,CF移入最高位,最低位移入CF,構(gòu)成9位的循環(huán)。3.38088/8086指令系統(tǒng)3.3.5程序控制指令1.轉(zhuǎn)移指令(1) 段內(nèi)直接轉(zhuǎn)移指令格式:JMPLABEL JMP指令是使程序無(wú)條件地轉(zhuǎn)移到指定的目標(biāo)地址執(zhí)行,LABEL是符號(hào)地址,在程序的同一代碼段內(nèi)。指令編譯時(shí),給出的是JMP的下一條指令到目標(biāo)地址的偏移量。(2) 段內(nèi)間接轉(zhuǎn)移指令格式:JMPOPTR轉(zhuǎn)移地址在16位操作數(shù)OPTR中,OPTR是16位寄存器或者存儲(chǔ)器兩單元中的內(nèi)容,直接作為IP的內(nèi)容作為跳轉(zhuǎn)的地址,從而實(shí)現(xiàn)跳轉(zhuǎn)。3.38088/8086指令系統(tǒng)3.3.5程序控制指令1.轉(zhuǎn)移指令(3) 段間直接轉(zhuǎn)移指令格式:JMPFARPTRLABELFAR表示LABEL是在另一個(gè)代碼段內(nèi)的遠(yuǎn)標(biāo)號(hào)。指令執(zhí)行時(shí),根據(jù)LABEL的位置將要轉(zhuǎn)移的段基地址和偏移地址分別賦值給CS和IP,程序跳轉(zhuǎn)到CS:IP執(zhí)行指令。(4) 段間間接轉(zhuǎn)移指令格式:JMPOPTR轉(zhuǎn)移地址在32位操作數(shù)OPTR中,OPTR是32位存儲(chǔ)器四單元中的內(nèi)容,高16位內(nèi)容送CS,低16位內(nèi)容送IP,使程序直接跳轉(zhuǎn)到另一個(gè)代碼段執(zhí)行。3.38088/8086指令系統(tǒng)3.3.5程序控制指令1.轉(zhuǎn)移指令(5) 條件轉(zhuǎn)移指令指令格式:JCCLABELJCC表示有條件轉(zhuǎn)移,根據(jù)執(zhí)行前一條指令后的標(biāo)志位判斷程序是否轉(zhuǎn)跳轉(zhuǎn),如果滿足條件,則跳轉(zhuǎn)到指定的地址執(zhí)行,否則,繼續(xù)執(zhí)行下一條指令。條件轉(zhuǎn)移指令只可以實(shí)現(xiàn)段內(nèi)的短跳轉(zhuǎn),LABEL為符號(hào)地址,與當(dāng)前IP相距-128~127個(gè)字節(jié)。其中,又分為單標(biāo)志位跳轉(zhuǎn)和多標(biāo)志位跳轉(zhuǎn)。3.38088/8086指令系統(tǒng)3.3.5程序控制指令2.循環(huán)控制指令移位指令(1) LOOP循環(huán)指令指令格式:LOOPLABELLOOP指令執(zhí)行前,先將循環(huán)次數(shù)存放在CX中,根據(jù)近地址標(biāo)號(hào),跳轉(zhuǎn)到標(biāo)號(hào)地址的指令執(zhí)行,每循環(huán)一次后,CX減1,然后判斷CX是否為0,如果不為0,繼續(xù)進(jìn)行循環(huán),否則,退出循環(huán)。(2)LOOPZ/LOOPE循環(huán)指令指令格式:LOOPZ/LOOPELABELLOOPZ/LOOPE的循環(huán)執(zhí)行判斷條件為:每循環(huán)一次后,CX的內(nèi)容減1,如果CX≠0,并且ZF=1,繼續(xù)進(jìn)行循環(huán),否則,退出循環(huán)。(3)LOOPNZ/LOOPNE循環(huán)指令指令格式:LOOPNZ/LOOPNELABELLOOPNZ/LOOPNE的循環(huán)執(zhí)行判斷條件為:每循環(huán)一次后,CX的內(nèi)容減1,如果CX≠0,并且ZF=0,繼續(xù)進(jìn)行循環(huán),否則,退出循環(huán)。3.38088/8086指令系統(tǒng)3.3.5程序控制指令3.過(guò)程調(diào)用指令(1)段內(nèi)直接調(diào)用指令格式:CALLNEARPROC執(zhí)行過(guò)程:SP←SP-2,(SP+1)←(高8位IP),(SP)←(低8位IP),(IP)←(IP)+偏移量。在段內(nèi)直接調(diào)用中,PROC是在當(dāng)前代碼段內(nèi)的近過(guò)程的符號(hào)地址,在程序編譯時(shí),給出CALL的下一條指令到目標(biāo)地址的偏移量。執(zhí)行調(diào)用指令時(shí),將CALL指令的下一條指令的IP壓入堆棧,作為返回地址。(2)段內(nèi)間接調(diào)用指令格式:CALLOPTR段內(nèi)間接調(diào)用中,執(zhí)行過(guò)程與直接調(diào)用類似,但是調(diào)用入口地址在OPTR中,OPTR是16位寄存器或者存儲(chǔ)器兩單元中的內(nèi)容,直接作為IP的內(nèi)容,實(shí)現(xiàn)調(diào)用。3.38088/8086指令系統(tǒng)3.3.5程序控制指令3.過(guò)程調(diào)用指令(3)段間直接調(diào)用指令格式:CALLFARPROCSP←SP-2,(SP+1)←(CSH),(SP)←(CSL),(CS)←(子程序段地址)SP←SP-2,(SP+1)←(IPH),(SP)←(IPL),(IP)←(子程序偏移地址)(4) 段間間接調(diào)用指令格式:CALLOPTRSP←SP-2,(SP+1)←(CSH),(SP)←(CSL),(CS)←(OPTR+3,OPTR+2)SP←SP-2,(SP+1)←(IPH),(SP)←(IPL),(IP)←(OPTR+1,OPTR)在段間間接調(diào)用中,入口地址在32位操作數(shù)OPTR中,OPTR是32位存儲(chǔ)器四單元中的內(nèi)容,高16位內(nèi)容送CS,低16位內(nèi)容送IP,使程序代用另一個(gè)代碼段的程序執(zhí)行。3.38088/8086指令系統(tǒng)3.3.5程序控制指令3.過(guò)程調(diào)用指令(5)過(guò)程返回指令格式:RET在子過(guò)程中,一般在最后包含一條返回指令RET,從堆棧中獲取調(diào)用程序的地址,控制返回原來(lái)的程序。RET指令的自動(dòng)匹配過(guò)程調(diào)用的類型,如果是近過(guò)程調(diào)用,從棧頂彈出字給IP作為返回偏移地址;如果為遠(yuǎn)過(guò)程調(diào)用,先從棧頂彈出字給IP作為返回偏移地址,再?gòu)棾鲆粋€(gè)字給CS作為段地址。3.38088/8086指令系統(tǒng)3.3.5程序控制指令4.中斷指令(1)INT指令指令格式:INT n中斷指令中,n為8位的中斷類型碼,將n乘以4,獲得中斷向量的地址,然后從該地址中取出4個(gè)字節(jié)的中斷服務(wù)程序入口地址,執(zhí)行中斷服務(wù)子程序,其過(guò)程如下:①將FLAG壓入堆棧,SP←SP-2,(SP+1)←(FLAGH),(SP)←(FLAGL);②TF和IF標(biāo)志位置為0;③將當(dāng)前CS壓入堆棧,SP←SP-2,(SP+1)←(CSH),(SP)←(CSL);④將當(dāng)前IP壓入堆棧,SP←SP-2,(SP+1)←(IPH),(SP)←(IPL);⑤取中斷服務(wù)子程序入口地址,(IPL)←(n×4),(IPH)←(n×4+1),(CSL)←(n×4+2),(CSH)←(n×4+3);3.38088/8086指令系統(tǒng)3.3.5程序控制指令4.中斷指令(2)中斷返回指令I(lǐng)RET指令格式:IRET中斷服務(wù)程序一般都包含中斷返回指令,用于返回和執(zhí)行被中斷的程序。該指令會(huì)將堆棧中斷點(diǎn)的偏移地址和段地址出棧,放于寄存器IP和CS,接著恢復(fù)標(biāo)志寄存器,會(huì)對(duì)標(biāo)志位有影響,其過(guò)程如下:①(IPH)←(SP+1),(IPL)←(SP),SP←SP+2;②(CSH)←(SP+1),(CSL)←(SP),SP←SP+2,③(FLAGH)←(SP+1),(FLAGL)←(SP),SP←SP+2,3.48088/8086匯編語(yǔ)言編程3.4.1匯編源程序結(jié)構(gòu)和格式匯編語(yǔ)言源程序由多個(gè)代碼段、數(shù)據(jù)段、附加段和堆棧段組成。這些邏輯段以SEGMENT開(kāi)始,以ENDS結(jié)束,整個(gè)源程序的結(jié)束用END結(jié)尾。匯編語(yǔ)言源程序的語(yǔ)句可分為指令性和指示性兩大類。指令性語(yǔ)句是由指令助記符組成的語(yǔ)句,可以由8088/8086執(zhí)行;指示性語(yǔ)句用于說(shuō)明對(duì)程序進(jìn)行匯編的方式,但是8088/8086并不執(zhí)行這類指令,由于這類指令不生成目標(biāo)代碼,稱為偽指令。指令性語(yǔ)句的格式為:[標(biāo)號(hào):][前綴]操作碼[操作數(shù)1,][操作數(shù)2,][;注釋]指示性語(yǔ)句的的格式為:[名字]偽指令表達(dá)式[;注釋]指令性語(yǔ)句中的“標(biāo)號(hào)”是標(biāo)識(shí)符,表示符號(hào)地址,其后要加“:”。指示性語(yǔ)句中的“名字”表示變量名、過(guò)程名和段名等,其后不要加“:”,名字通常作為變量名來(lái)表示數(shù)據(jù)的地址。3.48088/8086匯編語(yǔ)言編程3.4.2匯編語(yǔ)句格式匯編語(yǔ)言的數(shù)據(jù)項(xiàng)又可以是常量、標(biāo)號(hào)、變量和表達(dá)式。1.常量常量是指令中的固定值,包括數(shù)字常量和字符串常量,數(shù)字常量通常用二進(jìn)制、十進(jìn)制和十六進(jìn)制等不同形式表示。(1)十進(jìn)制常量以字母D結(jié)尾或不加結(jié)尾,如12D,12。(2)二進(jìn)制常量以字母B結(jié)尾,如00010010B。(3)十六進(jìn)制常量以字母H結(jié)尾,如12H、0ABCDH。需要注意的是,數(shù)值常量的第一位要求是是數(shù)字,否則會(huì)被視為標(biāo)識(shí)符,因此,如果以A~F開(kāi)始的十六進(jìn)制數(shù),需要在前面補(bǔ)一個(gè)0。字符串常量是由單引號(hào)‘’括起的一個(gè)或多個(gè)字符,每一個(gè)字符都編譯成對(duì)應(yīng)的一個(gè)ASCII碼值,如字符串常量‘a(chǎn)b’,編譯后為61H、62H。3.48088/8086匯編語(yǔ)言編程3.4.2匯編語(yǔ)句格式2.標(biāo)號(hào)標(biāo)號(hào)是用于表示指令地址的符號(hào),因此又稱為符號(hào)地址,不與指令助記符或偽指令重名,不能數(shù)字打頭,長(zhǎng)度不超過(guò)31個(gè)字符,其后加上冒號(hào)。標(biāo)號(hào)有3個(gè)屬性:段地址、偏移地址和類型。①段地址屬性是標(biāo)號(hào)所在代碼段的段地址;②偏移地址屬性是指標(biāo)號(hào)所在代碼段內(nèi),相對(duì)于段首地址的偏移地址。③標(biāo)號(hào)的類型屬性有近(NEAR)和遠(yuǎn)(FAR)兩種。NEAR類型表示標(biāo)號(hào)在同一代碼段內(nèi)被引用;FAR類型,表示標(biāo)號(hào)在其它代碼段內(nèi)被引用。3.48088/8086匯編語(yǔ)言編程3.4.2匯編語(yǔ)句格式3.變量變量是在存儲(chǔ)器中的某個(gè)數(shù)據(jù)區(qū)的標(biāo)識(shí)符,變量的內(nèi)容是可變的。變量名必須字母開(kāi)頭,長(zhǎng)度不超過(guò)31個(gè)字符,后面不加冒號(hào)。變量名對(duì)應(yīng)數(shù)據(jù)區(qū)的首地址,如果對(duì)數(shù)據(jù)區(qū)其它數(shù)據(jù)操作時(shí),則注意修改地址。變量也具有段地址、偏移地址、類型、長(zhǎng)度和大小5個(gè)屬性。變量的段地址屬性就是變量所在段的段地址,一般變量的段地址在寄存器DS或ES中。變量的偏移地址屬性是變量所在段的首地址到變量地址之間的字節(jié)數(shù)量。變量的類型有字節(jié)(BYTE)、字(WORD)、雙字(DWORD)、四字(QWORD)、十字節(jié)(TBYTE)等,表明每個(gè)數(shù)據(jù)的字節(jié)數(shù)或位數(shù)。變量的長(zhǎng)度指數(shù)據(jù)區(qū)中元素的個(gè)數(shù)。變量的大小指分配給變量的總字節(jié)數(shù),變量大小=變量類型×變量長(zhǎng)度。變量還可以通過(guò)運(yùn)算符來(lái)定義一定的數(shù)值。3.48088/8086匯編語(yǔ)言編程3.4.3偽指令數(shù)據(jù)定義偽指令用于給變量分配存儲(chǔ)空間、確定變量類型和變量賦初值及,格式為:[變量名]數(shù)據(jù)定義偽操作操作數(shù)1[,操作數(shù)2,…]方括號(hào)中存放變量名,數(shù)據(jù)定義偽指令有以下5類:DB:定義字節(jié)類型的變量,占1個(gè)字節(jié),也可以用于定義字符串。DW:定義字類型的變量,占2個(gè)字節(jié),低字節(jié)數(shù)據(jù)存放在低地址單元,高字

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論