微機原理與接口技術-第3章8086的尋址方式和指令系統_第1頁
微機原理與接口技術-第3章8086的尋址方式和指令系統_第2頁
微機原理與接口技術-第3章8086的尋址方式和指令系統_第3頁
微機原理與接口技術-第3章8086的尋址方式和指令系統_第4頁
微機原理與接口技術-第3章8086的尋址方式和指令系統_第5頁
已閱讀5頁,還剩226頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

微機原理與接口技術主講尹作友1第二章

內容回顧2第二章重點之一

8086CPU內部結構3目的變址寄存器DestinationIndexSIDIBPSPAX

累加器AccumulatorBX基址寄存器BaseCX

計數寄存器CountDX

數據寄存器DataAHBHCHDHALBLCLDLIPPSWDSESSSCS數據段寄存器DataSegment附加段寄存器ExtraSegment堆棧段寄存器StackSegment代碼段寄存器CodeSegment狀態標志寄存器ProcessorStatusWord指令指針寄存器InstructionPointer變址寄存器段寄存器控制寄存器通用寄存器源變址寄存器SourceIndex基址指針寄存器BasePoint堆棧指針寄存器StackPoint指針寄存器數據寄存器第二章重點之二4第二章重點之三邏輯地址的組成——段基址:偏移地址物理地址的形成——段基址×16+偏移地址段基址00001503210偏移地址150地址加法器物理地址190存儲器的分段管理5第二章重點之四堆棧的概念及工作過程6第三章8086的尋址方式和指令系統8086的尋址方式微機系統指令的機器碼表示方法8086的指令系統內容提要7§3-18086的尋址方式概述

§3-18086的尋址方式——概述

計算機的指令包括:操作碼

操作數

↓操作的性質操作的對象

↓存放在

寄存器、存儲器、I/O端口地址、立即數(由尋址方式決定)尋址方式:指令中說明操作數所在地址的方法。指令分類:單操作數、雙操作數、無操作數。(雙操作數指令形式:操作碼目的操作數,源操作數)8§3-18086的尋址方式——概述

各種尋址方式指令執行速度不同:

操作數在寄存器中指令執行速度快:在CPU內部立即執行;

立即數尋址指令執行速度較快:直接從指令隊列中取數;

操作數在存儲器中指令執行速度較慢:通過總線與CPU交換數據。CPU進行讀/寫存儲器的操作:①把一個偏移量送到BIU,計算出20位物理地址;②執行總線周期存取操作數。9§3-18086的尋址方式——概述

尋址方式舉例:10§3-18086的尋址方式——概述

8086指令的尋址方式類型:一、立即尋址方式二、寄存器尋址方式三、直接尋址方式四、寄存器間接尋址方式五、寄存器相對尋址方式六、基址變址尋址方式七、相對基址變址尋址方式八、其它11§3-18086的尋址方式——立即尋址方式

一、立即尋址方式(ImmediateAddressing)

1.含義:操作數是立即數(即8位或16位的常數),直接包含在指令中。2.特點:翻譯成機器碼時,立即數是指令的一部分,緊跟在操作碼之后存放在代碼段內。在取出指令的同時也就取出了操作數,立即有操作數可用,所以稱之為立即尋址。

l6位數:高字節→代碼段的高地址單元,低字節→低地址單元;3.作用:常用于給寄存器賦初值。12§3-18086的尋址方式——立即尋址方式

例MOVCX,2A50H解:將立即數2A50H送到CX寄存器中。(又例:MOVCL,20H)4.注意:①立即數可以送到寄存器、一個存儲單元(8位)、兩個連續的存儲單元(16位)中去;②立即數只能作源操作數,不能作目的操作數;③以A~F打頭的數字出現在指令中時,前面必須加數字0。以免與其它符號相混淆(如:0AF22H)。MOVCX,2A50H13§3-18086的尋址方式——寄存器尋址方式

二、寄存器尋址方式(RegisterAddressing)

1.含義:操作數包含在寄存器中,寄存器的名稱由指令指定。2.特點:16位操作數:寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。8位操作數:寄存器AH、AL、BH、BL、CH、CL、DH和DL。3.作用:寄存器之間傳遞數據。例MOVDX,AX

解:(AX)送到CX寄存器中。(AX內容不變)(又例:MOVBL,AL)4.注意:源操作數的長度必須與目的操作數—致。(注:以下尋址方式下,指令的操作數在存儲器中,要先求物理地址才能獲得操作數。)

14§3-18086的尋址方式——直接尋址方式三、直接尋址方式(DirectAddressing)

1.含義:

存儲單元的有效地址EA(即:操作數的偏移地址)直接由指令給出。

2.特點:機器碼中,有效地址存放在代碼段中指令的操作碼之后,而該地址單元中的數據總是存放在存儲器中。須先求出操作數的物理地址,再從存儲器中取得操作數。操作數的物理地址=16×DS+EA3.作用:實現對存儲單元的讀/寫操作。

15§3-18086的尋址方式——直接尋址方式

例MOVAX,[2000H]解:設DS=3000H;設:(32000H)=1234H由指令得:EA=2000H(16位邏輯地址)物理地址=16×3000H+2000H=32000H(20位,20根地址線)則:AX=1234H指令執行過程如圖所示。(注:如用AL替代AX,則AL=34H)16§3-18086的尋址方式——直接尋址方式

