微處理器與接口技術(shù):第3章 8086/8088的指令系統(tǒng)_第1頁
微處理器與接口技術(shù):第3章 8086/8088的指令系統(tǒng)_第2頁
微處理器與接口技術(shù):第3章 8086/8088的指令系統(tǒng)_第3頁
微處理器與接口技術(shù):第3章 8086/8088的指令系統(tǒng)_第4頁
微處理器與接口技術(shù):第3章 8086/8088的指令系統(tǒng)_第5頁
已閱讀5頁,還剩136頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章8086/8088的指令系統(tǒng)指令系統(tǒng)是指該計(jì)算機(jī)所能識(shí)別和執(zhí)行的全部指令的集合。指令是讓計(jì)算機(jī)執(zhí)行某種操作的命令第3章8086/8088的指令系統(tǒng)

主要內(nèi)容8086/8088的尋址方式8086/8088指令系統(tǒng)8086/8088的尋址方式指令指令的組成操作碼:指示計(jì)算機(jī)執(zhí)行什么操作指令中不可缺少的部分操作數(shù):表示操作的對(duì)象操作數(shù)的個(gè)數(shù)獲取操作數(shù)操作數(shù)本身給出操作數(shù)的地址信息8086/8088的尋址方式指令指令的表示形式二進(jìn)制代碼:1000100011011000B(機(jī)器指令)助記符:MOVAL,BL(匯編指令)8086/8088的尋址方式尋址方式根據(jù)指令內(nèi)容確定操作數(shù)地址的過程操作數(shù)存放的位置直接包含在指令中(立即數(shù))存放在CPU的寄存器中(寄存器操作數(shù))在內(nèi)存中(存儲(chǔ)器操作數(shù))根據(jù)尋址計(jì)算所得到的操作數(shù)地址叫做操作數(shù)的有效地址(EA)(段內(nèi)偏移地址)有效地址還需要與相應(yīng)的段基地址組合才是20位的物理地址(PA),該工作由CPU完成8086/8088有六種基本尋址方式8086/8088的尋址方式立即尋址操作數(shù)直接放在指令中,它緊跟在指令操作碼的后面,與操作碼一起放在代碼段區(qū)域中舉例:MOVAX,3000HMOV AL,30H8086/8088的尋址方式立即尋址立即數(shù)可以是8位的,也可以是16位的。若是16位的,則存儲(chǔ)時(shí)低字節(jié)位于低地址處,高字節(jié)位于高地址處立即尋址方式僅用于源操作數(shù)立即尋址主要用來給寄存器或存儲(chǔ)單元賦初值8086/8088的尋址方式寄存器尋址操作數(shù)放在指令規(guī)定的8位或16位的寄存器中舉例:MOVDS,AXMOVAX,30HMOV AL,30H使用寄存器尋址的指令的數(shù)據(jù)位數(shù),由所使用的寄存器來決定寄存器尋址可以用于源操作數(shù)和目的操作數(shù)該方式主要用于存放參與運(yùn)送的數(shù)據(jù)或存放臨時(shí)結(jié)果8086/8088的尋址方式直接尋址操作數(shù)地址的16位偏移量(有效地址EA)直接包含在指令中,它與操作碼一起存放在代碼段區(qū)域舉例:MOVAX,[2000H]注意:這條指令的16位偏移量2000H放在中括號(hào)內(nèi)8086/8088的尋址方式8086/8088的尋址方式直接尋址操作數(shù)默認(rèn)位于數(shù)據(jù)段,操作數(shù)所在單元的實(shí)際地址為DS:16位偏移量若要對(duì)數(shù)據(jù)段外的其它段中的數(shù)據(jù)尋址,應(yīng)在指令中加段超越前綴。例:MOVAX,ES:[2000H]16位偏移量也可以變量名的形式給出;舉例:VAR1DB12HMOVAL,VAR1直接尋址方式主要用于處理單個(gè)變量8086/8088的尋址方式寄存器間接尋址操作數(shù)地址的16位偏移量(EA)在指定的寄存器中,操作數(shù)在有效地址對(duì)應(yīng)的存儲(chǔ)單元中舉例:MOVAX,[BX]若(DS)=1492H,(BX)=2000H則EA=(BX)=2000H物理地址PA=14920H+2000H=16920H執(zhí)行(AX)=(16920H)MOVAX,[BP]物理地址PA:SS*16+BP8086/8088的尋址方式8086/8088的尋址方式寄存器間接尋址可以用來存放地址的寄存器只有4個(gè)變址寄存器:SI、DI;基址寄存器:BX、BP當(dāng)使用SI、DI、BX間接尋址時(shí),操作數(shù)默認(rèn)在數(shù)據(jù)段使用BP間接尋址時(shí),操作數(shù)默認(rèn)在堆棧段可以使用段超越前綴訪問其它的段該尋址方式可以用來對(duì)一維數(shù)組或表格進(jìn)行處理例如:對(duì)連續(xù)存放在內(nèi)存單元的數(shù)據(jù)求和8086/8088的尋址方式變址尋址操作數(shù)的有效地址EA為指定的寄存器內(nèi)容加上指令中給出的8位或16位偏移量,操作數(shù)在有效地址對(duì)應(yīng)的存儲(chǔ)單元中舉例:MOVAX,[SI+COUNT]

若COUNT=3000H(DS)=3000H(SI)=2000H

EA=3000H+2000H=5000HPA=30000H+5000H=35000H8086/8088的尋址方式變址尋址寄存器的使用要求同寄存器間接尋址該尋址方式通常也用來訪問數(shù)組中的元素,位移量定位于數(shù)組的起點(diǎn),間址寄存器的值選擇一個(gè)元素8086/8088的尋址方式基址加變址尋址操作數(shù)的EA=基址寄存器(BX或BP)+變址寄存器(SI或DI)[+8位/16位偏移量]舉例:MOVAX,[BX+SI]MOVAX,[BX+DI+6]8086/8088的尋址方式8086/8088的尋址方式基址加變址尋址若用BX:默認(rèn)操作數(shù)在數(shù)據(jù)段DS中;若用BP:默認(rèn)操作數(shù)在堆棧段SS中該尋址方式適合數(shù)組和表格的處理,特別是處理二維數(shù)組8086/8088的尋址方式關(guān)于存儲(chǔ)器操作數(shù)尋址的小結(jié)操作數(shù)的地址指令的操作數(shù)部分給出的地址是段內(nèi)偏移地址;這個(gè)段內(nèi)偏移量可能是由幾個(gè)基本部分組成,稱為有效地址(EA);EA=[基址寄存器]+[變址寄存器]+[位移量]8086/8088的尋址方式關(guān)于存儲(chǔ)器操作數(shù)尋址的小結(jié)尋址方式的書寫格式在方括號(hào)內(nèi)部允許有一個(gè)或兩個(gè)寄存器的名字,如果一對(duì)方括號(hào)內(nèi)部有基址寄存器和變址寄存器,使用“+”作為連接在方括號(hào)內(nèi)部允許有位移量,使用+或—號(hào)作為連接符號(hào)在方括號(hào)外部允許有位移量,可以在左邊或右邊8086/8088的尋址方式關(guān)于存儲(chǔ)器操作數(shù)尋址的小結(jié)尋址方式的書寫格式舉例:MOV AX,[BX+SI+6]MOV AX,[BX+SI]6MOV AX,6[BX+SI]MOV AX,[BX][SI]6MOV AX,[BX+6][SI]8086/8088的尋址方式舉例說明假定DS=2000H,SS=5000H,SI=0010H,DI=0020H,BP=1000H,請指出下列指令源操作數(shù)是什么尋址方式?若源操作數(shù)位于存儲(chǔ)器中,其物理地址是多少?(1)MOVAX,9BH (2)MOVAX,[100H](3)MOVBX,[SI] (4)MOVBX,CX(5)MOVAL,[DI+5] (6)MOVCL,[BP+SI+9]8086/8088指令系統(tǒng)8086/8088指令系統(tǒng)是80X86/Pentium的基本指令集指令的操作寬度是8位或16位,偏移地址寬度是16位指令按功能分為6類:數(shù)據(jù)傳送算術(shù)運(yùn)算邏輯運(yùn)算串操作程序控制處理器控制指令的學(xué)習(xí):掌握每條指令的助記符、操作數(shù)的正確書寫格式、功能、指令執(zhí)行后對(duì)標(biāo)志位的影響8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令包括以下幾類通用傳送指令堆棧操作指令交換指令累加器專用指令地址轉(zhuǎn)送指令標(biāo)志傳送指令8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令一般格式:MOVOPRD1,OPRD2MOV是操作碼OPRD1是目的操作數(shù)OPRD2是源操作數(shù)。功能:完成數(shù)據(jù)傳送8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令CPU內(nèi)部寄存器之間數(shù)據(jù)的任意傳送MOVAL,BL ;BL中的8位數(shù)送ALMOVCX,BX ;BX中的16位數(shù)送CXMOVDS,BX ;BX中的16位數(shù)送DS注意:源操作數(shù)與目的操作數(shù)的位數(shù)應(yīng)相同 MOVAL,BX(錯(cuò))8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令立即數(shù)傳送至CPU內(nèi)部通用寄存器

