微機原理第3章_第1頁
微機原理第3章_第2頁
微機原理第3章_第3頁
微機原理第3章_第4頁
微機原理第3章_第5頁
已閱讀5頁,還剩245頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章

8086指令系統1主要內容:指令系統的一般概念對操作數的尋址方式六大類指令的操作原理:操作碼的含義指令對操作數的要求指令執行的結果2§3.1

概述3了解:指令及指令系統;指令的格式;指令中的操作數類型;指令字長與機器字長;指令的執行時間CISC和RISC指令系統4一、指令與指令系統指令:控制計算機完成某種操作的命令指令系統:處理器所能識別的所有指令的集合指令的兼容性:同一系列機的指令都是兼容的。5指令系統特點8086與8088指令系統由8位8080/8085指令系統擴展而來的,同時又能在其后續的80x86系列的CPU上正確運行。其主要特點是:可變長指令:指令格式比較復雜。尋址方式多樣靈活,處理數據能力比較強(字節/字、有符號/無符號二進制數據、壓縮型/非壓縮型十進制數據)。有重復指令、乘除運算指令。擴充了條件轉移、移位/循環指令。增設了加強軟件中斷功能和支持多處理器系統的相關指令。6二、指令格式指令中應包含的信息:運算數據的來源運算結果的去向執行的操作7指令格式操作碼[操作數],[操作數]執行何種操作目標操作數源操作數參加操作的數據或數據存放的地址8指令格式

零操作數指令:操作碼單操作數指令:操作碼操作數雙操作數指令:操作碼操作數,操作數多操作數指令:三操作數及以上9三、指令中的操作數立即數寄存器存儲器表征參加操作的數據本身表征數據存放的地址10立即數操作數立即數本身是參加操作的數據,可以是8位或16位,只能作為源操作數。例:MOVAX,1234HMOVBL,22H立即數無法作為目標操作數立即數可以是無符號或帶符號數,其數值應在可取值范圍內。11寄存器操作數參加運算的數存放在指令給出的寄存器中,可以是16位或8位。例:MOVAX,BXMOVDL,CH12存儲器操作數參加運算的數存放在存儲器的某一個或某兩個單元中。表現形式:[]立即數或寄存器[]中的內容是存放所尋找數據的單元的偏移地址13存儲器操作數例例:MOVAX,[1200H]MOVAL,[1200H]22H11H1200H偏移地址AHAL┇

14四、指令字長指令字長:由操作碼的長度、操作數地址長度、操作數個數決定。15五、指令的執行速度指令的字長影響指令的執行速度對不同的操作數,指令執行的時間不同:

存儲器

快!立即數寄存器16六、CISC和RISC指令系統CISC(complexinstructionsetcomputer)指令的功能強,種類多,常用指令用硬件實現;指令系統復雜,難使用。RISC指令系統指令功能較弱,種類少,格式簡單;多數指令在一個計算機周期內完成;對存儲器的結構和存取速度要求較高。17§3.2

尋址方式18尋址方式

尋找操作數所在地址的方法尋找轉移地址的方法

本節19尋址方式操作數可能的來源或存放處:由指令直接給出寄存器內存單元尋找操作數所在地址的方法可以有三種大類型指令直接給出的方式存放于寄存器中的尋址方式存放于存儲器中的尋址方式20尋址方式分類固定尋址立即數尋址寄存器尋址存儲器尋址其他尋址方式直接尋址間接尋址基址尋址變址尋址基址加變址尋址串操作指令尋址I/O端口尋址轉移類指令尋址21固定尋址有些單字節指令,其操作是規定CPU對某個固定的寄存器進行的。如:加法的ASCII調整指令AAA,規定被調整的數總位于AL中。該指令用來調整AL中的結果,指令編碼為:22立即數尋址指令中的源操作數是立即數,即源操作數是參加操作的數據本身立即數尋址僅適合于源操作數例:MOVAX,1200H12H00HAHALMOV代碼段┇

23立即數尋址特點立即數可以是8位,或16位;只能是整數類型的源操作數;主要用來給寄存器賦初值;指令執行速度快。24寄存器尋址參加操作的操作數在CPU的通用寄存器中。例:MOVAX,BXAXBX25寄存器尋址特點尋址的指令長度短;操作數就在CPU內部進行,不需要使用總線周期;指令執行速度快。26存儲器尋址尋找存儲器操作數,必須經總線控制邏輯電路進行存取。當EU單元需要讀/寫位于存儲器的操作數時:根據尋址方式(指令中B2字節),由EU計算出操作數地址的偏移量,即有效地址EA;將EA送至BIU單元,同時請求BIU執行一個總線周期;BIU將某個段寄存器的內容左移4位,加上EU送來的EA,形成20位的實際地址,即物理地址PA;執行總線周期,讀/寫指令所需的操作數。27直接尋址指令中直接給出操作數的偏移地址默認在數據段例:MOVAX,[1200H]22H11H1200H偏移地址┇

數據段AHAL28直接尋址直接尋址方式下,操作數的段地址默認為數據段,但允許段重設,即由指令定義段。特點:最簡單、直觀;指令中直接以位移量形式,給出操作數的有效地址EA,即EA=DISP;執行速度快,主要用于存取位于存儲器中的簡單變量。29間接尋址參與操作的操作數存放在內存中,其偏移地址為指令中的寄存器的內容。例:MOVAX,[BX]

設BX=1200H22H11H1200H偏移地址AHAL┇

1122數據段代碼段MOV30間接尋址由寄存器間接給出操作數的偏移地址;存放偏移地址的寄存器稱為間址寄存器,它們是:BX,BP,SI,DI操作數的段地址(數據處于哪個段)取決于選擇哪一個間址寄存器:

BX,SI,DIBP默認在數據段默認在堆棧段31間接尋址寄存器間接尋址基址尋址(間址寄存器為基址寄存器BX,BP)變址尋址(間址寄存器為變址寄存器SI,DI)32基址尋址操作數的偏移地址為寄存器的內容加上一個位移量例:MOVAX,[BX+DATA]設:DS=2000H,BX=0220H,DATA=05H則:AX=[20225H]33基址加變址尋址操作數的偏移地址為一個基址寄存器的內容+一個變址寄存器的內容;操作數的段地址由選擇的基址寄存器決定基址寄存器為BX,默認在數據段基址寄存器為BP,默認在堆棧段基址變址尋址方式主要用于一維數組操作。34例:執行下列指令:MOVSI,1100HMOVBX,SIMOVAX,[SI+BX]22H11H2200H偏移地址AHAL┇

1122數據段35存儲器尋址實例例:設DS=1200H,BX=05A6H,SS=5000H,BP=40A0H,SI=2000H,DI=3000H,位移量DISP=1618H。試判斷下列指令的尋址方式,并求出在各種尋址方式下的EA(邏輯地址)和PA(物理地址),并說明指令執行的結果。,①MOVAX,[0618H]直接尋址EA=DISP=0618HPA=DS左移4位+EA=12000H+0618H=12618H執行結果:將數據段12618H和12619H兩單元的內容取出送AX。36存儲器尋址實例②MOVAX,[BX]間接尋址:基址尋址EA=BX=05A6HPA=DS左移4位+EA=12000H+05A6H=125A6H執行結果:將數據段125A6H和125A7H兩單元的內容取出送AX。37存儲器尋址實例③MOVAX,[BP]間接尋址:基址尋址EA=BP=40A0HPA=SS左移4位+EA=50000H+40A0H=540A0H執行結果:將堆棧段540A0H和540A1H兩單元的內容取出送AX。38存儲器尋址實例④MOVAX,[DI]間接尋址:變址尋址EA=DI=3000HPA=DS左移4位+EA=12000H+3000H=

15000H執行結果:將數據段15000H和15001H兩單元的內容取出送AX。39存儲器尋址實例⑤MOVAX,[BX+DI]間接尋址:基址加變址尋址EA=BX+DI=05A6H+3000H=35A6HPA=DS左移4位+EA=12000H+35A6H=155A6H執行結果:將數據段155A6H和155A7H兩單元的內容取出送AX。40存儲器尋址實例⑥MOVAX,[BP+SI+DISP]間接尋址:基址加變址尋址EA=BP+SI+DISP=40A0H+2000H+1618H=76B8HPA=SS左移4位+EA=50000H+76B8H=576B8H執行結果:將堆棧段576B8H和576B9H兩單元的內容取出送AX。41其它尋址方式1.串操作指令尋址方式源串操作數第1個字節/字有效地址存放在源變址寄存器SI中。目標串操作數第1個字節/字有效地址存放在目標變址寄存器DI中。重復串操作時,自動修改SI和DI的內容,指向后面的字節/字。指令中,不必給出SI或DI的編碼,故串操作指令是隱含尋址方式。42其它尋址方式2.I/O端口尋址方式直接端口尋址:以8位立即數方式在指令中直接給出。端口號范圍0~255例如:INAL,n間接端口尋址:通過DX間接尋址,16位端口地址放在DX中。端口號范圍0~65535例如:OUTDX,AL43其它尋址方式3.轉移類指令的尋址方式8086/8088系統中,存儲器采用分段結構,轉移類指令有段內轉移和段間轉移。條件轉移指令:只允許實現段內轉移,且段內短轉移,即轉移地址范圍為-128~+127字節,由指令直接給出8位地址偏移量。無條件轉移指令和調用指令:段內短轉移,段內直接轉移,段內間接轉移,段間直接轉移,段間間接轉移44§3.38086指令系統45掌握:指令碼的含義指令對操作數的要求指令的對標志位的影響指令的功能468086指令系統從功能上包括六大類:數據傳送算術運算邏輯運算和移位串操作程序控制處理器控制47數據傳送指令通用數據傳送輸入輸出地址傳送標志位操作48一、通用數據傳送一般數據傳送指令堆棧操作指令交換指令查表轉換指令字位擴展指令特點:該類指令的執行對標志位不產生影響

49一般數據傳送指令格式:MOVd,s;將源操作數s指定的內容送到目的d源操作數:8/16位寄存器、存儲器中的某個字節/字,或者8/16位立即數;目標操作數:8/16位寄存器、存儲器中的某個字節/字,不能為立即數;50一般數據傳送指令注意:兩操作數字長必須相同;兩操作數不允許同時為存儲器操作數;兩操作數不允許同時為段寄存器;在源操作數是立即數時,目標操作數不能是段寄存器;IP和CS不作為目標操作數,FLAGS一般也不作為操作數在指令中出現。51一般數據傳送指令例例1:8/16位立即數送累加器AL和AX的指令。MOVAX,0;AX清0,字傳送MOVAL,12H;AL←12H,字節傳送例2:兩個存儲單元(SI)和(DI)之間傳送數據。MOVAL,[SI];AL