2.段超越前綴MOV AX, ES:[500H]3.符號地址AREA1 EQU 0867H……MOV AX, AREA1等價為MOV AX, [AREA1]17§3-18086的尋址方式——寄存器間接尋址方式四、寄存器間接尋址方式(RegisterIndirectAddressing)1.含義:操作數的有效地址放在寄存器中。2.特點:使用寄存器:基址寄存器BX、BP,變址寄存器SI、DI。操作數的物理地址=16×DS+BX/SI/DI或=16×SS+BP3.作用:有效地址可以存放在寄存器中。

18§3-18086的尋址方式——寄存器間接尋址方式例MOVBX,[SI]解:設:DS=1000H,SI=2000H,(12000H)=318BH則:物理地址=16×DS+SI=10000H+2000H=12000H指令執行后,BX=318BH,指令執行過程如圖所示。19

4.注意:▲寄存器名稱外必須加方括號,以區別寄存器尋址方式;▲段超越前綴來從默認段以外的段中取得數據;例MOVBX,ES:[SI]▲關于默認段:指定寄存器BX、SI或DI,默認操作數存放在數據段DS中;(DS:BX,SI,DI)

指定寄存器BP,默認操作數存放在數據段SS中;(SS:BP)

§3-18086的尋址方式——寄存器間接尋址方式20§3-18086的尋址方式——寄存器相對尋址方式五、寄存器相對尋址方式(RegisterRelativeAddressing)

1.含義:操作數的有效地址是基址或變址寄存器的內容與8位或16位位移量(Displacement)之和。即[BX]/[BP]EA=+8位偏移量/16位偏移量[SI]/[DI]2.特點:使用:BX、BP、SI、DI。操作數的物理地址=16×DS+BX/SI/DI+COUNT或=16×SS+BP+COUNT

21§3-18086的尋址方式——寄存器相對尋址方式例MOVBX,COUNT[SI];或:MOVBX,[COUNT+SI]解:設:DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=318BH則:物理地址=16×DS+SI+COUNT=30000H+2000H+4000H=36000H指令執行后,BX=318BH40300022

3.注意:▲寄存器名稱外必須加方括號,位移量可以在括號內,也可以在括號外;▲段超越前綴來從默認段以外的段中取得數據;例MOVDH,ES:ARRAY[SI]▲關于默認段:指定寄存器BX、SI或DI,默認操作數存放在數據段DS中;(DS:BX,SI,DI)

指定寄存器BP,默認操作數存放在數據段SS中;

(SS:BP)

§3-18086的尋址方式——寄存器相對尋址方式23§3-18086的尋址方式——基址變址尋址方式六、基址變址尋址方式(RegisterRelativeAddressing)1.含義:操作數的有效地址是一個基址寄存器(BX、BP)的內容與一個變址寄存器(SI、DI)的內容之和。2.特點:使用的寄存器:基址寄存器BX、BP,變址寄存器SI、DI操作數的物理地址=16×DS+BX+SI/DI或=16×SS+BP+SI/DI3.注意:▲寄存器SI和DI、BP和BX不能同時出現在[]中。24§3-18086的尋址方式——基址變址尋址方式例MOVAX,[BX]

[SI];或:MOVBX,[BX+SI]解:設:DS=3000H,SI=0500H,BX=1200H,(31700H)=0ABCDH則:物理地址=16×DS+SI+BX=30000H+0500H+1200H=31700H指令執行后,AX=0ABCDH25§3-18086的尋址方式——相對基址變址尋址方式七、相對基址變址尋址方式(RelativeBasedIndexedAddressing)

1.含義:操作數的有效地址是一個基址寄存器(BX、BP)和一個變址寄存器(SI、DI)的內容,再加上8位或16位位移量之和。即EA=[BX]或[BP]+[SI]或[DI]+8或16位移量2.特點:使用的寄存器:基址寄存器BX、BP,變址寄存器SI、DI操作數的物理地址=16×DS+BX+SI/DI+8/16位位移量或=16×SS+BP+SI/DI+8/16位位移量3.注意:存器SI和DI、BP和BX不能同時出現在[]中26§3-18086的尋址方式——相對基址變址尋址方式例MOVAX,MASK[BX]

[SI];或:MOVBX,[MASK+BX+SI]解:設:DS=3000H,SI=0300H,BX=1500H,MASK=0200H,(21A00H)=26BFH則:物理地址=16×DS+SI+BX+MASK=20000H+0300H+1500H+0200H=21A00H指令執行后,AX=26BFH27§3-18086的尋址方式——尋址方式總結

尋址方式總結:▲帶方括號的地址表達式必須遵循下列規則:1.立即數可以出現在方括號內,表示直接地址,如[2000H]。2.只有BX、BP、SI、DI這四個寄存器可以出現在[]內,它們可以單獨出現,也可以相加,或與常數相加,但:BX和BP寄存器、SI和DI寄存器不允許出現在同一個[]內。

3.方括號表示相加,下面幾種寫法等價:6[BX][SI];[BX+6][SI];[BX+SI+6]28§3-18086的尋址方式——尋址方式總結4.不同寄存器對應不同的隱含段基址:SS:BP;DS:BX,SI,DI;物理地址=16×相應段基址+EAEA=BX/BP+SI/DI+DISP(注:可以是單一寄存器、兩個寄存器組合、和DISP組合;DISP也可以為0)▲可用段超越前綴修改段基址。29§3-18086的尋址方式——其它八、其它1.隱含尋址:指令中不指明操作數,但有隱含規定的尋址方式。如:指令DAA;對寄存器AL中的數據進行十進制數調整,結果仍保留在AL中。2.I/O端口尋址:8086有直接端口和間接端口兩種尋址方式。

▲直接端口尋址方式:指令直接提供端口地址——8位立即數。可訪問端口00~FFH,即256個端口。例如,INAL,63H;表示將瑞口63H中的內容送進AL寄存器