MOVCL,4 ;立即數(shù)4送CLMOVSI,057BH ;立即數(shù)057BH送SI注意:所送立即數(shù)的數(shù)值大小與目的寄存器的位數(shù)要相匹配MOVAL,1000(錯(cuò))8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令CPU內(nèi)部寄存器與存儲(chǔ)器(所有尋址方式)之間的數(shù)據(jù)傳送

MOVAL,[2000H]MOVAX,[SI]MOV[DI],CXMOVSI,BLOCK[BP]MOVDS,DATA[SI+BX]MOVDEST[BP+DI],ES8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令用立即數(shù)給存儲(chǔ)單元賦值MOVBYTEPTR[2000H],25HMOVWORDPTR[2000H],25HMOVWORDPTR[SI],35H注意:這里的“BYTEPTR”意指字節(jié)單元;“WORDPTR”意指字單元MOV[2000H],25H(錯(cuò))8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令MOV指令不能進(jìn)行的傳送不允許立即數(shù)作目的操作數(shù);MOV52H,AH(錯(cuò))不能兩個(gè)操作數(shù)都是存儲(chǔ)器操作數(shù);

MOV[DI],[SI](錯(cuò))不能兩個(gè)操作數(shù)一個(gè)是8位,一個(gè)是16位;

MOVAX,BL(錯(cuò))不允許段寄存器間直接傳送;MOVDS,ES(錯(cuò))不能向段寄存器送立即數(shù);MOVDS,3000H(錯(cuò))不能對(duì)IP進(jìn)行操作;MOVIP,BX(錯(cuò))8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令MOV指令不能進(jìn)行的傳送MOV指令不能直接完成這樣的傳送,可以用CPU內(nèi)部寄存器為橋梁來完成這樣的傳送舉例:MOVAX,[2000H]MOV[3000H],AX;[3000H]

[2000H]MOVAX,3000HMOVDS,AX;(DS)←3000HMOV指令不影響標(biāo)志位8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令通用傳送指令應(yīng)用舉例:數(shù)據(jù)傳送設(shè)DS=3000H,起始偏移地址為0100H內(nèi)存區(qū)域中順序存放著100個(gè)字節(jié)數(shù)據(jù)。要求傳送到以2000H為起始偏移地址的區(qū)域。8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令堆棧指令堆棧:就是一個(gè)按后進(jìn)先出(LIFO)的原則組織的一般內(nèi)存區(qū)域即堆棧段。用SS指示段地址。堆棧指針SP總是指向棧頂(最后壓入的數(shù)的地址)。SP的初值規(guī)定了所用堆棧的大?。ǘ褩5纳疃龋粋€(gè)棧的深度最大為64kB堆棧用途臨時(shí)存放數(shù)據(jù)傳遞參數(shù)保存和恢復(fù)寄存器對(duì)堆棧操作可用入棧(PUSH)和出棧(POP)兩類指令來進(jìn)行8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令入棧指令PUSH指令格式:PUSHOPRDOPRD為源操作數(shù)域源操作數(shù)可以是CPU內(nèi)部的16位通用寄存器、段寄存器和內(nèi)存操作數(shù)(所有尋址方式)入棧操作對(duì)象必須是16位數(shù)PUSH指令完成如下操作SPSP-1[SP]OPRD的高字節(jié)SPSP-1[SP]OPRD的低字節(jié)8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令入棧指令PUSH舉例:PUSHBX的執(zhí)行過程

SPSP-1[SP]=BHSPSP-1[SP]=BL8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令出棧指令POP指令格式:POPOPRDOPRD為目的操作數(shù)域目的操作數(shù)可以是CPU內(nèi)部的16位通用寄存器、段寄存器(CS除外)和內(nèi)存操作數(shù)(所有尋址方式)出棧操作對(duì)象必須是16位數(shù)POP指令完成如下操作OPRD的低字節(jié)[SP]SPSP+1OPRD的高字節(jié)[SP]SPSP+18086/8088指令系統(tǒng)數(shù)據(jù)傳送指令出棧指令POP舉例:POPAX的執(zhí)行過程

AL=[SP]SPSP+1AH=[SP]SPSP+18086/8088指令系統(tǒng)數(shù)據(jù)傳送指令關(guān)于堆棧指令的幾點(diǎn)說明堆棧操作指令都隱含了一個(gè)操作數(shù):SP所指的棧頂數(shù)據(jù);堆棧操作的操作數(shù)一定是16位操作數(shù):可以是寄存器操作數(shù),也可以是存儲(chǔ)器操作數(shù),但不能是立即數(shù);由于一定是16位操作數(shù),因此存儲(chǔ)器操作數(shù)也不必用算符來說明位數(shù)了PUSH[DI]PUSHWORDPTR[DI]保護(hù)和恢復(fù)數(shù)據(jù)時(shí)要注意入棧和出棧的順序8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令關(guān)于堆棧指令的幾點(diǎn)說明保護(hù)和恢復(fù)數(shù)據(jù)

時(shí)要注意入棧和出棧的順序舉例:調(diào)用子程序時(shí)保護(hù)現(xiàn)場

SUBROUTPROCNEAR PUSHF PUSHAX PUSHBX PUSHCX PUSHDX . .(子程序主體) . POPDX POPCX POPBX POPAX POPF RET;返回SUBROUT ENDP 8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令交換指令指令格式:XCHGOPRD1,OPRD2指令功能:把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換。交換只能在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲(chǔ)器之間進(jìn)行。段寄存器、IP和立即數(shù)不能作為一個(gè)操作數(shù)舉例:XCHGAL,CL;將AL與CL的值相交換XCHG[200H],DX;將DX與數(shù)據(jù)段偏移地址200H