←SIMOV[DI],AL;DI←AL例3:CPU內部寄存器之間(除CS,IP外)實現數據的任意傳送。MOVAH,AL;AH←AL,字節傳送MOVDS,AX;DS←AX,字傳送MOVSI,BP;SI←BP,字傳送DI←SI52一般數據傳送指令例例4:CPU內部通用寄存器與存儲器之間實現的數據傳送。MOVAL,BUFFER;AL←內存單元BUFFER中字節內容MOVAX,[SI];AX←SI間接尋址指示的內存兩單元字內容MOV[DI],CX;[DI]←CX的內容例5:將數據段首地址DATA填入DS中。MOVAX,DATA;AX←數據段首地址DATAMOVDS,AX;DS←AX53一般數據傳送指令應用例將(*)的ASCII碼2AH送入內存數據段1000H開始的100個單元中。題目分析:確定首地址確定數據長度寫一次數據修改單元地址修改長度值判斷寫完否?未完繼續寫入,否則結束1063H100B1000H┇

2AH數據段2AH2AH2AH54一般數據傳送指令應用例程序段:

MOVDI,1000HMOVCX,64HMOVAL,2AHAGAIN:MOV[DI],ALINCDI;DI+1

DECCX;CX-1JNZAGAIN;CX≠0則繼續HLT55上段程序在代碼段中的存放形式設CS=109EH,IP=0100H,則各條指令在代碼段中的存放地址如下:

CS:IP機器指令匯編指令109E:0100B80010MOVDI,1000H109E:0103.MOVCX,64H109E:0105.MOVAL,2AH109E:0107.MOV[DI],AL109E:0109INCDI109E:010ADECCX109E:010BJNZ0107H109E:010DHLT56數據段中的分布

送上2AH后數據段中相應存儲單元的內容改變如下:DS:10002A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10102A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10202A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10302A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10402A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10502A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10602A2A2A2A000000000000000000000000偏移地址[DI]57堆棧操作指令掌握:有關堆棧的概念棧頂、棧首、棧底堆棧指令的操作原理執行過程,執行結果58堆棧操作指令壓棧指令PUSH

格式:PUSHOPRD出棧指令POP

格式:POPOPRD16位寄存器或存儲器兩單元16位寄存器或存儲器兩單元59壓棧指令PUSH指令執行過程:SP-2→SP操作數高字節→SP+1操作數低字節→SP┇

SP堆棧段SP高8位低8位60壓棧指令的操作設AX=1234H,SP=1200H執行PUSHAX指令后堆棧區的狀態:1200H┇

堆棧段SP-2=11FEH12H34H1200H┇

堆棧段12H34HAX入棧后入棧前61出棧指令POP指令執行過程:

SP

SP+1SP←SP+2操作數低字節操作數高字節┇

SP堆棧段SP高8位低8位62出棧指令的操作執行POPAX12H34H11FEH┇

堆棧段代碼段PUSH1234AX

SP+21200H┇

出棧后出棧前63堆棧操作指令特點源操作數和目標操作數可以是16位寄存器或存儲器兩相鄰單元;堆棧按字操作;每執行一條入棧指令,堆棧地址指針SP減2,入棧的數據,位于棧頂;高位字節先入棧,放在較高地址單元,低位字節后入棧,放在較低地址單元;“先進先出原則”執行彈出指令時,過程相反,棧頂指針的值加2;CS段寄存器值可以入棧,但不能反過來彈出一個字到CS。64堆棧操作指令說明指令的操作數必須是16位的;操作數可以是寄存器或存儲器兩單元,但不能是立即數;不能從棧頂彈出一個字給CS;PUSH和POP指令在程序中一般成對出現;PUSH指令的操作方向是從高地址向低地址,而POP指令的操作正好相反。65堆棧操作指令例PUSHBX其中:CS=1000H,IP=0030H,SS=2000H,SP=0040H,BX=2340H指令編碼格式與操作過程66堆棧操作指令例POPCX其中:CS=1000H,IP=0020H,SS=1600H,SP=004CH指令編碼格式與操作過程67交換指令XCHGd,

s;將源操作數和目的操作數(字或字節)相互對應交換位置。特點:可以在通用寄存器與累加器之間,通用寄存器之間交換;通用寄存器與存儲器之間進行;兩個存儲單元之間不能交換;不能使用立即數;段寄存器與IP不能作為一個源或目的操作數。68交換指令例例如:XCHGAX,[SI+0400H]。其中:CS=1000H,IP=0064H,DS=2000H,SI=3000H,AX=1234H物理地址:PA=DSx16+SI+0400H=20000H+3000H+0400H=23400H;執行操作:將AX內容1234H與23400H、23401H兩單元內容ABCDH相互交換位置。執行結果:AX=ABCDH;(23400H)=34H,(23401H)=12H69查表指令XLAT