30§3-18086的尋址方式——其它

▲間接端口尋址方式:端口地址由寄存器DX提供,端口號為0000—FFFFH。例如,MOV DX,213H ;DX=口地址號213HINAL,DX;AL←端口213H中的內容3.一條指令有多種尋址方式:源操作數和目的操作數同樣適用上述尋址方法。例MOV[BX],AL解:設:BX=3600H,DS=1000H,AL=05H則:目的操作數的物理地址=16×DS+BX=10000H十3600H=13600H指令執行結果為(13600H)=05H。313.DS=1000H,ES=2000H,SS=3500H,SI=00A0H,DI=0024H,BX=0100H,BP=0200H,AL=0030H(1)MOVAX, [100H]直接尋址方式,10100H

物理地址=DS×10H+100H=10000H+0100H=10100H(2)MOVAX, VAL直接尋址方式,10030H

物理地址=DS×10H+VAL=10000H+0030H=10030H

(3)MOVAX, [BX]寄存器間接尋址,10100H

物理地址=DS×10H+BX=10000H+0100H=10100H(4)MOVAX, ES:[BX]寄存器間接尋址,20100H

物理地址=ES×10H+BX=20000H+0100H=20100H2/3/2023(5)MOVAX, [SI]寄存器間接尋址,100A0H物理地址=DS×10H+SI=10000H+00A0H=100A0H(6)MOVAX, [BX+10H]寄存器相對尋址,10110H物理地址=DS×10H+BX+10H=10000H+0100H+10H=10110H(7)MOVAX, [BP]寄存器間接尋址,35200H物理地址=SS×10H+BP=35000H+0200H=35200H33(8)MOVAX, VAL[BP][SI] 相對基址變址尋址,352D0H物理地址=SS×10H+BP+SI+VAL=35000H+0200H+00A0H+0030H=352D0H(9)MOVAX, VAL[BX][DI] 相對基址變址尋址,10154H物理地址=DS×10H+BX+DI+VAL=10000H+0100H+0024H+0030H=10154H(10)MOVAX, [BP][DI] 基址變址尋址,35224H物理地址=SS×10H+BP+DI=35000H+0200H+0024H=35224H2/3/2023§3-2指令的機器碼表示方法一、機器語言指令的編碼目的和特點§3-2指令的機器碼表示方法——目的和特點

匯編語言源程序:用匯編語言(即主要由指令系統組成的語言)編寫的程序。編譯程序執行源程序機器碼運算結果指令通常由操作碼和操作數兩部分組成。▲8086指令系統采用變長指令,指令的長度可由1~6字節組成。35§3-2指令的機器碼表示方法——指令代碼的編制

二、機器語言指令代碼的編制(自學)其中,第一個字節:▲高6位是操作碼100010;▲W位說明傳遞數據的類型是字(W=l)還是字節(W=0);▲D位標明數據傳送的方向:D=0,數據從寄存器傳出;D=1,數據傳至寄存器;1.編碼格式說明(MOV指令為例):

15876543210100010DWMODREGR/M 操作碼36§3-2指令的機器碼表示方法——指令代碼的編制

第二個字節:▲REG字段:寄存器號,用3位編碼尋址8種不同的寄存器,再根據第一字節中W位,選擇8位或16位寄存器。如表3-l所示。(對段寄存器,REG字段占2位)

例如:REG=010,W=1時表示尋址DX寄存器;REG=010,W=0時尋址DL寄存器。37§3-2指令的機器碼表示方法——指令代碼的編制

▲MOD字段和R/M字段:MOV指令的兩個操作數中有一個必為寄存器,另一個操作數可能是寄存器,也可能是存儲器單元,由指令代碼的第二個字節個的MOD和R/M字段指定。如表3-2所示。(24種不同的編碼格式,D8表示8位位移量,D16為16位位移量)對指令進行編碼時,若包含8位位移量,則在編碼后增加一個宇節存放位移量disp-L;若包含16位的位移量,則增加2個字節存放位移量:第3個字節存放位移量的低字節disp-L,第4個字節存放位移量高字節disp-H。38§3-2指令的機器碼表示方法——指令代碼的編制

對MOV指令進行編碼的幾個示例:2.寄存器間傳送指令的編碼:

例求指令MOVSP,BX的機器碼

解:指令的功能是將BX寄存器的內容送到SP寄存器中。從附錄B可知,該指令的操作碼為1000l0;傳送的是字數據,所以w=1;

REG字段:選擇將SP,則REG字段編碼=100;

D位=1,表示數據傳至所選的寄存器(SP);MOD=11,因另一個操作數BX也是寄存器。從表3-2查得R/M=011。根據W=l及寄存器名稱為BX,求得指令編碼。39§3-2指令的機器碼表示方法——指令代碼的編制

3.寄存器與存儲器間傳送指令的編碼

例:求指令MOVCL,[BX+l234H]的機器碼。解:功能:將有效地址為(BX+1234H)存儲單元中的數據字節傳送到CL寄存器中;指令的編碼如圖3-10中所示。第1、2字節可通過查表得到;第3字節存放l6位位移量的低字節34H;第4字節存放高字節12H。所以該指令的編碼為8A8F3412H。40§3-2指令的機器碼表示方法——指令代碼的編制

4.立即數尋址指令的編碼立即數尋址的指令:操作碼+1~2個字節用于存放立即數據。