;與201H處兩單元內(nèi)容交換8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令累加器專用傳送指令8086的累加器就是AX/AL寄存器必須使用累加器的指令包括:輸入/輸出指令(IN/OUT)查表轉(zhuǎn)換指令(XLAT)8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令輸入輸出指令輸入指令格式INAL,n ;AL[n](從端口地址為n的端口中讀一

;字節(jié)送AL)INAX,n ;AH[n+1],AL[n]INAL,DX;AL[DX](從地址為DX指明的端口讀

;一字節(jié)送AL)INAX,DX;AH[DX+1],AL[DX]指令的功能把一個(gè)字節(jié)或一個(gè)字由指定的輸入端口傳送到AL或AX中8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令輸入輸出指令輸出指令格式OUTn,AL;[n]AL(將AL值輸出到地址為n的端

;口)OUTn,AX;[n+1]AH,[n]ALOUTDX,AL;[DX]AL(將AL值輸出到地址為DX

;值的端口)OUTDX,AX;[DX+1]AH,[DX]AL指令功能:將AL或AX中的內(nèi)容傳送到指定的輸出端口8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令輸入輸出指令幾點(diǎn)說明用于在累加器AX/AL和指定的I/O端口之間進(jìn)行數(shù)據(jù)傳送,輸入/輸出的方向是針對(duì)CPU所說的由所使用的寄存器(AL/AX)決定輸入/輸出數(shù)據(jù)的位數(shù);8088只有字節(jié)傳送指令;8086的16位輸入輸出指令中的端口地址只能取偶數(shù)如果所指定的端口號(hào)在0-FFH之間,可以采用直接尋址方式,即n為端口號(hào);如果所指定的端口號(hào)大于FFH,則必須采用寄存器間接尋址,即首先要把端口號(hào)賦給DX寄存器。這樣用DX作端口尋址最多可尋找64K個(gè)端口8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令輸入輸出指令舉例:INAL,50H ;把50H號(hào)端口的數(shù)據(jù)讀入ALOUT80H,AL ;AL寄存器的數(shù)據(jù)送到80H號(hào)端口MOVDX,2F0H;把2F0H、2F1H兩個(gè)端口的數(shù)據(jù)INAX,DX;送入AX寄存器8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令查表轉(zhuǎn)換指令指令格式:XLAT[轉(zhuǎn)換表名]指令功能:完成一個(gè)字節(jié)地查表轉(zhuǎn)換(AL)←DS:(BX)+(AL)指令要求:寄存器AL的內(nèi)容作為一個(gè)256字節(jié)的表的下標(biāo)表的首地址置于BX中轉(zhuǎn)換后的結(jié)果存放在AL中指令應(yīng)用場合:數(shù)制轉(zhuǎn)換、函數(shù)表查表、代碼轉(zhuǎn)換等場合8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令查表轉(zhuǎn)換指令舉例:使用查表轉(zhuǎn)換指令查表:找到16進(jìn)制數(shù)7所對(duì)應(yīng)的ASCII碼建立表TABLEDB30h,31h,32h,33h,34h,35h,36hDB37h,38h,39h,41h,42h,43h,44h,45h,46h編程:MOVBX,OFFSETTABLEMOVAL,7XLATTALBE8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令查表轉(zhuǎn)換指令舉例:如下指令序列完成從端口地址為1的端口讀入一個(gè)數(shù),再以該讀到的數(shù)為下標(biāo)(表項(xiàng)序號(hào))去查一轉(zhuǎn)換表,將表中查得的值再輸出到地址為5的輸出端口(注:TABLE是一個(gè)內(nèi)存單元的名稱,代表轉(zhuǎn)換表的首地址)MOVBX,OFFSETTABLE;轉(zhuǎn)換表的偏移地址送BXIN AL,1 ;從端口地址為1的端口讀入的數(shù)送ALXLATTABLE ;查表OUT5,AL ;查表結(jié)果送地址為5的輸出端口8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令地址傳送指令包括三條:LEA(LoadEffectiveAddress)LDS(LoadpointerintoDS)LES(LoadpointerintoES)8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令地址傳送指令——LEA指令格式:LEAOPRD1,OPRD2指令功能:把源操作數(shù)OPRD2的地址偏移量傳送至目的操作數(shù)OPRD1指令要求:源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù)目的操作數(shù)必須是一個(gè)16位的通用寄存器舉例:LEABX,[2000H];把2000H單元的偏移地址送到