;通過查表來完成代碼轉換;用于實現字節翻譯功能的指令。將寄存器AL中設定的一個字節數值變換為內存一段連續表格中的另一個相應代碼,以實現編碼制的轉換。對于一些無規律的代碼轉換比較方便。使用指令前:BX寄存器指向表的首地址;AL中存放待查的碼,即某一項與表首址的距離。70查表指令例操作步驟:建立代碼轉換表:最大容量256字節,將該表定位到內存中某個邏輯段的一片連續地址中,并將表首地址的偏移量置入BX。MOVBX,0030H將待轉換的一個十進制數在表中的序號送入AL中。MOVAL,5執行XLAT命令。XLAT71例如:十進制數0~9的七段顯示碼表,被定位在當前數據段中,其起始地址的偏移地址值為0030H,將AL中待轉換的十進制數5轉換成對應的七段碼。CS=2000H,IP=007AH,DS=4000H。字位擴展指令將符號數的符號位擴展到高位;指令為零操作數指令,采用隱含尋址,隱含的操作數為AX及AX,DX無符號數的擴展規則為在高位補072字節到字的擴展指令格式:CBW操作:將AL內容擴展到AX規則:若最高位=1,則執行后AH=FFH若最高位=0,則執行后AH=00H73字到雙字的擴展指令格式:CWD操作:將AX內容擴展到DXAX規則:若最高位=1,則執行后DX=FFFFH若最高位=0,則執行后DX=0000H74二、輸入輸出指令掌握:指令的格式及操作指令的兩種尋址方式指令對操作數的要求75輸入輸出指令I/O數據傳送指令(2條)輸入字節或字:IN累加器,端口輸出字節或字:OUT端口,累加器特點:I/O指令只能用累加器作為執行I/O數據傳送的機構;直接尋址I/O指令:尋址范圍0~255;間接尋址I/O指令:尋址范圍0~65535;I/O設備地址兩種形式:固定端口和可變端口。76輸入指令INAL/AX,端口號;指定端口中內容輸入到累加器AL/AX端口號可由8位立即數直接給出;也可由DX寄存器間接給出16位端口號。INAL,PORT;AL←(端口PORT)INAX,PORT;AX←(端口PORT)INAL,DX;AL←端口(DX)INAX,DX;AX←端口(DX)77輸入指令例例如:INAL,40HCS=1000H,IP=0050H,8位端口40H中內容為55H。78輸出指令OUT端口號,AL/AX;累加器AL/AX中內容輸出到指定端口。端口號可由8位立即數直接給出,也可用DX寄存器間接給出16位端口號。OUTPORT,AL;端口PORT←ALOUTPORT,AX;端口PORT←AXOUTDX,AL;端口(DX)←ALOUTDX,AX;端口(DX)←AX79輸出指令例例如:OUTDX,ALCS=4000H,IP=0020H,DX=6A10H,AL=66H。執行結果:將累加器AL中的數據字節66H,輸出到DX指定的端口6A10H中。80三、地址傳送指令取偏移地址指令LEA取變量地址指令LDS取變量地址指令LES81取偏移地址指令LEA操作:將變量的16位偏移地址取出送目標寄存器當程序中用符號地址表示內存偏移地址時,須使用該指令。格式:

LEAREG,MEM

指令要求:源操作數必須是一個存儲器操作數,目標操作數通常是間址寄存器。符號地址82取偏移地址指令LEA例例如:LEABX,[SI+100AH]CS=1500H,IP=0200H,DS=2000H,SI=0030H。源操作數為1234H。83取偏移地址指令LEA注意和LEA和MOV指令區別。例如:LEAAX,[0618H];將內存單元的偏移量0618H送AX;

指令執行后,AX中的內容為0618HLEASP,[3768H];使堆棧指針SP為3768HLEABX,[BP+DI];將內存單元的偏移量BP+DI送BX;

指令執行后,BX中內容為BP+DI的值84取變量地址指令LDSLDSd,s;取某變量的32位地址指針的指令從源操作數所指定的存儲單元開始,由4個連續存儲單元中取出某變量的地址指針(共4個字節)。將前兩個字節(偏移地址)傳送到目標操作數所指定的16位通用寄存器中,后兩字節(段地址)傳送到DS段寄存器中。85取變量地址指令LDS例如:LDSSI,[DI+100AH]CS=1000H,IP=0604H,DS=2000H,DI=2400H,待傳送的某變量的地址指針,其偏移地址為0180H,段地址為2230H。執行結果:PA=DSx16+EA=20000H+2400H+100AH=2340AH將物理地址2340AH單元開始的4個字節中,前兩個字節(偏移地址)0180H傳送到SI寄存器中,后兩個字節(段地址)2230H傳送到DS寄存器中,并取代它的原值2000H。86取變量地址指令LESLESd,s;取某變量的32位地址指針的指令從源操作數所指定的存儲單元開始,由4個連續存儲單元中取出某變量的地址指針(共4個字節)。將前兩個字節(偏移地址)傳送到目標操作數所指定的16位通用寄存器中,后兩字節(段地址)傳送到ES段寄存器中。87取變量地址指令LES例如:LESDI,[BX]DS=B000H,BX=080AH,B080AH單元指定的存儲字為05A2H,B080CH單元指定的存儲字為4000H。執行結果:PA=DSx16+EA=B0000H+080AH=B080AH將物理地址B080AH單元開始的4個字節中,前兩個字節(偏移地址)05A2裝入DI,后兩個字節(段地址)4000H裝入ES,即DI=05A2H,ES=4000H。88四、標志位操作指令標志位傳送指令(4條):將FR低字節裝入AH寄存器:LAHF將AH內容裝入FR低字節:SAHF將FR內容壓入堆棧:PUSHF從堆棧彈出FR內容:POPF89標志位操作指令LAHF;將標志寄存器F的低字節傳送到AH寄存器中通過AH對標志寄存器的SF、ZF、AF、PF、CF標志位復位SAHF

;將AH寄存器內容傳送到標志寄存器F的低字節通過AH對標志寄存器的SF、ZF、AF、PF、CF標志位置位90標志位操作指令PUSHF

;將16位標志寄存器F內容入棧保護;POPF

;將當前棧頂和次棧頂中的數據字彈出;

送回標志寄存器中經常成對出現,用在子程序和中斷處理程序的首尾,用來保護和恢復主程序涉及的標志寄存器內容。必要時可用來修改標志寄存器內容。91算術運算類指令92算術運算類指令無符號/有符號、8/16位二進制數運算:加減乘除無符號壓縮型/非壓縮型十進制運算:十進制調整根據運算結果影響狀態標志,有時要利用某些標志才能得到正確的結果;使用時請留心有關狀態標志。共20條,分為5小類:加法(3條)減法(5條)乘法(2條)除法(4條)十進制調整(6條)93一、加法指令普通加法指令ADD