例求指令MOV[BX十2100H],0FA50H的機器碼。解:指令的功能:將16位立即數FA50H送到有效地址為(BX+2100H)的字存儲單元中;指令編碼如圖3-11中所示;其中:低字節50H送列〔BX+2100H〕單元,高字節FAH送到(BX+2101H)單元;指令中不但有16位立即數,還有16位位移量;該指令的6字節編碼為:C787002150FA。41§3-2指令的機器碼表示方法——指令代碼的編制

5.包含段寄存器的指令的編碼含有段寄存器的指令,寄存器字段REG占有2位,從表3-1可得,相應的編碼為:CS=01,DS=11,ES=00,SS=l0。例求指今MOVDS,AX的機器碼。解:指令功能:將AX寄存器的內容傳送到數據段寄存器DS;從附錄B中查到該指令的編碼格式為:10001110MOD0REGR/M;段寄存器DS的編碼為11,即REG字段為11;另一個操作數也是寄存器,所以MOD=11,而R/M字段應填上AX的三位代碼000;得到該指令的編碼為:8ED8H。

42§3-2指令的機器碼表示方法——指令代碼的編制

6.段超越前綴指令的編碼該類指令進行編碼時,在指令代碼前加一個8位的段超越的綴代碼,代碼的格式為001××110,其中××位表明段超越寄存器,編碼與上面列出的相同。

例若指令MOV[BX],DL的編碼為8817H,試求指令MOVCS:[BX],DL的代碼。解:該指令的編碼是在不帶段超越前綴的指令代碼8817H前,加上一個字節001××110。由于段寄存器CS的代碼為01,所以指令的第1個字節的編碼為00101110,即2EH。

可得到該指令的機器碼為2E8817H43上次課內容回顧及問題:1.指令系統的尋找方式有哪些?2.哪些尋址方式與存儲單元有關?3.這些尋址方式哪種較快?4.源操作數和目標操作數數據類型有什么要求?指令編碼部分(自學),上機時總結。44§3-38086的指令系統§3-38086的指令系統

——

分類

分為以下六類:

數據傳送指令

算術運算指令

邏輯運算和移位指令

字符串處理指令

控制轉移指令

處理器控制指令45一、數據傳送指令注:◎數據傳送指令共14條;◎除SAHF和POPF指令外,對標志位均沒有影響。§3-38086的指令系統

——數據傳送指令

通用數據傳送指令MOVPUSHPOPXCHGXLAT字節或字的傳送入棧指令出棧指令交換字或字節表轉換輸入輸出指令INOUT輸入輸出地址目標傳送指令LEALDSLES裝入有效地址裝入數據段寄存器裝入堆棧段寄存器標志傳送指令LAHFSAHFPUSHFPOPF標志寄存器低字節裝入AHAH內容裝入標志寄存器低字節標志寄存器入棧指令出棧,并送入標志寄存器重點掌握的指令:MOV、PUSH、POP、XCHG、XLAT、IN、OUT、LEA461.通用數據傳送指令(GeneralPurposeDataTranfer):§3-38086的指令系統

——數據傳送指令

⑴MOV傳送指令(Move)

指令格式:MOV目的,源指令功能:實現CPU的內部寄存器間或寄存器與存儲器間的數據傳送。例:MOVAX,0FF00H;MOV[DI],AX;MOVCX,[1000H];MOVBL,40MOVWORDPTR[SI],01H;MOVAL,BL;47§3-38086的指令系統

——數據傳送指令

注意:▲指令中至少要有—項明確說明傳送的是字節還是字;▲IP寄存器不能用作源操作數或目的操作數;▲立即數和CS寄存器不能用作目的操作數;▲除了源操作數為立即數的情況外,兩個操作數中必有一個是寄存器,但不能都是段寄存器;這就是說,MOV指令不能在兩個存儲單元之間直接傳送數據,也不能在兩個段寄存器之間直接傳送數據。48▲所謂“傳送”,實值是復制,把的內容復制到目的操作數,源操作數內容不變。▲目的操作數和源操作數不能同時為內存單元。▲目的操作數和源操作數不能同時為段寄存器。▲目的操作數為段寄存器時,源操作數不能為立即數。對段寄存器賦值必須通過通用寄存器作中介。§3-38086的指令系統

——數據傳送指令

這些注意事項基本適合所有指令49§3-38086的指令系統

——數據傳送指令

CS一般不為目標操作數50§3-38086的指令系統

——數據傳送指令

通常,數據通常存放在數據段中。例如,某個程序的數據段:

DATA SEGMENT ;數據段開始AREA1 DB14H,3BH;定義字節變量AREA2 DB3DUP(0);復制操作ARRAY DW3l00H,01A6H;定義字變量STRING DB‘GOOD’

DATA ENDS;數據段結束

匯編后,DATA將被賦予一個具體的段地址。各變量將自偏移地址0000H開始依次存放,各符號地址等于它們在數據段中的偏移量。51AREA1的偏移地址為0000H,AREA2的偏移地址為0002H,ARRAY的偏移地址為0005H,STRING的偏移地址為0009H。§3-38086的指令系統

——數據傳送指令

數據段開始52§3-38086的指令系統

——數據傳送指令

例MOVDX,OFFSETARRAY解:ARRAY的偏移地址DX。(OFFSET:取后面的符號偏移地址的值)設:ARRAY的定義如上圖所示則:DX=0005H例MOVAL,AREA1 ;ALAREA1中的內容14H

MOVAREA2,AL ;0002H單元14H

例MOVAX,TABLE[BP][DI]解:將地址為l6×SS+BP+DI+TABLE的字存儲單元中的內容送進AX。53

§3-38086的指令系統

——數據傳送指令

⑵PUSH進棧指令

指令格式:PUSH源

指令功能:數據入堆棧