;BX。執(zhí)行后BX=2000HLEABX,TABLE;同MOVBX,OFFSETTABLE8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令地址傳送指令——LDS指令格式:LDSOPRD1,OPRD2功能:完成一個(gè)32位地址指針的傳送。地址指針包括段地址部分和偏移量部分。指令將段地址送入DS,偏移量部分送入一個(gè)16位的指針寄存器或變址寄存器指令要求:源操作數(shù)是一個(gè)內(nèi)存操作數(shù)目的操作數(shù)是一個(gè)通用寄存器或變址寄存器32位地址指針在內(nèi)存中存放規(guī)則:偏移地址在低地址段地址在高地址8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令地址傳送指令——LDS舉例:設(shè)DS=3000H,從3000H:2000H單元開始存放的內(nèi)容依次為12H,00H,00H,20H,則執(zhí)行如下指令后LDSSI,[2000H];DS=2000H,SI=0012HLEABX,[2000H]LDSSI,[BX];結(jié)果同上地址傳送指令——LES指令格式:LESOPRD1,OPRD2此指令除將段地址送入ES外,其他與LDS指令相同8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令標(biāo)志傳送指令包括4條:LAHF(LOADAHWITHFLAG)SAHF(STOREAHWITHFLAG)PUSHF(PUSHFLAG)POPF(POPFLAG)8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令標(biāo)志傳送指令——LAHF指令格式:LAHF指令功能:將標(biāo)志寄存器中的SF、ZF、AF、PF和CF(即低8位)傳送至AH寄存器的對(duì)應(yīng)位,空位沒有定義標(biāo)志傳送指令——SAHF指令格式:SAHF指令功能:將寄存器AH的指定位,送至標(biāo)志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根據(jù)AH的內(nèi)容,影響上述標(biāo)志位。此指令對(duì)OF、DF和IF無影響8086/8088指令系統(tǒng)數(shù)據(jù)傳送指令標(biāo)志傳送指令——PUSHF指令格式:PUSHF指令功能:將標(biāo)志寄存器壓入堆棧頂部,同時(shí)修改堆棧指針。此指令不影響標(biāo)志位標(biāo)志傳送指令——POPF指令格式:POPF指令功能:堆棧頂部的一個(gè)字,傳送到標(biāo)志寄存器,同時(shí)修改堆棧指針。該指令會(huì)影響所有標(biāo)志位。舉例:使用PUSHF和POPF,來置TF標(biāo)志為18086/8088指令系統(tǒng)數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令中,除SAHF和POPF外,執(zhí)行后對(duì)標(biāo)志位都沒有影響!8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令包括加、減、乘、除四種運(yùn)算,以及相應(yīng)的十進(jìn)制調(diào)整指令和數(shù)據(jù)寬度變換指令在算術(shù)運(yùn)算類指令中,除了數(shù)據(jù)寬度變換指令之外,其余指令的執(zhí)行結(jié)果都會(huì)影響標(biāo)志算術(shù)運(yùn)算對(duì)象可以是字節(jié)、字的無符號(hào)數(shù)或有符號(hào)數(shù);也可以是無符號(hào)的壓縮或非壓縮BCD數(shù)對(duì)于無符號(hào)數(shù)和有符號(hào)數(shù),加、減運(yùn)算用相同的指令來進(jìn)行;但對(duì)乘、除運(yùn)算要用不同的指令參加運(yùn)算的兩個(gè)操作數(shù)必須同為無符號(hào)數(shù)或有符號(hào)數(shù)8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令參與加、減運(yùn)算的操作數(shù)對(duì)于加、減運(yùn)算,操作數(shù)是否有符號(hào)及結(jié)果的判斷(是否溢出)是用戶的事,計(jì)算機(jī)則是按相同的方法進(jìn)行運(yùn)算;按OF來判別有符號(hào)數(shù)的運(yùn)算是否溢出,而對(duì)無符號(hào)數(shù)的運(yùn)算要用CF來判斷溢出8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令加法指令包括:不帶進(jìn)位位的加法指令A(yù)DD帶進(jìn)位位的加法指令A(yù)DC增量指令I(lǐng)NC8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令不帶進(jìn)位位的加法指令指令格式:ADDOPRD1,OPRD2指令功能:OPRD1OPRD1+OPRD2目的操作數(shù)可以是累加器,任一通用寄存器以及存儲(chǔ)器操作數(shù)這些指令對(duì)標(biāo)志位CF、DF、PF、SF、ZF和AF有影響舉例:ADDAL,30 ADDBX,[3000H] ADDDI,[BX+SI+2]8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令不帶進(jìn)位位的加法指令舉例:執(zhí)行下述兩條指令MOVAX,5439HADDAX,456AH得到結(jié)果:AX=99A3H,CF=0、AF=1、PF=1、ZF=0、SF=1、OF=18086/8088指令系統(tǒng)算術(shù)運(yùn)算指令帶進(jìn)位位的加法指令指令格式:ADCOPRD1,OPRD2指令功能:OPRD1OPRD1+OPRD2+CF在兩個(gè)操作數(shù)相加時(shí),要把進(jìn)位標(biāo)志CF的當(dāng)前值加上目的操作數(shù)可以是累加器,任一通用寄存器以及存儲(chǔ)器操作數(shù)這些指令對(duì)標(biāo)志位CF、DF、PF、SF、ZF和AF有影響ADC指令主要用于多字節(jié)運(yùn)算8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令帶進(jìn)位位的加法指令舉例:設(shè)有兩個(gè)四字節(jié)的數(shù),分別放在數(shù)據(jù)段偏移地址為2000H和3000H開始的單元中,每個(gè)數(shù)占四個(gè)存儲(chǔ)單元,存放時(shí)數(shù)的低字節(jié)位于低地址處。以下程序段實(shí)現(xiàn)該兩數(shù)的相加,結(jié)果放在偏移地址為4000H開始的存儲(chǔ)單元MOVAX,[2000H]ADDAX,[3000H]MOV[4000H],AXMOVAX,[2002H]ADCAX,[3002H]MOV[4002H],AX8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令增量指令指令格式:INCOPRD指令功能:OPRDOPRD+1完成對(duì)指定的操作數(shù)OPRD加1,結(jié)果返回此操作數(shù)指令執(zhí)行的結(jié)果影響標(biāo)志位AF、OF、PF、SF和ZF,注意該指令對(duì)進(jìn)位標(biāo)志CF沒有影響。此指令主要用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等舉例:

INCAL;將AL中的內(nèi)容加1INCAX;將AX中的內(nèi)容加1INCBYTEPTR[BX]8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令減法指令包括:不考慮借位的減法指令SUB考慮借位的減法指令SBB減量指令DEC求補(bǔ)指令NEG比較指令CMP8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令不考慮借位的減法指令指令格式:SUBOPRD1,OPRD2指令功能:OPRD1OPRD1-OPRD2目的操作數(shù)可以是累加器,任一通用寄存器以及存儲(chǔ)器操作數(shù)這些指令對(duì)標(biāo)志位CF、DF、PF、SF、ZF和AF有影響舉例:SUBCX,BX

SUBAL,[BP]8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令考慮借位的減法指令指令格式:SBBOPRD1,OPRD2指令功能:OPRD1OPRD1-OPRD2-CF在兩個(gè)操作數(shù)相減時(shí),還要減去借位標(biāo)志CF的當(dāng)前值目的操作數(shù)可以是累加器,任一通用寄存器以及存儲(chǔ)器操作數(shù)這些指令對(duì)標(biāo)志位CF、DF、PF、SF、ZF和AF有影響同ADC指令一樣,本指令主要用于多字節(jié)操作數(shù)相減8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令減量指令指令格式:DECOPRD指令功能:OPRDOPRD-1完成對(duì)指定的操作數(shù)OPRD減1,結(jié)果送回此操作數(shù)指令執(zhí)行的結(jié)果影響標(biāo)志位AF、OF、PF、SF和ZF,注意該指令對(duì)進(jìn)位標(biāo)志CF沒有影響。此指令主要用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等舉例:

DECAL;將AL中的內(nèi)容減1DECAX;將AX中的內(nèi)容減1DECWORDPTR[BX]8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令求補(bǔ)指令指令格式:NEGOPRD指令功能:對(duì)操作數(shù)OPRD取補(bǔ),相當(dāng)于用零減去操作數(shù),再把結(jié)果送回操作數(shù)指令影響標(biāo)志AF、CF、OF、PF、SF和ZF此指令的結(jié)果一般總使標(biāo)志CF=1,除非在操作數(shù)為零時(shí),才使CF=0若操作數(shù)的值為-128或-32768,則執(zhí)行完NEG后結(jié)果沒變化,但標(biāo)志OF置位該指令執(zhí)行的效果是改變操作數(shù)的符號(hào),但絕對(duì)值不變(取負(fù)指令)8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令求補(bǔ)指令舉例:設(shè)AL=00111100B,則執(zhí)行完“NEGAL”指令后,AL=00000000B-00111100B=11000100BMOVAL,50(-50)NEGAL用該指令實(shí)現(xiàn)100-AL8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令比較指令指令格式:CMPOPRD1,OPRD2指令功能:OPRD1-OPRD2完成兩個(gè)操作數(shù)的相減,但并不送回相減的結(jié)果,只是使結(jié)果影響標(biāo)志位:AF、CF、OF、PF、SF和ZF比較指令主要用于比較兩個(gè)數(shù)之間的大小關(guān)系比較后,根據(jù)標(biāo)志來判斷比較結(jié)果比較兩個(gè)數(shù)是否相等(使用ZF標(biāo)志)如果該指令執(zhí)行后,ZF=1,則兩操作數(shù)相等;否則不等8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令比較指令比較后,根據(jù)標(biāo)志來判斷比較結(jié)果兩個(gè)無符號(hào)數(shù)比較大小(使用CF標(biāo)志位)如果該指令執(zhí)行后,CF=0,則OPRD1≥OPRD2如果該指令執(zhí)行后,CF=1,則OPRD1OPRD2兩個(gè)有符號(hào)數(shù)比較大?。ㄊ褂肧F、OF標(biāo)志位)如果該指令執(zhí)行后,溢出標(biāo)志OF和符號(hào)標(biāo)志SF的值相同,則OPRD1≥OPRD2如果該指令執(zhí)行后,溢出標(biāo)志OF和符號(hào)標(biāo)志SF的值不同,則OPRD1OPRD28086/8088指令系統(tǒng)算術(shù)運(yùn)算指令比較指令帶符號(hào)數(shù)比較8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令比較指令編程中若使用該指令,其后常跟條件轉(zhuǎn)移指令,條件轉(zhuǎn)移指令會(huì)判斷相應(yīng)的標(biāo)志狀態(tài)決定;無符號(hào)數(shù)和有符號(hào)數(shù)要是用兩類不同的條件轉(zhuǎn)移指令舉例:CMPAL,100;AL的內(nèi)容減去100,結(jié)果影響標(biāo)志位比較后把大數(shù)放在AL中8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令乘法指令包括:無符號(hào)數(shù)的乘法指令MUL帶符號(hào)數(shù)乘法指令I(lǐng)MUL8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令無符號(hào)數(shù)的乘法指令指令格式:MULOPRD指令功能:完成字節(jié)與字節(jié)相乘或字與字的相乘。其中的一個(gè)操作數(shù)默認(rèn)放在AL或AX中,而另一個(gè)操作(OPRD)由指令給出。8位數(shù)相乘,結(jié)果(16位數(shù))放在AX中;16位數(shù)相乘結(jié)果為32位數(shù),其中高16位放在DX中,低16位放在AX中注意OPRD不能為立即數(shù)當(dāng)結(jié)果的高半部分不為0時(shí),CF=1,OF=1;否則CF=0,OF=08086/8088指令系統(tǒng)算術(shù)運(yùn)算指令無符號(hào)數(shù)的乘法指令舉例:執(zhí)行下述指令序列:MOVAL,7MOVBL,9MULBL結(jié)果為:AX=003FH(即63),CF=0,OF=08086/8088指令系統(tǒng)算術(shù)運(yùn)算指令帶符號(hào)數(shù)的乘法指令指令格式:IMULOPRD指令功能:除了要求兩個(gè)操作數(shù)為帶符號(hào)數(shù)外,與MUL一樣可以進(jìn)行字節(jié)與字節(jié)或字和字的乘法運(yùn)算。乘法的結(jié)果放在AX(對(duì)字節(jié)相乘)或DX與AX(對(duì)字與字的相乘)當(dāng)結(jié)果的高半部分不是結(jié)果的低半部分的符號(hào)擴(kuò)展時(shí),標(biāo)志位CF和OF將被置位;否則CF=0,OF=08086/8088指令系統(tǒng)算術(shù)運(yùn)算指令帶符號(hào)數(shù)的乘法指令有符號(hào)數(shù)乘法的基本過程(內(nèi)部實(shí)現(xiàn))按乘數(shù)和被乘數(shù)的符號(hào)決定乘積的符號(hào)取乘數(shù)和被乘數(shù)的絕對(duì)值用絕對(duì)值進(jìn)行乘法根據(jù)乘積的符號(hào),將乘積變?yōu)橛蟹?hào)數(shù)舉例:執(zhí)行下述指令序列:MOVAL,0FBHMOVBL,2IMULBL結(jié)果為:AX=0FFF6H(即-10),CF=0,OF=0。8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令除法指令包括:無符號(hào)數(shù)的除法指令DIV帶符號(hào)數(shù)的除法指令I(lǐng)DIV字節(jié)擴(kuò)展指令CBW字?jǐn)U展指令CWD8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令除法指令無符號(hào)數(shù)除法指令格式:DIVOPRD帶符號(hào)數(shù)除法指令格式:IDIVOPDR指令功能:字節(jié)運(yùn)算時(shí)被除數(shù)放在AX中,運(yùn)算結(jié)果商放在AL中,而余數(shù)放在AH中;字運(yùn)算時(shí)被除數(shù)為DX與AX構(gòu)成的32位數(shù)(DX中放高16位),運(yùn)算結(jié)果的商放在AX中,而余數(shù)放在DX中注意OPRD不能為立即數(shù)執(zhí)行后,CF、OF、AF、PF、SF和ZF都是不確定的(無意義)8086/8088規(guī)定,執(zhí)行IDIV指令時(shí),除法結(jié)果的余數(shù)的符號(hào)與被除數(shù)的符號(hào)相同8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令除法指令8088/8088除法指令要求用16位數(shù)除以8位數(shù),或用32位數(shù)除以16位數(shù)。當(dāng)除數(shù)為8位(16位)時(shí),若被除數(shù)也只有8位(16位),則被除數(shù)必須放在AL(AX)中,并對(duì)高8位(16位)AH(DX)進(jìn)行擴(kuò)展無符號(hào)數(shù)擴(kuò)展:AH(DX)清0帶符號(hào)數(shù)擴(kuò)展:使用擴(kuò)展指令,AH(DX)為符號(hào)位的擴(kuò)展8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令除法指令執(zhí)行除法指令時(shí)如果除數(shù)為0,會(huì)自動(dòng)產(chǎn)生0號(hào)中斷若結(jié)果的商超出了所能表示的范圍(例如:IDIV運(yùn)算時(shí),-128~+127,或-32768~+32767),會(huì)作為除數(shù)為0的情況來處理,即產(chǎn)生0號(hào)中斷舉例:執(zhí)行下述指令序列:MOVAX,2000HMOVDX,200HMOVBX,1000HDIVBX結(jié)果為:AX=2002H,DX=0000H8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令除法指令舉例:執(zhí)行下述指令序列:MOVAX,20HMOVBL,-5IDIVBL 結(jié)果為:AX=02FAH8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令字節(jié)擴(kuò)展指令指令格式:CBW指令功能:將AL寄存器的最高位擴(kuò)展到AH,即若AL的最高位為0,則AH=0;否則AH=0FFH字?jǐn)U展指令指令格式:CBW指令功能:將AX寄存器的最高位擴(kuò)展到DX,即若AX的最高位為0,則DX=0;否則DX=0FFFFHCBW、CWD指令執(zhí)行后不影響標(biāo)志位8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令計(jì)算機(jī)中的算術(shù)運(yùn)算,都是針對(duì)二進(jìn)制數(shù)的運(yùn)算;針對(duì)十進(jìn)制算術(shù)運(yùn)算有一類十進(jìn)制調(diào)整指令在計(jì)算機(jī)中人們用BCD碼表示十進(jìn)制數(shù),對(duì)BCD碼計(jì)算機(jī)有兩種表示方法一類為組合(或稱為壓縮)BCD碼,即規(guī)定每個(gè)字節(jié)表示兩位BCD數(shù)一類稱為非組合(或稱非壓縮)BCD碼,即用一個(gè)字節(jié)表示一位BCD數(shù)(在字節(jié)的高四位用0填充)舉例:十進(jìn)制數(shù)25組合BCD碼:25H非組合BCD碼:0205H8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令包括:組合BCD碼加法調(diào)整指令DAA非組合BCD碼加法調(diào)整指令A(yù)AA組合BCD碼減法調(diào)整指令DAS非組合BCD碼減法調(diào)整指令A(yù)AS非組合BCD碼乘法后調(diào)整指令A(yù)AM非組合BCD碼除法前調(diào)整指令A(yù)AD8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令舉例:試編寫指令序列完成十進(jìn)制數(shù)28與68的加法MOVAL,28HMOVBL,68HADDAL,BL;執(zhí)行后AL=90HDAA結(jié)果:AL=96H,AF=1,CF=08086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令舉例:試編寫指令序列完成十進(jìn)制數(shù)7與9的加法MOVAL,07HMOVBL,09HADDAL,BL;執(zhí)行后AL=10HAAA結(jié)果:AL=06H,AH=AH+1,AF=1,CF=1注意:調(diào)整指令DAA、DAS、AAA及AAS都必須緊跟在累加器AL的加減法指令之后8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令舉例:試編寫指令序列完成十進(jìn)制數(shù)7與9的乘法MOVAL,07HMOVBL,09HMULBL;執(zhí)行后AX=003FHAAM結(jié)果:AH=06H,AL=03H8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令十進(jìn)制調(diào)整指令舉例:試編寫指令序列完成十進(jìn)制數(shù)30除以5的運(yùn)算MOVAX,0300HMOVBL,05HAAD;執(zhí)行后AX=001EHDIVBL結(jié)果:AL=06H,AH=00H注意:對(duì)BCD碼數(shù)進(jìn)行除法運(yùn)算時(shí),應(yīng)先執(zhí)行調(diào)整指令A(yù)AD以將AX中的兩位非組合BCD數(shù)進(jìn)行調(diào)整,使其成為無符號(hào)二進(jìn)制數(shù)8086/8088指令系統(tǒng)算術(shù)運(yùn)算指令舉例:綜合使用算術(shù)運(yùn)算指令計(jì)算