帶進位位的加法指令ADC加1指令INC加法指令對操作數的要求與MOV指令相同94ADD指令ADDd,s;d←d+s功能:源操作數和目的操作數相加,結果送到目的操作數。源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:目的操作數不能為立即數;源操作數和目的操作數不能同時為存儲器。95ADD指令例例1:ADD[BX+106BH],1234H設:CS=1000H,IP=0300H,DS=2000H,BX=1200H執行結果:EA=BX+106BH=226BHPA=DSx16+EA=2226BH將立即數1234H,與存儲器單元2226BH和2226CH中的3344H相加,和為4578H,結果保留在目的地址2226BH和2226CH單元中。運算結果影響標志位。96ADD指令例例2:寄存器加法。若將AX、BX、CX和DX內容累加,再將所得的16位的和數存入AX。程序為:ADDAX,BX;AX←AX+BXADDAX,CX;AX←AX+BX+CXADDAX,DX;AX←AX+BX+CX+DX97ADD指令例例3:立即數加法。常數和立即數相加時。若將立即數12H取入DL,然后用立即數加法指令再將34H加到DL中的12H上,所得的結果放在DL。程序為:MOVDL,12H;DL←12HADDDL,34H;DL←DL+34H98ADD指令例例4:存儲器與寄存器的加法。將存儲在數據段中,偏移地址為NUMB和NUMB+1連續單元的字節數據累加到AL。程序為:MOVDI,OFFSETNUMB;偏移地址NUMB裝入DIANDAL,0;AL清零ADDAL,[DI];將NUMB單元的字節內容加

上AL,和數存ALADDAL,[DI+1];累加NUMB+1單元中的字節

內容,累加結果存放在AL99ADD指令例例5:數組加法。存儲器數組是一個按順序排列的數據表。假定數據數組(ARRAY)包括從元素0到9共10個字節數。現要求累加元素3、元素5和元素7。程序為:MOVAL,0;存放和數的AL清0MOVSI,3;將SI指向元素3ADDAL,ARRAY[SI];加元素3ADDAL,ARRAY[SI+2];加元素5ADDAL,ARRAY[SI+4];加元素71002.ADC指令ADCd,s;d←d+s+CF功能:源操作數和目的操作數相加外,再加上進位標志CF,結果送到目的操作數。CF將重新根據結果置成新的狀態。ADC指令一般用于16位以上的多字節數字相加。例如:ADCAX,BX;AX=AX+BX+CADCBX,[BP+2];由BX+2尋址的堆棧段存儲單元的字內容,加上BX和進位位,結果存入BX。101ADC指令例例:假定實現BX與AX中4字節數據與DX和CX中4字節數據相加,其結果存入BX和AX中。程序為:ADDAX,CX;AX←AX+CXADCBX,DX;BX←BX+DX+CF1023.INC指令INCd;d←d+1功能:將目的操作數當作無符號數,加1后,結果送到目的操作數。目的操作數:8/16位通用寄存器,存儲器;但不允許為立即數。間接尋址的存儲器單元加1時,數據長度需用偽指令說明;INC指令只影響OF、SF、ZF、AF、PF5個標志,不影響CF。循環程序中,常用該指令對地址指針和循環計數值進行修改。103INC指令例例如:INCSP;SP=SP+1INCBYTEPTR[BX+1000H];將數據段中由BX+1000H尋址的存儲單元的字節內容加1;INCWORDPTR[SI];將數據段中由SI尋址的存儲單元的字內容加1INCDATA1;將數據段中DATA1存儲單元的內容加1104二、減法指令普通減法指令SUB考慮借位的減法指令SBB減1指令DEC比較指令CMP求補指令NEG減法指令對操作數的要求與對應的加法指令相同1051.SUB指令SUBd,s;d←d-s功能:目的操作數減去源操作數,結果送到目的操作數。源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:目的操作數不能為立即數;源操作數和目的操作數不能同時為存儲器。不允許進行段寄存器減法。106SUB指令例例:SUBAX,[BX],設:CS=1000H,IP=60C0H,DS=2000H,BX=970EH,AX=8811H執行結果:EA=BX=970EHPA=DSx16+EA=2970EH將AX寄存器中的目的操作數8811H,減去存儲器單元,2970EH和2970FH中的源操作數00FFH相減,結果8712H送回AX。運算結果影響標志位。1072.SBB指令SBBd,s;d←d–s–CF功能:目的操作數減去源操作數外,再減去進位標志位CF,結果送到目的操作數。CF將重新根據結果置成新的狀態。SBB指令一般用于16位以上的多字節數字相減。例如:SBBAX,BX;AX=AX-BX-CFSBBWORDPTR[DI],50A0H;由DI尋址的數據段存儲單元的內容,減去50A0H及CF值。108SBB指令例例:假定從存于BX和AX中的4字節數據,與存于DX和CX中4字節數據相減,其結果存入BX和AX中。程序為:SUBAX,CX;AX←AX-CX;SBBBX,DX;BX←BX-DX-CF。1093.DEC指令DECd;d←d-1功能:將目的操作數減1后,結果送到目的操作數。目的操作數:8/16位通用寄存器,存儲器;但不允許為立即數。間接尋址的存儲器單元減1時,數據長度需用TYPEPTR類型偽指令來標識數據長度。DEC指令只影響OF、SF、ZF、AF、PF5個標志,不影響CF。循環程序中,常用該指令對地址指針和循環計數值進行修改。110DEC指令例111例如:DECBL;BL=BL-1DECCX;CX=CX-1DECBYTEPTR[DI];由DI尋址的數據段中,字節

存儲單元的內容減1DECWORDPTR[BP];由BP尋址的堆棧段中,字

存儲單元的內容減14.NEG指令NEGd