工作過程:SP←SP-2;(SP+1,SP)←源源操作數要求:可以是16位通用寄存器、段寄存器、存儲器中的數據字,但不能是立即數。

…最后一項高地址棧底(SP)壓入彈出棧頂(SS)最大容量64KSP總是指向偶地址單元段址54⑶POP出棧指令指令格式:POP目的指令功能:數據出堆棧

工作過程:目的←(SP+1,SP);SP←SP+2;目的操作數要求:可以是16位通用寄存器、段寄存器、存儲單元,但CS不能作目的操作數。…最后一項高地址棧底(SP)壓入彈出棧頂(SS)最大容量64KSP總是指向偶地址單元段址§3-38086的指令系統

——數據傳送指令

5556

§3-38086的指令系統

——數據傳送指令

⑷XCHG交換指令(Exchange)

指令格式:XCHG目的,源

指令功能:源操作數、目的操作數數據交換。操作數要求:交換可以在寄存器之間、寄存器與存儲器之間進行;段寄存器不能作為操作數;不能直接交換兩個存儲單元中的內容。例

設AX=2000H,DS=3000H,BX=1800H,(3lA00H)=1995H。則執行指令XCHGAX,[BX+200H]后,結果如何?解:把內存中的一個字與AX中的內容進行交換。源操作數的物理地址=3000H×10H十1800H十200H=31A00H,指令執行后:AX=1995H,(3lA00H)=2000H57

§3-38086的指令系統

——數據傳送指令

指令格式:XLAT轉換表或:XLAT指令功能:

使累加器(AL)中的一個值變換為內存表格中的某一個值,一般用來實現編碼制的轉換,即查表功能。XLAT指令使用步驟:使用之前必須先建立一個表格,表格中的內容是所需要轉換的代碼;將轉換表的起始地址裝入BX寄存器;欲查的某項與表頭地址的位移量AL,即表格最多包含256個字節;執行XLAT指令后,根據位移量從表中查到轉換后的代碼值AL寄存器中。⑸XLAT表轉換指令(TableLookup—Translation)58

§3-38086的指令系統

——數據傳送指令

例若十進制數字0~9的LED七段碼對照表如下表所示,試用XLAT指令求數字5的七段碼值。解:程序如下:

TABELDB40H,79H,24H,30H,19H;建表,表格起始地址為TABLEDB12H,02H,78H,00H,18H ;七段碼存于對TABLE的;位移量為0~9的單元位移 ……………MOV AL,5 ;AL數字5的位移量MOV BX,OFFSETTABLE ;BX表格首地址XLATTABLE ;查表得:AL=12H十進制數字七段顯示碼十進制數字七段顯示碼040H512H179H602H224H778H330H800H419H918H59下列指令是否合法?XCHGBX,[BP+SI]XCHGAL,BHPOPCSPUSH1234HMOV[SI],[2000H]MOVCS,BXMOV2000H,AXMOVSI,

[SI+6]§3-38086的指令系統

——數據傳送指令

60MOV[BX],20H在MASM5.0下編譯,報錯,必須指明數據大小,8位/16位。在MASM6.11下編譯,無錯,匯編程序編譯時自動識別為MOVWORDPTR[BX],20HMOV[BX],200H在MASM5.0和MASM6.11下編譯,均無錯,匯編程序編譯時自動識別為MOVWORDPTR[BX],200H§3-38086的指令系統

——數據傳送指令

61

§3-38086的指令系統

——數據傳送指令

2.輸入輸出指令(InputandOutput):IN指令:指定端口中的數據→累加器OUT指令:累加器中的數據→指定端口⑴IN輸入指令(Input)

指令格式:①INAL,端口地址;端口地址(00~FFH)直接包含在IN指令里,或INAX,端口地址;共允許尋址256個端口。

直接尋址②INAL,DX;端口地址>0FFH時,先將端口號送DX寄存器,再執行輸入操作。或INAX,DX;共允許尋址64K個端口。

間接尋址指令功能:從8位端口讀入一個字節到AL寄存器,或從16位端口讀一個字到AX寄存器。62§3-38086的指令系統

——數據傳送指令

注意:

16位端口由兩個地址連續的8位端口組成。

16位端口輸入:先將給定端口中的字節送進AL;再把端口地址加1,然后將該端口中的字節讀入AH。例INAL,0F1H;AL從F1H端口讀入一個字節INAX,80H ;AL80H口的內容,AH81H口的內容MOVDX,310H ;端口地址310H先送入DX中INAL,DX;AL310H端口的內容

63§3-38086的指令系統

——數據傳送指令

⑵OUT輸出指令(Output)指令格式:

①OUT端口地址,AL;端口地址(00~FFH)直接包含在IN指令里,

或OUT端口地址,AX;共允許尋址256個端口。

直接尋址

②OUTDX,AL;端口地址>0FFH時,先將端口號送DX寄存器,再執行輸出操作。

或OUTDX,AX;當共允許尋址64K個端口。

間接尋址指令功能:

將AL中的一個字節寫到一個8位端口,或把AX中的一個字寫到一個16位端口。注意:對16位端口進行輸出操作時,是對兩個連續的8位端口進行輸出操作。64§3-38086的指令系統

——數據傳送指令

例OUT85H,AL ;85H端口AL內容

MOVDX,0FF4H ;端口地址DX=0FF4H OUTDX,AL ;0FF4H端口AL內容MOVDX,300H ;DX指向300HOUTDX,AX ;300H端口AL內容,301H端口AH內容653.地址目標傳送指令(AddressObjectTransfers):§3-38086的指令系統

——數據傳送指令