(W-(X*Y+Z-200))/XW、X、Y、Z都是16位有符號(hào)數(shù)(變量);結(jié)果的商存入RESULT、余數(shù)存入RESULT+2單元。說明:由于X*Y是32位有符號(hào)數(shù),乘法后的其余運(yùn)算都應(yīng)是32位數(shù)的操作,因此需要對(duì)Z、W進(jìn)行由字到雙字的擴(kuò)展。X是除數(shù),不需要擴(kuò)展。問題:如果操作數(shù)都是16位無符號(hào)數(shù),程序應(yīng)該如何修改?8086/8088指令系統(tǒng)

MOV AX,X IMUL Y MOV CX,AX ;暫存32位乘積

MOV BX,DX MOV AX,Z CWD ;對(duì)Z進(jìn)行擴(kuò)展

ADD CX,AX ;加Z ADC BX,DX ;加進(jìn)位

SUB CX,220 ;減220 SBB BX,0 ;減借位

MOV AX,W CWD ;對(duì)W進(jìn)行擴(kuò)展

SUB AX,CX ;減低16位

SBB DX,BX ;減高16位

IDIV X MOV RESULT,AX ;存商

MOV RESULT+2,DX ;存余數(shù)有關(guān)程序段8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令邏輯運(yùn)算指令這類指令都是對(duì)操作數(shù)進(jìn)行按位操作指令主要用于根據(jù)源操作數(shù)中的位組合格式有選擇地使目標(biāo)操作數(shù)的某些位置位,復(fù)位或?qū)ζ溥M(jìn)行測試包括:求反指令NOT與AND、或OR及異或XOR運(yùn)算指令測試指令TEST8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令求反指令指令格式:NOTOPRD指令功能:對(duì)操作數(shù)求反,結(jié)果回送。操作數(shù)可以是寄存器或存儲(chǔ)器內(nèi)容此指令對(duì)標(biāo)志位無影響舉例:MOVAX,0503HNOTAX結(jié)果:AX=FAFCH8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令與、或及異或運(yùn)算指令指令格式:ANDOPRD1,OPRD2(與運(yùn)算)OROPRD1,OPRD2(或運(yùn)算)XOROPRD1,OPRD2(異或運(yùn)算)指令功能:三類指令完成分別對(duì)兩個(gè)操作數(shù)(8位或16位)按位進(jìn)行邏輯“與”、“或”及“異或”運(yùn)算,結(jié)果送回目的操作數(shù)OPRD1指令將使CF=OF=0,AF無定義,而SF、ZF和PF則根據(jù)運(yùn)算結(jié)果而定8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令與、或及異或運(yùn)算指令邏輯運(yùn)算指令通常還有專門的用途AND指令:對(duì)指定為進(jìn)行屏蔽(清零);OR指令:對(duì)指定位置1;XOR指令:操作數(shù)清零;操作數(shù)的若干位保持不變,若干位取反(分別與“0”、“1”異或)8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令與、或及異或運(yùn)算指令舉例:ANDAL,0FH;AL高四位置0,低四位保持不變ORBX,00FFH ;BH保持不變,BL置為0FFHXORAL,80H;AL最高位取反,其余位不變ANDAX,AX;AX保持不變,可根據(jù)SF,ZFORAX,AX;PF判斷數(shù)的某些特性 XORAX,AX;將AX清零8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令測試指令指令格式:TESTOPRD1,OPRD2指令功能:完成與AND指令相同的操作,但并不送回結(jié)果,只影響標(biāo)志位舉例:以下指令檢測AL中的最低位是否為1,若為1則轉(zhuǎn)移到THERE去執(zhí)行:TESTAL,01HJNZTHERE舉例:讀入50H號(hào)端口中的數(shù)據(jù),并檢測D5位,若為1,表示準(zhǔn)備好,則可以讀入51H號(hào)端口的數(shù)據(jù),否則,繼續(xù)檢測,直到滿足條件8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令測試指令舉例:將由ARRAY開始的10個(gè)8位有符號(hào)數(shù),變?yōu)榻^對(duì)值后,存入由RESULT開始的單元 LEA BX,ARRAY LEA DI,RESULT MOVCL,10AGAIN:MOVAL,[BX] TESTAL,80H;測試正負(fù) JZNEXT ;正數(shù)不變 NEG AL ;負(fù)數(shù)取絕對(duì)值NEXT:MOV[DI],AL INCBX INC DI DEC CL JNZ AGAIN

8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令

指令格式:算術(shù)左移:SALOPRD,M邏輯左移:SHLOPRD,M算術(shù)右移:SAROPRD,M邏輯右移:SHROPRD,M指令功能:對(duì)寄存器或內(nèi)存單元中的8位或16位操作數(shù)進(jìn)行指定位數(shù)的左移或右移

8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令指令功能:OPRD為指定的要進(jìn)行移位的操作數(shù),M是移位位數(shù)。M可以是1,但如果移位位數(shù)大于1,則移位的位數(shù)必須在寄存器CL中指明(此時(shí)M應(yīng)為CL)邏輯移位指令移位時(shí)將操作數(shù)看成無符號(hào)數(shù)對(duì)待,右移時(shí)最高位添0;而算術(shù)移位指令將操作數(shù)看成有符號(hào)數(shù),右移時(shí)保持最高位的值不變所有移位指令的執(zhí)行均會(huì)影響標(biāo)志位CF、OF、PF、SF和ZF,AF無定義在左移位數(shù)為1時(shí),如果移位后最高位與CF的值不同,則溢出標(biāo)志OF置1

8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令

指令應(yīng)用:左移1位實(shí)現(xiàn)乘2的運(yùn)算(左移以后的數(shù)未超出一個(gè)字節(jié)或一個(gè)字的表達(dá)范圍),右移1位實(shí)現(xiàn)除2的運(yùn)算;常用來實(shí)現(xiàn)對(duì)二進(jìn)制數(shù)進(jìn)行乘2n的運(yùn)算;常用來將字節(jié)或字的某些位分離出來舉例:SALCX,1 ;將CX中的值左移1位,最低位補(bǔ)0MOVCL,3 SHRAX,CL;將AX的值邏輯右移CL中指定的位數(shù)8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令