;d←0-d功能:將目的操作數取負后,結果送到目的操作數。目的操作數:8/16位通用寄存器,存儲器;但不允許為立即數。NEG指令對標志的影響與用0作被減數的SUB指令一樣。但進位標志CF=1112NEG指令例例:NEGBYTEPTR[BX]設:CS=1000H,IP=200AH,DS=2000H,BX=3000HEA=BX=3000HPA=DSx16+EA=23000H假設23000H存儲單元內容為字節變量FDH即FDH=[-3]補則+3被送回物理地址23000H單元中。1135.CMP指令CMPd,s;d-s只置標志位功能:目的操作數減去源操作數,不送回結果。只根據運算結果置標志位。源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:目的操作數不能為立即數;源操作數和目的操作數不能同時為存儲器;不允許進行段寄存器比較。114CMP指令用途:用于比較兩個數的大小,可作為條件轉移指令轉移的條件指令對操作數的要求及對標志位的影響與SUB指令相同115CMP指令兩個無符號數的比較:

CMPAX,BX

若AX>BX若AX<BXCF=0CF=1116CMP指令兩個帶符號數的比較CMPAX,BX

兩個數的大小由OF和SF共同決定

OF和SF狀態相同AX>BX

OF和SF狀態不同AX<BX117CMP指令例例:CMPBL,CL;BL-CLCMPAX,SP;AX-SPCMPAX,1000H;AX-1000HCMP[DI],BL;由DI尋址的數據段存儲單元的字

節內容減BLCMPCL,[BP];由CL減由BP尋址的堆棧段存儲單

元的字節內容CMPSI,TEMP[BX];由SI減由TEMP+BX尋址的數據段

存儲單元的字118三、乘法指令無符號的乘法指令MUL*帶符號的乘法指令IMUL注意:乘法指令采用隱含尋址,隱含的是存放被乘數的累加器AL或AX及存放結果的AX,DX.1191.無符號數乘法指令120MULs

;無符號乘法指令功能:完成兩個無符號的8/16位二進制數相乘。被乘數:隱含在累加器AL/AX中乘數:指令中由s指定的源操作數;8/16位通用寄存器或存儲器操作數。積:相乘后得到雙倍長的積8位二進制數乘法:其16位積的高8位存于AH,低8

位存于AL;16位二進制數乘法:其32位積的高16位存于DX,低16位存于AX;無符號數乘法指令利用CF和OF標志可判斷相乘結果的高位字節或高位字是否有效:高位字節或高位字有效:即AH≠0或DX≠0,則將CF和OF兩標志位同時置1高位字節或高位字無效:即AH=0或DX=0,則將CF和OF兩標志位同時置0。121無符號數乘法指令例122例:MULBYTEPTR[BX+2AH]設:CS=3000H,IP=0250H,DS=2000H,BX=0234H,AL=12H,源操作數定義為字節變量66H。EA=BX+2AH=025EHPA=DSx16+EA=2025EH

被乘數:12H乘數:66H乘積:12Hx66H=072CHAH≠0,故CF=1,OF=1;其余標志為任意狀態。有符號數乘法指令IMULsrc;有符號乘法指令;功能:完成兩個帶符號的8/16位二進制數相乘。IMUL指令除計算對象為帶符號二進制數以外,其它都與MUL一樣的,但結果不同。IMUL指令對OF和CF影響:若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1。123有符號數乘法指令例例:IMULCL;AX←(AL)x(CL)IMULCX;DX、AX←(AX)x(CX)IMULBYTEPTR[BX];AX←(AL)x[BX];即AL中的、和BX所指內存單元中的兩個8位有符號數相乘,結果送AX中。IMULWORDPTR[DI];DX、AX←(AX)x[DI];即AX中的、和DI與DI+1所指內存單元中的兩個8位有符號數相乘,結果送DX和AX中。124四、除法指令無符號除法指令格式:DIVOPRD有符號除法指令格式:IDIVOPRD125無符號除法指令DIVsrc;無符號除法指令;功能:完成兩個無符號二進制數相除。被除數:隱含在累加器AX(字節除)或DX、AX(字除)中除數:指令中由s指定的源操作數8/16位通用寄存器或存儲器操作數商:字節除法-商存于AL中,余數存于AH中

字除法-商存于AX中,余數存于DX中余數:根據8086約定,余數符號應與被除數符號一致。126無符號除法指令若運算所得商數超出累加器容量,則系統將其當作除數為0處理,自動產生類型0中斷,CPU將轉去執行類型0中斷服務程序作適當處理,此時所得商數和余數均無效。類型0中斷處理時:

先將標志位進堆棧,IF和TF清零;

接著CS和IP的內容進堆棧;

然后將0,1兩單元內容填入IP,2,3兩單元內容填入CS;

最后,再進入0號中斷的處理程序。127無符號除法指令例例:DIVBYTEPTR[BX+SI]設:CS=1000H,IP=0406H,DS=3000H,BX=2000H,SI=050EH,AX=1500H,存儲器中的源操作數,定義為字節變量22H。EA=BX+SI=2000H+050EH=250EHPA=DSx16+EA=3250EH被除數:1500H除數:22H商:AL=9EH余數:AH=04H128有符號除法指令IDIVsrc;有符號除法指令;功能:完成兩個帶符號二進制數相除。與DIV指令主要區別:對符號位處理的約定。如果源操作數是字節/字數據:

被除數應為字/雙字數據,并隱含存放于AX/DX、AX中。