共三條指令:傳送地址碼。可傳送操作數的段地址和偏移地址。⑴LEA取有效地址指令(LoadEffectiveAddress)指令格式:LEA目的,源指令功能:源操作數地址的偏移量→目的操作數所在寄存器要求:

源操作數:必須是存儲單元;

目的操作數:必須是一個除段寄存器之外的16位寄存器。注意:與MOV指令的區別。66§3-38086的指令系統

——數據傳送指令

例假設SI=1000H,DS=5000H,(51000H)=1234H

LEABX,[SI] ;執行完該指令后,BX=l000H

MOVBX,[SI] ;執行完該指令后,BX=1234H例LEABX,TABLE ;可用MOV指令代替LEA指令

MOVBX,OFFSETTABLE ;兩條指令等價。

例某數組含20個元素,每個元素占一個字節,符號為:0~19。設DI指向數組開頭處,把序號為6的元素的偏移地址送到BX中,用什么指令來實現?解:LEABX,6[DI] ;只能用LEA實現,不能用MOV67§3-38086的指令系統

——數據傳送指令

⑵LDS將雙字指針送到寄存器和DS指令(LoadPointerusingDS)指令格式:LDS 目的,源指令功能:源操作數指定的存儲單元中的4字節地址指針→一對目的寄存器。其中:前兩個字節(偏移地址)→指定的目的寄存器;(常用SI寄存器)后兩個字節(段地址)→DS寄存器。操作數要求:源操作數:必須是存儲單元(該單元開始的連續4個字節存放一個變量的地址指針);目的操作數:必須是16位寄存器,常用SI寄存器,但不能用段寄存器。68例設:DS=1200H,(12450H)=0F346H,(12452H)=0A90H。執行指令LDSSI,[450H]后,結果如何?解:SI=0F346H,DS=0A90H§3-38086的指令系統

——數據傳送指令

69§3-38086的指令系統

——數據傳送指令

⑶LES將雙字指針送到寄存器和ES指令(LoadPointerusingES)指令格式:LES 目的,源指令功能:源操作數指定的存儲單元中的4字節地址指針→一對目的寄存器。其中:前兩個字節(偏移地址)→指定的目的寄存器;(常用DI寄存器)后兩個字節(段地址)→ES寄存器。例設:DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。執行指令LESDI,[BX]后,結果如何?解:DI=0300H,ES=0500H704.標志傳送指令(FlagTransfers):§3-38086的指令系統

——數據傳送指令

讀取標志指令:LAHF(5、3、0為任意值)--標志寄存器低8位→AH設置標志指令:SAHF--標志寄存器低8位←AH把標志寄存器的內容壓入堆棧:PUSHF從堆棧彈出到標志寄存器:POPF1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0參見“處理器控制命令”71§3-38086的指令系統

——數據傳送指令

⑴LAHF標志送到AH指令(LoadAHfromFlag)指令格式:LAHF指令功能:標志寄存器SF、ZF、AF、PF和CF

AH寄存器的位7、6、4、2和0。注意:◎位5、3、1的內容未定義,是任意值。◎執行這條指令后,標志位本身并不受影響。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D072§3-38086的指令系統

——數據傳送指令

⑵SAHFAH送標志寄存器(StoreAHintoFlags)

指令格式:SAHF指令功能:AH內容

→標志寄存器。注意:◎位5、3、1的內容未定義,是任意值。◎執行這條指令后,高位標志并不受影響。

1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D073§3-38086的指令系統

——數據傳送指令

⑶PUSHF標志入棧指令(PushFlagontoStack)指令格式:PUSHF指令功能:整個標志寄存器的內容

堆棧;修改堆棧指針,使SPSP-2;指令執行后對標志位無影響。⑷POPF標志出棧指令(PopFlagoffStack)指令格式:POPF指令功能:堆棧指針SP所指的一個字

標志寄存器PSW;修改堆棧指針,使SPSP+2。注意:▲要成對使用PUSHF和POPF,可對標志寄存器進行保存和恢復。▲常用在:過程(子程序)調用,中斷服務程序,對主程序的狀態(即標志位)進行保護。▲也可用來改變追蹤標志TF。在8086指令系統中沒有直接改變TF(D8位)的指令。74§3-38086的指令系統

——算術運算指令二、算術運算概述:算術運算指令可處理4種類型的數無符號二進制整數帶符號二進制整數指令無符號壓縮十進制整數(PackedDecimal)無符號非壓縮十進制整數(UnpackedDecimal)

一個8位二進制數可看成4種不同類型的數,所表示的數值亦不同。75§3-38086的指令系統

——算術運算指令數的表示:二進制數:可以是8位或16位,若是帶符號數,則用補碼表示。壓縮十進制數:一個字節中存放兩個BCD碼十進制數。非壓縮十進制數:—個字節的低半字節存放十進制數,高半字節為全零。例如,對十進制數字58:壓縮十進制數表示:只需一個字節,即01011000B;非壓縮十進制數表示:需兩個字節,即00000101B

和00001000B。4種數的類型的表示方法如下:二進制碼(B)十六進制(H)無符號二進制(D)帶符號二進制(D)非壓縮十進制壓縮十進制00000111077+77071000100189137-119無效8911000101C5197-59無效無效76§3-38086的指令系統

——算術運算指令注意:算術運算指令處理的數都必須是有效的,否則會導致錯誤的結果。8086/8088指令系統提供:加、減、乘、除四種基本運算指令:處理無符號或帶符號的8位/16位二進制數的算術運算;調整操作指令:進行壓縮的或非壓縮的十進制數的算術運算;絕大部分算術運算指令都影響狀態標志位。加法和減法運算指令:帶符號數和無符號數的加法和減法的運算可以用同一條加法或減法指令來完成。乘法和除法運算:分別設置不同乘、除法指令。77§3-38086的指令系統