舉例:以下指令序列完成將AL中的數(shù)乘5的操作

MOVAL,7;AL置7MOVBL,AL MOVCL,2 SHLAL,CL;AL左移2位,相當(dāng)于乘4ADDAL,BL;執(zhí)行后AL=7*5=35舉例:將AL中的組合BCD碼變?yōu)橄鄳?yīng)的ASCII碼,存入AH和AL舉例:若AH和AL中分別存有非壓縮的BCD數(shù),請轉(zhuǎn)換為組合的BCD數(shù)存入AL8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令循環(huán)移位指令

指令格式:循環(huán)左移:ROLOPRD,M循環(huán)右移:ROROPRD,M帶進(jìn)位的循環(huán)左移:RCLOPRD,M帶進(jìn)位的循環(huán)右移:RCROPRD,M指令功能:8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令指令功能:循環(huán)移位指令可以對(duì)字節(jié)或字進(jìn)行操作;操作數(shù)可以是寄存器操作數(shù),也可以是內(nèi)存操作數(shù);循環(huán)移位的位數(shù)可為1,超過1時(shí)需由CL指定這些指令只影響CF和OF。ROL和RCL在執(zhí)行1次左移后,如果操作數(shù)的最高位與CF不同,則OF置1;ROR和RCR在執(zhí)行1次右移后,如果操作數(shù)的最高位與次高位不同,則OF置1。8086/8088指令系統(tǒng)邏輯運(yùn)算和移位指令算術(shù)及邏輯移位指令

舉例:執(zhí)行以下指令序列

MOVAX,99A3H ;AX置99A3HORAX,0 ;AX值不變,但置CF為0ROLAX,1 ;對(duì)AX進(jìn)行循環(huán)左移結(jié)果:AX=3347H,CF=1舉例:使BX所指的四個(gè)單元中的四字節(jié)數(shù)左移一位SALWORDPTR[BX+0],1RCLWORDPTR[BX+2],1 8086/8088指令系統(tǒng)串操作類指令串操作類指令可以用來實(shí)現(xiàn)內(nèi)存區(qū)域的數(shù)據(jù)串操作。這些數(shù)據(jù)串可以是字節(jié)串,也可以是字串源操作數(shù)用寄存器SI尋址,默認(rèn)在數(shù)據(jù)段DS中目的操作數(shù)用寄存器DI尋址,默認(rèn)在附加段ES中字串長度默認(rèn)在CX中,存取或搜索的值默認(rèn)在AL中8086/8088指令系統(tǒng)串操作類指令每執(zhí)行一次串操作指令,SI和DI將自動(dòng)修改:±1(對(duì)于字節(jié)串)或±2(對(duì)于字串)執(zhí)行指令CLD指令后,DF=0,地址指針增1或2執(zhí)行指令STD指令后,DF=1,地址指針減1或2串操作類指令可以與重復(fù)指令前綴配合使用。從而可以使操作得以重復(fù)進(jìn)行,及時(shí)停止8086/8088指令系統(tǒng)串操作類指令重復(fù)前綴重復(fù)前綴的幾種形式注意:重復(fù)前綴只能用于串操作指令之前8086/8088指令系統(tǒng)串操作類指令MOVS指令(movestring)指令格式:MOVSBMOVSW指令功能:把數(shù)據(jù)段中由SI間接尋址的一個(gè)字節(jié)(或一個(gè)字)傳送到附加段中由DI間接尋址的一個(gè)字節(jié)單元(或一個(gè)字單元)中去,然后,根據(jù)方向標(biāo)志DF及所傳送數(shù)據(jù)的類型(字節(jié)或字)對(duì)SI及DI進(jìn)行修改在指令重復(fù)前綴REP的控制下,可將數(shù)據(jù)段中的整串?dāng)?shù)據(jù)傳送到附加段中去8086/8088指令系統(tǒng)串操作類指令MOVS指令(movestring)舉例:在數(shù)據(jù)段中偏移地址為1000H開始的存儲(chǔ)區(qū)內(nèi)有一(字節(jié))字符串,其長度為100,要求把它們傳送到附加段中偏移地址為2000H開始的一片緩沖區(qū)內(nèi)MOVSI,1000H ;置源串偏移地址MOVDI,2000H ;置目的串偏移地址MOVCX,100 ;置串長度CLD ;方向標(biāo)志復(fù)位REPMOVSB ;字符串傳送8086/8088指令系統(tǒng)串操作類指令CMPS指令(comoarestring)指令格式:CMPSBCMPSW指令功能:把數(shù)據(jù)段中由SI間接尋址的一個(gè)字節(jié)(或一個(gè)字)與附加段中由DI間接尋址的一個(gè)字節(jié)(或一個(gè)字)進(jìn)行比較操作,使比較的結(jié)果影響標(biāo)志位。根據(jù)方向標(biāo)志DF及所進(jìn)行比較的操作數(shù)類型(字節(jié)或字)對(duì)SI及DI進(jìn)行修改在指令重復(fù)前綴REPE/REPZ或者REPNE/REPNZ的控制下,可在兩個(gè)數(shù)據(jù)串中尋找第一個(gè)不相等的字節(jié)(或字),或者第一個(gè)相等的字節(jié)(或字)8086/8088指令系統(tǒng)串操作類指令CMPS指令(comoarestring)舉例:比較兩個(gè)字符串STRING1、STRING2,若相同在RESULT單元中置0.否則置0FFHMOVSI,OFFSETSTRING1MOVDI,OFFSETSTRING2MOVCX,COUNTCLDREPZCMPSBJNZNUMAT;串不相同MOVAL,0JMPOUTPUTUNMAT:MOVAL,0FFHOUTPUT:MOVRESULT,AL8086/8088指令系統(tǒng)串操作類指令SCAS指令(scanstring)指令格式:SCASBSCASW指令功能:指令指定的關(guān)鍵字節(jié)或關(guān)鍵字(存放在AL或AX中)與附加段中由DI間接尋址的字節(jié)串(或字串)中的一個(gè)字節(jié)(或字)進(jìn)行比較,比較的結(jié)果影響標(biāo)志位。根據(jù)方向標(biāo)志DF及所進(jìn)行比較的操作數(shù)類型(字節(jié)或字)對(duì)SI及DI進(jìn)行修改在指令重復(fù)前綴REPE/REPZ或者REPNE/REPNZ的控制下,可在指定的數(shù)據(jù)串中搜索第一個(gè)與關(guān)鍵字節(jié)(或字)匹配的字節(jié)(或字),或者搜索第一個(gè)與關(guān)鍵字節(jié)(或字)不匹配的字節(jié)(或字)8086/8088指令系統(tǒng)串操作類指令SCAS指令(scanstring)舉例:在以BLOCK開始的字符串中,搜索一字符CHARLEADI,BLOCKMOVCX,COUNTMOVAL,CHARCLDREPNESCASBJZFOUNDMOVDI,0JMPDONEFOUND:MOVBX,OFFSETBLOCKSUBDI,BXMOVBX,DI;串中第幾個(gè)字符DONE:HLT8086/8088指令系統(tǒng)串操作類指令STOS指令(storestring)指令格式:STOSBSOTSW指令功能:把指令中指定的一個(gè)字節(jié)或一個(gè)字(分別存放在AL及AX中),傳送到附加段中由DI間接尋址的字節(jié)內(nèi)存單元(或字內(nèi)存單元)中去。根據(jù)方向標(biāo)志DF及所進(jìn)行比較的操作數(shù)類型(字節(jié)或字)對(duì)SI及DI進(jìn)行修改在指令重復(fù)前綴REP的控制下,可連續(xù)將AL(或AX)的內(nèi)容寫入附加段中的一段內(nèi)存區(qū)域中。該指令不影標(biāo)志位8086/8088指令系統(tǒng)串操作類指令STOS指令(storestring)舉例:對(duì)附加段中偏移地址為3000H開始的99個(gè)連續(xù)的內(nèi)存字節(jié)單元清0MOVDI,3000H ;裝入目的區(qū)域偏移地址MOVAL,00H ;為清零操作準(zhǔn)備MOVCX,99 ;設(shè)置區(qū)域長度REPSTOSB8086/8088指令系統(tǒng)串操作類指令LODS指令(loadstring)指令格式:LODSBLODSW指令功能:該指令將數(shù)據(jù)段中由SI間接尋址的字節(jié)內(nèi)存單元(或字內(nèi)存單元)的值送到AL(或AX中)。根據(jù)方向標(biāo)志DF及所進(jìn)行比較的操作數(shù)類型(字節(jié)或字)對(duì)SI及DI進(jìn)行修改該指令一般不使用重復(fù)前綴8086/8088指令系統(tǒng)串操作類指令LODS指令(loadstring)舉例:將由BLOCK開始的數(shù)據(jù)區(qū)中的正數(shù)存入以PLUS開始的區(qū)域,負(fù)數(shù)存入以MINUS開始的區(qū)域。源數(shù)據(jù)區(qū)的長度為COUNT要設(shè)3個(gè)地址指針:SI指向源數(shù)據(jù)區(qū),DI指向正數(shù)區(qū),BX指向負(fù)數(shù)區(qū);用LODSB指令將源數(shù)據(jù)區(qū)中的數(shù)據(jù)取出到AL;按照數(shù)據(jù)的正、負(fù),用STOS指令存入正、負(fù)數(shù)據(jù)區(qū);由于STOS指令必須用DI作指針,在使用時(shí)要和設(shè)定的指針BX作交換。8086/8088指令系統(tǒng)串操作類指令 LEASI,BLOCK LEADI,PLUS LEABX,MINUS MOVCX,COUNTGOON: LODSB ;取一個(gè)數(shù)