如被除數也是字節/字數據在AL/AX中,應將AL/AX的符號位(AL7)/(AX15)擴展到AH/DX中,才能開始字節/字除法運算。129有符號除法指令例例:IDIVBX;將DX和AX中的32位數,除以BX中的16位數,所得的商在AX中,余數在DX中。IDIVBYTEPTR[SI];將AX中的16位數,除以SI所指內存單元的8位數,所得的商在AL中,余數在AH中。130符號擴展指令CBW和CWD是兩條專門為IDIV指令設置的符號擴展指令。符號擴展是指用一個操作數的符號位(最高位)形成另一個操作數,后一個操作數的高位是全0(正數)或全1(負數)。符號擴展雖然使數據位數加長,但數據大小并沒有改變,擴展的高部分僅是低部分的符號擴展。符號擴展指令有兩條,用來將字節轉換為字,字轉換為雙字。

CBW;AL符號擴展成AXCWD;AX符號擴展成DX、AX131符號擴展指令例MOVAL,64H;AL=64H(機器數),表示10進制數100(真值)CBW;

將符號0擴展,AX=0064H,仍然表示100MOVAX0FF00H;AX=FF00H,表示有符號10進制數–256CWD;將符號位“1”擴展,DX.AX=FFFFFF00H;仍然表示–256132符號擴展指令例例如:在B1,B2,B3字節類型變量中,分別存有8位帶符號數a,b,c,實現,(a×b+c)/a運算。程序如下:MOVAL,B1;a→(AL)IMULB2;實現a×b→(AX)MOVCX,AX;(AX)→(CX)MOVAL,B3;C→(AL)CBW;擴展符號位至AH中ADDAX,CX;(AX)+(CX)→(AX),完成a×b+cIDIVB1;完成(a×b+c)/a,商→(AL),余數→(AH)133五、BCD碼調整指令134x—表示標志位為任意值?—表示運算結果不影響標志位1—表示標志位置1↑—表示運算結果影響標志位BCD碼調整指令對二進制運算的結果進行十進制調整,以得到十進制的運算結果,以此實現十進制BCD碼運算8086指令系統支持兩種BCD碼調整運算壓縮BCD碼:8421碼,用4個二進制位表示一個十進制位,一個字節可以表示兩個十進制位,即00~99非壓縮BCD碼:用8個二進制位表示一個十進制位,只用二進制的低4位表示一個十進制位0~9;高4位任意,通常默認為0135BCD碼調整指令前述的指令均為二進制數運算結果,即使參加運算的數是BCD數,其結果仍是二進制數運算所得的結果,而不是十進制數的應得結果。例如:8的BCD碼加5的BCD碼,結果為0DH,它不在0~9之間,也不是期望的結果13。因此,需要對結果進行BCD調整。顯然,未壓縮組合的十進制數中,每個字節存放一位BCD數,調整后,若有高位的進位(通常讓AF=1),不應在同一字節的高4位加1,而應該在高位字節(例如在AH中)加1。具體的調整操作由指令功能給出。136BCD碼調整指令真值(十進制)864二進制編碼08H40H壓縮BCD碼08H64H非壓縮BCD碼08H0604HASCII碼38H3634H137加法十進制調整指令DAADAA(DecimalAdjustforAddition);加法的十進制調整,它必須跟在ADD或ADC指令之后使用功能:將存于AL寄存器中的2位BCD碼加法運算的結果,調整為2位壓縮型十進制數,仍保留在AL中。138加法十進制調整指令DAA例例1:(AL)=18H,(BL)=06H

ADDAL,BL;(AL)←(AL)+(BL)

(AL)=1EHDAA;(AL)=24H,AF=1本指令影響標志位AF,CF,PF,SF,ZF。139加法十進制調整指令DAA例例2:設AX=6698H,BX=2877H,要將這兩個十進制數相加,結果保留在AX中。程序為:ADDAL,BL;低字節相加DAA;低字節調整MOVCL,AL;保存AL內容MOVAL,AHADCAL,BH;高字節相加DAA;高字節調整MOVAH,ALMOVAL,CL140減法十進制調整指令DASDAS

(DecimalAdjustforSubtraction);減法的十進制調整,它必須跟在SUB或SBB指令之后使用;功能:將存于AL寄存器中的減法運算的結果,調整為2位壓縮型十進制數,仍保留在AL中。141加法ASCII碼調整指令AAAAAA

(ASCIIAdjustforAddition);加法的ASCII碼調整指令,它必須跟在ADD和ADC指令之后使用;功能:將存于AL寄存器中的1位ASCII碼數加法運算的結果調整為1位非壓縮型十進制數,仍保留在AL中。只影響標志AF和CF142減法ASCII碼調整指令AASAAS

(ASCIIAdjustforSubtraction);減法的ASCII碼調整指令,它必須跟在SUB和SBB指令之后使用;功能:將存于AL寄存器中的減法運算的結果調整為1位非壓縮型十進制數,仍保留在AL中。如果有借位,則保留在借位標志CF中。只影響標志AF和CF143乘法ASCII碼調整指令AAMAAM

(ASCIIAdjustforMultiply);乘法的ASCII碼調整指令,跟在MUL指令之后。功能:將AL寄存器中的乘法運算的結果調整為2位非壓縮型十進制數,其高位AH中,低位在AL中。參加乘法運算的十進制數必須是非壓縮型,故通常在MUL指令之前安排兩條AND指令。程序為:ANDAL,0FHANDBL,0FHMULBLAAM144除法ASCII碼調整指令AADAAD