——算術運算指令算術運算指令的種類:加法ADDADCINCAAADAA加法帶進位的加法增量加法的ASCII調整加法的十進制調整減法SUBSBBDECNEGCMPAASDAS減法帶借位的減法減量取補比較減法的ASCII調整減法的十進制調整乘法MULIMULAAM無符號數乘法整數乘法乘法的ASCII調整除法DIVIDIVAADCBWCWD無符號數除法整數除法除法的ASCII調整把字節轉換成字把字轉換成雙字781.加法指令(Addition)⑴ADD加法指令(Addition)指令格式:ADD目的,源指令功能:目的源十目的⑵ADC帶進位的加法指令(AdditionwithCarry)指令格式:ADC目的,源指令功能:目的源十目的十CF操作數的要求:(包括上兩條指令)源操作數:可以是寄存器、存儲器、立即數;目的操作數:只能用寄存器、存儲單元。注意:★源、目的操作數不能同時為存儲器,且類型必須一致,即都是字節或字;★這兩條指令影響的標志位為:CF、OF、PF、SF、ZF和AF。§3-38086的指令系統

——算術運算指令79§3-38086的指令系統

——算術運算指令

例兩種加法指令的實例ADDAL,18H ;ALAL十18HADCBL,CL ;BLBL十CL十CFADCAX,DX ;AXAX十DX十CFADDAL,COST[BX];AL內容和地址=DS:(COST+BX)的存儲字節相加,結果送AL.ADDCOST[BX],BL ;將BL與物理地址=DS:(COST十BX)的存儲字節相加,結果留在該存儲單元中.例用加法指令對兩個8位16進制數5EH和3CH求和,并分析加法運算指令執行后對標志位的影響。解:MOVAL,5EH ;AL=5EH(94)MOVBL,3CH ;BL=3CH(60)ADDAL,BL ;結果AL=9AH80§3-38086的指令系統

——算術運算指令討論:

ADD對標志位的影響▲兩個數的相加過程:010111105EH=94+00111100即:+3CH=60100110109AH=154運算后標志位:ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1。▲對標志的解釋:人為決定(程序員)①兩個加數都看成無符號數時,運算結果為9AH,即十進制數154。在這種情況下,SF和OF都沒有意義,我們只關心ZF和CF標志,在BCD碼運算或奇偶校驗時才考慮AF或PF標志。81②兩個加數都當成帶符號數時,符號標志SF和溢出標志OF很重要,而進位標志CF沒有意義。帶符號數能表示的范圍-128~+127,而本例中,兩個正數94和60相加,其和為154,由于154超過了范圍,即產生了溢出,OF=1§3-38086的指令系統

——算術運算指令82進位標志CF(CarryFlag)當加減運算結果的最高有效位(D15或D7)有進位(加法)或借位(減法)時,進位標志置1,即CF=1;否則CF=0。無符號數?有符號數?

針對無符號整數,判斷加減結果是否超出表達范圍。N個二進制位表達無符號整數的范圍:0~2N-18位:0~+25516位:0~+6553532位:0~+232-1§3-38086的指令系統

——算術運算指令83進位標志CF:舉例8位二進制數相加: 00111010+01111100=10110110十六進制表達:3A+7C=B6轉換成十進制數:58+124=182沒有產生進位:CF=08位二進制數相加:

10101010+01111100=[1]00100110十六進制表達:AA+7C=[1]26轉換成十進制數:170+124=294=256+38產生進位:CF=10<182<255進位1表達256§3-38086的指令系統

——算術運算指令84溢出標志OF(OverflowFlag)有符號數加減結果有溢出,則OF=1;否則OF=0。針對有符號整數,判斷加減結果是否超出表達范圍。N個二進制位表達有符號整數的范圍:-2N-1~2N-1-18位:-128~+12716位:-32768~+3276732位:-231~+231-1§3-38086的指令系統

——算術運算指令85§3-38086的指令系統

——算術運算指令溢出標志OF:舉例8位二進制數相加: 00111010+01111100=10110110十六進制表達:3A+7C=B6轉換成十進制數:58+124=182超出范圍:OF=18位二進制數相加:

10101010+01111100=[1]00100110十六進制表達:AA+7C=[1]26轉換成十進制數:-86+124=38沒有超出范圍:OF=0182>127補碼AAH表達-8686§3-38086的指令系統

——算術運算指令進位和溢出的區別進位標志反映無符號整數運算結果是否超出范圍有進位,加上進位或借位后運算結果仍然正確溢出標志反映有符號整數運算結果是否超出范圍有溢出,運算結果已經不正確處理器按照無符號整數求得結果在設置進位標志CF的同時,根據是否超出有符號整數的范圍設置溢出標志OF。應該利用哪個標志,由程序員決定!操作數是無符號數,關心進位操作數是有符號數,注意溢出87§3-38086的指令系統

——算術運算指令溢出標志的判斷處理器硬件判斷規則最高位和次高位同時有進位或同時無進位,無溢出;最高位和次高位進位狀態不同,有溢出人工判斷的簡單規則只有當兩個相同符號數相加(含兩個不同符號數相減),而運算結果的符號與原數據符號相反時,產生溢出;其他情況下,不會產生溢出

00111010+01111100

10110110正數正數負數最高位次高位88§3-38086的指令系統

——算術運算指令奇偶標志PF(ParityFlag)當運算結果最低8位中“1”的個數為零或偶數時,PF=1;否則PF=0舉例8位二進制數相加:

00111010+01111100=10110110

“1”的個數為5個:PF=08位二進制數相加:

10000100+01111100=[1]00000000

“1”的個數為0個:PF=1結果進位僅最低8位“1”的個數89§3-38086的指令系統

——算術運算指令零標志ZF(ZeroFlag)運算結果為0,則ZF=1,否則ZF=0結果是0,ZF標志不是0!舉例8位二進制數相加:

00111010+01111100=10110110

結果不是0,ZF=08位二進制數相加:

10000100+01111100=[1]00000000

結果是0,ZF=1結果進位90⑶INC增量指令(Increment)指令格式:INC目的指令功能:目的目的十1操作數的要求:

通用寄存器、內存。注意:▲這條指令主要用在循環程序中,對地址指針和循環計數器等進行修改;§3-38086的指令系統

——算術運算指令91§3-38086的指令系統

——算術運算指令▲指令執行后影響AF、OF、PF、SF和ZF,但不影響進位標志CF。▲該指令只有一個操作數時,如果要使內存單元的內容增1,程序中必須說明該存儲單元是字還是字節。INC指令的兩個應用例子:例INCBL ;BL寄存器中內容增1

INCCX ;CX寄存器中內容增1例

INCBYTEPRR[BX];內存字節單元內容增1INCWORDPTR[BX];內存字單元內容增1其中:PTR為類型說明符,前面加BYTE說明操作數類型為字節,加WORD則說明操作數類型為字。92§3-38086的指令系統

——算術運算指令⑷AAA加法的ASCII調整指令(ASCIIAdjustforAddition)指令格式:AAA指令功能:將AL寄存器中的運算結果調整為1位非壓縮十進制數,仍保留在AL。如果AF=1,表示向高位有進位,則進到AH寄存器中。使用前提:用ADD或ADC指令對兩個非壓縮十進制數或ASCII碼表示的十進制數作加法,運算結果已存在AL。(注:非壓縮十進制數的高4位為全0,低4位為十進制數字0~9。例如,將9表示成00001001)

93調整過程:若AL低4位>9或AF=1

則:①ALAL十6②用與操作(∧)將AL高4位清0③AF置1,CF置1,AHAH十l

否則:將AL寄存器的高4位清0。例若AL=BCD9,BL=BCD5,求兩數之和。解:設AH=0,則運算過程如下:§3-38086的指令系統

——算術運算指令94§3-38086的指令系統

——算術運算指令

ADD AL,BL ; 00001001……09H ;+ 00000101……05H ;______________________________ AAA ; 00001110……低4位>9 ;+ 00000110……加6調整 ;______________________________ ; 00010100 ;∧ 00001111……清高4位 ;______________________________ ; 00000100……AL=04H ; CF=1,AF=1,AH=1 ;結果為AX=0104H,表示非壓縮十進制數14ASCII碼表示的十進制數,高半字節均為3,運算時需用AND指令將它屏蔽。只要使用AAA指令,可以不必屏蔽高半字節,便能在AX中得到一個正確的非壓縮十進制數。95§3-38086的指令系統

——算術運算指令例求ASCII碼表示的數9(39H)與5(35H)之和。解:設AH=0,則運算過程如下:

MOV AL,‘9’ ;AL=39H MOV BL,‘5’ ;BL=35H ADD AL,BL ; 00111001……‘9’ ;+ 00110101……‘5’ ;______________________________ AAA ; 01101110……低4位>9 ;+ 00000110……加6調整 ;______________________________ ; 01110100 ;∧ 00001111……清高4位 ;______________________________ ; 00000100……AL=4 ; CF=1,AF=1,AH=1 ;結果為AX=0104H,表示非壓縮十進制數14在AAA指令后加上一條“或”指令ORAX,3030H,便使AX中的結果變成了ACSII碼3134H。96§3-38086的指令系統

——算術運算指令⑸DAA加法的十進制調整指令(DecimalAdjustforAddition)指令格式:DAA指令功能:將兩個壓縮BCD數相加后的結果調整為正確的壓縮BCD數。使用前提:相加后的結果必須在AL中,才能使用DAA指令。調整過程:①若AL的低4位>9或AF=1,則ALAL十6,對低4位進行調整;②若AL的高4位>9或CF=1,則ALAL十60H,對高4位進行調整,并使CF置1,否則CF置0。97§3-38086的指令系統

——算術運算指令例若AL=BCD38,BL=BCDl5,求兩數之和。解:運其過程如下: ADD AL,BL ; 00111000……38H ;+ 00010101……15H ;______________________________ DAA ; 01001101……低4位>9 ;+ 00000110……加6調整 ;______________________________ ; 01010011……AL=53H ;結果為:AL=BCD53,CF=0調整過程:①若AL的低4位>9或AF=1,則ALAL十6,對低4位進行調整;②若AL的高4位>9或CF=1,則ALAL十60H,對高4位進行調整,并使CF置1,否則CF置0。98§3-38086的指令系統

——算術運算指令例若AL=BCD88,BL=BCD49,求兩數之和。解:運算過程為: ADD AL,BL ; 10001000……88H ;+ 01001001……49H ;______________________________ DAA ; 11010001……AF=1,低4位<9 ;+ 00000110……加6調整 ;______________________________ ; 11010111……調整后,高4位>9 ;+ 01100000……加60H調整 ;______________________________ ; 00110111……AL=37H ;結果為:AL=BCD37,CF=1調整過程:①若AL的低4位>9或AF=1,則ALAL十6,對低4位進行調整;②若AL的高4位>9或

溫馨提示

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

最新文檔

評論

0/150

提交評論