TESTAL,80H ;測試正負(fù)

JNZMINS ;負(fù)數(shù)轉(zhuǎn)移PLS: STOSB ;存正數(shù)

JMPAGAINMINS: XCHGBX,DI ;交換指針

STOSB ;存負(fù)數(shù)

XCHGBX,DI ;交換指針AGAIN: DEC CX ;次數(shù)減1 JNZGOON ;不等于0繼續(xù)

RET8086/8088指令系統(tǒng)程序控制指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)程序分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的最常用指令控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變?nèi)绻D(zhuǎn)移的目標(biāo)地址在當(dāng)前代碼段,則只修改IP(段內(nèi)轉(zhuǎn)移)如果轉(zhuǎn)移的目標(biāo)地址在其它代碼段,則同時(shí)修改CS和IP(段間轉(zhuǎn)移);8086/8088指令系統(tǒng)程序控制指令無論是段內(nèi)還是段間轉(zhuǎn)移,都還有直接轉(zhuǎn)移和間接轉(zhuǎn)移之分直接轉(zhuǎn)移:轉(zhuǎn)移的目標(biāo)地址直接出現(xiàn)在指令中間接轉(zhuǎn)移:轉(zhuǎn)移的目標(biāo)地址間接地存儲(chǔ)在某一寄存器或內(nèi)存變量中這類指令中,除中斷指令外,其它指令均不影響標(biāo)志位這類指令包括:無條件轉(zhuǎn)移指令JMP條件轉(zhuǎn)移指令Jcc調(diào)用/返回指令CALL/RET循環(huán)控制指令LOOP等中斷指令I(lǐng)NTn/IRET8086/8088指令系統(tǒng)程序控制指令無條件轉(zhuǎn)移指令JMP指令一般格式:JMPOPRD;OPRD是轉(zhuǎn)移的目的地址段內(nèi)直接JMP:用指令中的偏移量加到目前指令指針lP上來改變lP,實(shí)現(xiàn)跳轉(zhuǎn)(相對(duì)轉(zhuǎn)移)JMPSHORTOBJECT;IP=IP+8位位移量JMPNEAROBJECT;IP=IP+16位位移量舉例:JMPOBJECT(JMP1000H)段間的直接轉(zhuǎn)移:指令中給出轉(zhuǎn)向地址的段地址和段內(nèi)偏移量JMPFAROBJECT(JMP2000H:1000H)8086/8088指令系統(tǒng)程序控制指令無條件轉(zhuǎn)移指令JMP段內(nèi)間接JMP:指令的目的地址可以由存儲(chǔ)器或寄存器給出JMPBX;IP=(BX)JMPWORDPTR[BX];IP=((DS)*16+(BX))段間的間接轉(zhuǎn)移:指令的目的地址可以由存儲(chǔ)器給出JMPDWORDPTR[SI]該指令執(zhí)行后,程序轉(zhuǎn)移到以SI及SI+1兩單元內(nèi)容作為IP,而SI+2及SI+3兩單元內(nèi)容作為CS的地方8086/8088指令系統(tǒng)程序控制指令條件轉(zhuǎn)移指令8088/8086提供了許多條件轉(zhuǎn)移指令,它們根據(jù)標(biāo)志寄存器中各標(biāo)志位的狀態(tài),決定程序是否進(jìn)行轉(zhuǎn)移條件轉(zhuǎn)移指令都是段內(nèi)相對(duì)轉(zhuǎn)移方式,轉(zhuǎn)移范圍為-128~+127一個(gè)8位位移量,表示本條件轉(zhuǎn)移指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志8086/8088指令系統(tǒng)程序控制指令條件轉(zhuǎn)移指令單標(biāo)志位條件轉(zhuǎn)移JZ或JEOPRD ;結(jié)果為零(ZF=1)轉(zhuǎn)移JNZ或JNEOPRD ;結(jié)果不為零(ZF=0)轉(zhuǎn)移JSOPRD ;結(jié)果為負(fù)數(shù)(SF=1)轉(zhuǎn)移JNSOPRD ;結(jié)果為正數(shù)(SF=0)轉(zhuǎn)移JP或JPEOPRD;結(jié)果低8位有偶數(shù)個(gè)1(PF=1)時(shí)轉(zhuǎn)移JNP或JPOOPRD;結(jié)果低8位有奇數(shù)個(gè)1(PF=0)時(shí)轉(zhuǎn)移JOOPRD ;結(jié)果溢出(OF=1)轉(zhuǎn)移JNOOPRD ;結(jié)果不溢出(OF=0)轉(zhuǎn)移JCOPRD ;結(jié)果有進(jìn)位或借位(CF=1)轉(zhuǎn)移JNCOPRD ;結(jié)果無進(jìn)位或無借位(CF=0)轉(zhuǎn)移8086/8088指令系統(tǒng)程序控制指令條件轉(zhuǎn)移指令不帶符號(hào)數(shù)比較轉(zhuǎn)移JA/JNBEOPRD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論