(ASCIIAdjustforDivison);除法的ASCII碼調整指令,在除法之前進行。功能:將AX寄存器中的2位非壓縮型十進制數的被除數,調整為二進制數,保留在AL中。例1:實現0103÷06=02余01。MOVAX,0103;取被除數MOVBL,06;取除數AAD;調整為(AX)=000DHDIVBL;相除,商(AL)=02,余數(AH)=01145邏輯運算和移位指令146指令類型邏輯運算(5條)移位(4條)循環(4條)147一、邏輯運算邏輯運算指令對操作數的要求大多與MOV指令相同。“非”運算指令要求操作數不能是立即數;除“非”運算指令外,其余指令的執行都會使標志位OF=CF=0148邏輯運算x——表示標志位為任意值?——表示運算結果不影響標志位1——表示標志位置1↑——表示運算結果影響標志位1491.“與”指令:ANDd,s;d←d∧s按位“與”操作源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:

目的操作數不能為立即數。

源操作數和目的操作數不能同時為存儲器。

影響SF,ZF,PF;OF,CF置00;AF無意義。

二者均為1,結果為1;否則為0。

用來對一個數據的指定位清零。150“與”指令的應用實現兩操作數按位相與的運算ANDBL,[SI]使目標操作數的某些位不變,某些位清零ANDAL,0FH在操作數不變的情況下使CF和OF清零ANDAX,AX151“與”指令例例1:ANDAX,ALPHA設:CS=2000H,IP=0400H,DS=1000H,AX=F0F0H,ALPHA是數據段中偏移地址為0500H和0501H地址中的字變量7788H的名字。EA=0500H;PA=DSx16+EA=10500H執行結果:AX中的F0F0H,與物理地址,10500H和10501H單元中數據字7788H,進行邏輯“與”,結果7080H送到AX寄存器中。152“與”指令例例2:對指定位清零。如將AL高4位清零,(AL)=3AH。ANDAL,0FH,結果:(AL)=0AH。153“與”指令應用例從地址為3F8H端口中讀入一個字節數,如果該數bit1位為1,則可從38FH端口將DATA為首地址的一個字輸出,否則就不能進行數據傳送。編寫相應的程序段。154“與”指令應用例開始取待輸出數的偏移地址讀入狀態字測試bit1位狀態Bit1=1?取輸入口地址取輸出口地址

輸出一個字NY155“與”指令應用例LEASI,DATAMOVDX,3F8HWATT:INAL,DXANDAL,02HJZWATT;ZF=1轉移MOVDX,38FHMOVAX,[SI]OUTDX,AX1562.“或”運算指令ORd,s;d←d∨s按位“或”操作源操作數:8/16位通用寄存器,存儲器,立即數

目的操作數:8/16位通用寄存器,存儲器提示:

目的操作數不能為立即數

源操作數和目的操作數不能同時為存儲器

影響SF,ZF,PF;OF,CF置0;AF無意義

二者均為0,結果為0;否則為1

用來對一個數據的指定位置1157“或”指令的應用實現兩操作數相“或”的運算ORAX,[DI]使某些位不變,某些位置“1”ORCL,0FH在不改變操作數的情況下使OF=CF=0ORAX,AX158“或”指令例例1:將AL最高位置1,(AL)=14HORAL,80H結果:(AL)=94H例2:將數字5轉換成ASCII形式;MOVAH,05HORAH,30H結果:(AH)=35H1593.“異或”運算指令XORd,s;d←d⊕s按位“異或”操作源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:

目的操作數不能為立即數

源操作數和目的操作數不能同時為存儲器

影響SF,ZF,PF;OF,CF置0;AF無意義

二者相反,結果為1;否則為0

用來使某個寄存器清零,如XORAX,AX160“異或”運算指令例例1:比較兩個操作數是否相同。如判斷AL中數據是否為3CH。XORAL,3CH結果:ZF=1,則(AL)=3CHZF=0,不等例2:將指定的數據變反,(AL)=3AH。XORAL,0FFH;結果:(AL)=C5H1614.“非”運算指令NOTd;d←0FFH/0FFFFH-d;求得操作數反碼后,再送回目的操作數;目的操作數:8/16位通用寄存器,存儲器提示:

目的操作數不能為立即數;

不影響標志位NOTAX相當于INCAXNEGAX(求補碼)162“非”運算指令例例1:NOTAH;其中(AH)=13H結果:(AH)=ECH例2:NOTWORDPTR[1000H];其中1000H和1001H單元中的16位數為2FC3H。結果:1000H和1001H單元中為D03CH1635.“測試”指令TESTd,s;d∧s按位“與”操作;不送回操作數,操作數不變源操作數:8/16位通用寄存器,存儲器,立即數目的操作數:8/16位通用寄存器,存儲器提示:

目的操作數不能為立即數;

源操作數和目的操作數不能同時為存儲器;

影響SF,ZF,PF;OF,CF置0;AF無意義

二者均為1,結果為1;否則為0

用來檢測指定位是1還是0164“測試”指令例例1:測試AL的最高位D7是否為1(即正數/負數)TESTAL,80H;結果:ZF=0,則AL最高位為1ZF=1,則AL最高位為0例2:測試(BX)所指存儲單元的最低位D0是否為1(即奇數/偶數);TEST[BX],01H;結果:ZF=0,則最低位為1ZF=1,則最低位為0165邏輯運算說明ANDBL,11110110BBL中D0和D3清0,其余位不變,ORBL,00001001BBL中D0和D3置1,其余位不變,XORBL,00001001BBL中D0和D3求反,其余位不變AND指令可用于復位某些位(同0相與),不影響其他位OR指令可用于置位某些位(同1相或),不影響其他位XOR指令可用于求反某些位(同1相異或),不影響其他位166二、移位指令非循環移位指令循環移位指令注:移動一位時由指令直接給出;移動兩位及以上,則移位次數由CL指定。1671.非循環移位指令168x—表示標志位為任意值↑—表示運算結果影響標志位非循環移位指令將操作數移動1

溫馨提示

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

評論

0/150

提交評論