官术网_书友最值得收藏!

3.3 8086指令系統

視頻二維碼(掃碼觀看)

掌握:

指令碼的含義

指令對操作數的要求

指令的對標志位的影響

指令的功能

8086指令系統

從功能上包括六大類:

數據傳送

算數運算

邏輯運算和移位

串操作

程序控制

處理器控制

一、數據傳送指令

通用數據傳送

輸入輸出

地址傳送

標志位操作

1通用數據傳送

特點:該類指令的執行對標志位不產生影響

(1)一般數據傳送指令

一般數據傳送指令MOV

格式:MOV dest,src

操作:src→dest

例:MOV AL,BL

注意點:

兩操作數字長必須相同;

兩操作數不允許同時為存儲器操作數;

兩操作數不允許同時為段寄存器;

在源操作數是立即數時,目標操作數不能是段寄存器;

IP和CS不作為目標操作數,FLAGS一般也不作為操作數在指令中出現。

一般數據傳送指令應用例:

將(*)的ASCII碼2AH送入內存數據段1000H開始的100個單元中。

題目分析:

確定首地址

確定數據長度

寫一次數據

修改單元地址

修改長度值

判斷寫完否?

未完繼續寫入,否則結束

程序段:

上段程序在代碼段中的存放形式:

設CS=109EH,IP=0100H,則各條指令在代碼段中的存放地址如下:

數據段中的分布:

送上2AH后數據段中相應存儲單元的內容改變如下:

(2)堆棧操作指令

掌握:

有關堆棧的概念

棧頂、棧首、棧底

堆棧指令的操作原理

執行過程,執行結果

堆棧操作的原則:

先進后出

以字為單位

壓棧指令PUSH

指令執行過程:

SP-2→SP

操作數高字節→SP+1

操作數低字節→SP

壓棧指令的操作

設AX=1234H,SP=1200H

執行PUSH AX指令后堆棧區的狀態:

出棧指令POP

指令執行過程:

SP→操作數低字節

SP+1→操作數高字節

SP←SP+2

出棧指令的操作

執行POP AX

堆棧操作指令說明

指令的操作數必須是16位的;

操作數可以是寄存器或存儲器兩單元,但不能是立即數;

不能從棧頂彈出一個字給CS;

PUSH和POP指令在程序中一般成對出現;

PUSH指令的操作方向是從高地址向低地址,而POP指令的操作正好相反。

堆棧操作指令例:

(3)交換指令

格式:XCHG REG,MEM/REG

注:兩操作數必須有一個是寄存器操作數,不允許使用段寄存器。

例:

XCHG AX,BX

XCHG [2000],CL

(4)查表指令

格式:XLAT

說明:用BX的內容代表表格首地址,AL內容為表內位移量,BX+AL得到要查找元素的偏移地址。

操作:將BX+AL所指單元的內容送AL查表指令。

例:

數據段中存放有一張ASCII碼轉換表,設首地址為2000H,現欲查出表中第11個代碼的ASCII碼

查表指令例

可用如下指令實現:

執行后:AL=42H

還可用其他方法實現,如:

MOV BX,2000H

MOV AL,[BX+0BH]

(5)字位擴展指令

將符號數的符號位擴展到高位;

指令為零操作數指令,采用隱含尋址,隱含的操作數為AX及AX,DX;

無符號數的擴展規則為在高位補0;

字節到字的擴展指令。

格式:CBW

操作:將AL內容擴展到AX

規則:若最高位=1,則執行后AH=FFH

若最高位=0,則執行后AH=00H

字位擴展指令例

判斷以下指令執行結果:

MOV AL,44H

CBW

MOV AX,0AFDEH

CWD

MOV AL,86H

CBW

2輸入輸出指令

掌握:

指令的格式及操作

指令的兩種尋址方式

指令對操作數的要求

專門面向I/O端口操作的指令

指令格式:

輸入指令:IN acc,PORT

輸出指令:

指令尋址方式

根據端口地址碼的長度,指令具有兩種不同的端口地址表現形式。

(1)直接尋址:端口地址為8位時,指令中直接給出8位端口地址;尋址256個端口。

(2)間接尋址:端口地址為16位時,指令中的端口地址必須由DX指定;可尋址64K個端口。

I/O指令例

IN AX,80H

MOV DX,2400H

IN AL,DX

OUT 35H,AX

OUT AX,35H

3地址傳送指令

(1)取偏移地址指令LEA

操作:將變量的16位偏移地址取出送目標寄存器,當程序中用符號地址表示內存偏移地址時,須使用該指令。

格式:LEA REG,MEM

指令要求:源操作數必須是一個存儲器操作數,目標操作數通常是間址寄存器。

(2)LEA指令

比較下列指令:

MOV SI,DATA1→符號地址

執行結果:SI=1234H

LEA SI,DATA1

執行結果:SI=DATA1

MOV BX,[BX]

執行結果:BX=7788H

LEA BX,[BX]

執行結果:BX=1100H

LEA指令在程序中的應用

將數據段中首地址為MEM1的50個字節的數據傳送到同一邏輯段首地址為MEM2的區域存放。編寫相應的程序段。

4標志位操作指令

(1)LAHF,SAHF

LAHF

操作:將FLAGS的低8位裝入AH

(2)PUSHF,POPF

針對FLAGS的堆棧操作指令

將標志寄存器壓棧或從堆棧彈出

視頻二維碼(掃碼觀看)

二、算術運算類指令

加法運算指令

減法運算指令

乘法指令

除法指令

注意:算術運算指令的執行大多對狀態標志位會產生影響

1加法指令

注意:加法指令對操作數的要求與MOV指令相同

(1)ADD指令

格式:ADD OPRD1,OPRD2

操作:OPRD1+OPRD2→OPRD1

注意:ADD指令的執行對全部6個狀態標志位都產生影響。

ADD指令例

MOV AL,78H

ADD AL,99H

注意:指令執行后6個狀態標志位的狀態。

標志位狀態:

CF=1 SF=0

AF=1 ZF=0

PF=1 0F=0

(2)ADC指令

指令格式、對操作數的要求、對標志位的影響與ADD指令完全一樣。

指令的操作:OPRD1+OPRD2+CF→OPRD1

ADC指令多用于多字節數相加,使用前要先將CF清零。

ADC指令應用例——求兩個20B數的和。

(3)INC指令

格式:INC OPRD→不能是段寄存器或立即數

操作:OPRD+1→OPRD

常用于在程序中修改地址指針。

2減法指令

注意:減法指令對操作數的要求與對應的加法指令相同。

(1)SUB指令

格式:SUB OPRD1,OPRD2

操作:OPRD1-OPRD2 OPRD1

注意:對標志位的影響與ADD指令同。

(2)SBB指令

指令格式、對操作數的要求、對標志位的影響與SUB指令完全一樣。

指令的操作:OPRD1-OPRD2-CF OPRD1

(3)DEC指令

格式:DEC OPRD

操作:OPRD-1 OPRD

注意:指令對操作數的要求與INC相同,常用于在程序中修改計數值。

應用程序例

(4)NEG指令

格式:NEG OPRD→8/16位寄存器或存儲器操作數

操作:0-OPRD→OPRD

用0減去操作數,相當于對該操作數求補碼

(5)CMP指令

格式:CMP OPRD1,OPRD2

操作:OPRD1-OPRD2

指令執行的結果不影響目標操作數,僅影響標志位!

用途:用于比較兩個數的大小,可作為條件轉移指令轉移的條件。

指令對操作數的要求及對標志位的影響與SUB指令相同。

兩個無符號數的比較:

CMP AX,BX

若 AX>BX CF=0

若 AX<BX CF=1

兩個帶符號數的比較:

CMP AX,BX

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

CMP指令例

程序功能:在20個數中找最大的數,并將其存放在MAX單元中。

3乘法指令

注意點:乘法指令采用隱含尋址,隱含的是存放被乘數的累加器AL或AX及存放結果的AX,DX。

(1)無符號數乘法指令

格式:MUL OPRD→不能是立即數

操作:

(2)無符號數乘法指令例

MUL BYTE PTR[BX]

4除法指令

無符號除法指令

格式:DIV OPRD

有符號除法指令

格式:IDIV OPRD

除法指令的操作

若OPRD是字節數

執行:AX/OPRD

結果:AL=商 AH=余數

若OPRD是雙字節數

執行:DXAX/OPRD

結果:AX=商 DX=余數

5BCD碼調整指令

將指令執行的二進制運算結果調整為壓縮BCD碼或擴展BCD碼表示的十進制數。

共6條,均為隱含尋址方式,隱含的操作數是AL或AL、AH;

不能單獨使用,要緊跟在相應的算術運算指令之后。

三、邏輯運算和移位指令

指令類型:

邏輯運算

與,或,非,異或

移位操作

非循環移位,循環移位

1邏輯運算

邏輯運算指令對操作數的要求大多與MOV指令相同。

“非”運算指令要求操作數不能是立即數;

除“非”運算指令外,其余指令的執行都會使標志位OF=CF=0

(1)“與”指令

格式:AND OPRD1,OPRD2

操作:兩操作數相“與”,結果送目標地址。

“與”指令的應用

實現兩操作數按位相與的運算

AND BL,[SI]

使目標操作數的某些位不變,某些位清零

AND AL,0FH

在操作數不變的情況下使CF和OF清零

AND AX,AX

“與”指令應用例

(2)“或”運算指令

格式:OR OPRD1,OPRD2

操作:兩操作數相“或”,結果送目標地址

“或”指令的應用

實現兩操作數相“或”的運算

OR AX,[DI]

使某些位不變,某些位置“1”

OR CL,0FH

在不改變操作數的情況下使OF=CF=0

OR AX,AX

“或”指令的應用例

“或”指令的應用

如何實現將一個二進制數9變為字符‘9’?

(3)“非”運算指令

格式:NOT OPRD

操作:操作數按位取反再送回原地址。

注:指令中的操作數不能是立即數,指令的執行對標志位無影響。

例:NOT BYTE PTR[BX]

(4)“異或”運算指令

格式:XOR OPRD1,OPRD2

操作:兩操作數相“異或”,結果送目標地址。

例:

XOR BL,80H

XOR AX,AX

(5)“測試”指令

格式:TEST OPRD1,OPRD2

操作:執行“與”運算,但運算的結果不送回目標地址。

應用:常用于測試某些位的狀態。

2移位指令

注:移動一位時由指令直接給出;移動兩位及以上,則移位次數由CL指定。

(1)非循環移位指令

邏輯左移

算術左移

邏輯右移

算術右移

算術左移和邏輯左移

算術左移指令:

邏輯左移指令:

邏輯右移

格式:

邏輯右移例

MOV AL,68H

MOV CL,2

SHR AL,CL

算術右移

格式:

非循環移位指令的應用:

左移可實現乘法運算

右移可實現除法運算

(2)循環移位指令

指令格式、對操作數的要求與非循環移位指令相同。

不帶進位位的循環移位:

帶進位位的循環移位:

循環移位指令的應用:

用于對某些位狀態的測試;

高位部分和低位部分的交換;

與非循環移位指令一起組成32位或更長字長數的移位。

程序功能:將1000H開始存放的4個壓縮BCD碼轉換為ASCII碼存放在3000H開始的單元中去。

程序例:

四、串操作指令

1串操作指令說明

針對數據塊或字符串的操作;

可實現存儲器到存儲器的數據傳送;

待操作的數據串稱為源串,目標地址稱為目標串。

2串操作指令的特點

源串一般存放在數據段,偏移地址由SI指定。允許段重設;

目標串必須在附加段,偏移地址由DI指定;

指令自動修改地址指針,修改方向由DF決定。

DF=0→增地址方向

DF=1→減地址方向

數據塊長度值由CX指定;

可增加自動重復前綴以實現自動修改CX內容。

視頻二維碼(掃碼觀看)

3重復前綴

條件重復

串操作指令流程(以傳送操作為例)

4串操作指令

串傳送MOVS

串比較CMPS

串掃描SCAS

串裝入LODS

串送存STOS

(1)串傳送指令

格式:

MOVS OPRD1,OPRD2

MOVSB

MOVSW

串傳送指令常與無條件重復前綴連用。

對比用MOV指令和MOVS指令實現將200個字節數據從內存的一個區域送到另一個區域的程序段。

串傳送指令例

用串傳送指令實現200個字節數據的傳送:

(2)串比較指令

格式:

CMPS OPRD1,OPRD2

CMPSB

CMPSW

串比較指令常與條件重復前綴連用,指令的執行不改變操作數,僅影響標志位。

前綴的操作對標志位不影響。

串比較指令例

測試200個字節數據是否傳送正確,如果不正確,找出第一個不相等的字符,并將其地址與不相等的字符放到BX和AL當中:

(3)串掃描指令

格式:

SCAS OPRD→目標操作數

SCASB

SCASW

執行與CMPS指令相似的操作,只是這里的源操作數是AX或AL。

串掃描指令的應用:常用于在指定存儲區域中尋找某個關鍵字。

(4)串裝入指令

格式:

LODS OPRD→源操作數

LODSB

LODSW

操作:

對字節:AL←[DS:SI]

對字:AX←[DS:SI]

串裝入指令的應用:用于將內存某個區域的數據串依次裝入累加器,以便顯示或輸出到接口。

LODS指令一般不加重復前綴。

(5)串存儲指令

格式:

STOS OPRD→目標操作數

STOSB

STOSW

操作:

對字節:AL→[ES:DI]

對字:AX→[ES:DI]

串存儲指令的應用:常用于將內存某個區域置同樣的值

此時:

將待送存的數據放入AL(字節數)或AX(字數據);

確定操作方向(增地址/減地址)和區域大小(串長度值);

使用串存儲指令+無條件重復前綴,實現數據傳送。

串存儲指令例:內存某個區域清零

設計思想:

五、程序控制指令

轉移指令

循環控制

過程調用

中斷控制

程序的執行方向

程序控制類指令的本質是:控制程序的執行方向

決定程序執行方向的因素:CS,IP

控制程序執行方向的方法:修改CS和IP,則程序轉向另一個代碼段執行;僅修改IP,則程序將改變當前的執行順序,轉向本代碼段內其它某處執行。

1轉移指令

通過修改指令的偏移地址段地址及偏移地址實現程序的轉移。

無條件轉移指令:無條件轉移到目標地址,執行新的指令。

有條件轉移指令:在具備一定條件的情況下轉移到目標地址。

(1)無條件轉移指令

格式:

原則上可實現在整個內存空間的轉移。

無條件段內轉移

轉移的目標地址在當前代碼段內,段地址不改變。

段內直接轉移

轉移的目標地址由指令直接給出

格式:JMP Label→近地址標號

段內直接轉移示圖

下一條要執行指令的偏移地址=當前IP+位移量。

段內間接轉移

轉移的目標地址存放在某個16位寄存器或存儲器的某兩個單元中。

例:

JMP BX

若:BX=1200H

則:轉移的目標地址=1200H

段內間接轉移例

JMP WORD PTR[BX]

設:BX=1200H

無條件段間轉移

轉移的目標地址不在當前代碼段內。

段間直接轉移

轉移的目標地址由指令直接給出

格式:

JMP FAR Label→遠地址標號

段間直接轉移示圖

段間間接轉移

轉移的目標地址由指令中的32位操作數給出。

例:

JMP DWORD PTR[BX]

無條件轉移指令例

MOV SI,1122H

MOV WORD PTR[SI],0120H

ADD SI,2

MOV WORD PTR[SI],0122H

視頻二維碼(掃碼觀看)

(2)條件轉移指令

在滿足一定條件下,程序轉移到目標地址繼續執行。

條件轉移指令均為段內短轉移,即轉移范圍為:-128~+127。

條件轉移指令的應用:

幾種條件轉移指令的應用:

JC/JNC:判斷CF的狀態。常用于比大小;

JZ/JNZ:判斷ZF的狀態。常用于循環體的結束判斷;

JO/JNO:判斷OF的狀態。常用于有符號數溢出的判斷;

JP/JPE:判斷PF的狀態。用于判斷運算結果低8位中1的個數是否為偶數;

JA/JAE/JB/JBE:判斷CF或CF+ZF的狀態。常用于無符號數的大小比較。

條件轉移指令例

統計內存數據段中以TABLE為首地址的100個8位符號數中正數、負數和零元數的個數。

條件轉移指令例(流程圖)

2循環控制指令

循環范圍:以當前IP為中心的-128~+127范圍內循環。

循環次數由CX寄存器指定。

循環指令:

無條件循環指令

格式:LOOP LABEL

循環條件:CX≠0

操作:

3過程調用和返回

用于調用一個子過程;子過程由程序員預先設計并裝入內存,子過程執行結束后要返回原調用處。

調用指令的執行過程:

保護斷點;

將調用指令的下一條指令的地址(斷點)壓入堆棧;

獲取子過程的入口地址;

子過程第1條指令的偏移地址;

執行子過程,含相應參數的保存及恢復;

恢復斷點,返回原程序;

將斷點偏移地址由堆棧彈出。

過程調用:

(1)段內調用

被調用程序與調用程序在同一代碼段;

調用前只需保護斷點的偏移地址。

格式:

執行過程:

將斷點的偏移地址壓入堆棧;

根據過程名找子程序入口。

段內調用例

(1)CALL TIMRE→直接調用

(2)CALL WORD PTR[SI]→間接調用

設:SI1200H     CS6000H

執行第(2)條指令后:

CS6000H

IP3344H

(2)段間調用

斷點保護時的壓棧順序:

先將斷點的CS壓棧,再壓入IP。

段間調用例

格式:CALL FAR PROC

格式例:

CALL FAR TIMRE

CALL DWORD PTR[SI]

(3)返回指令

功能:從堆棧中彈出斷點地址,返回原程序。

格式:RET

RET指令一般位于子程序的最后。

4中斷指令

中斷

中斷源

中斷的類型

中斷指令

引起CPU產生一次中斷的指令

中斷與過程調用:

中斷是隨機事件或異常事件引起,調用則是事先已在程序中安排好;

響應中斷請求不僅要保護斷點地址,還要保護FLAGS內容;

調用指令在指令中直接給出子程序入口地址,中斷指令只給出中斷向量碼,入口地址則在向量碼指向的內存單元中。

(1)中斷指令

格式:INT n→中斷類型碼n=0~255

說明:n×4→存放中斷服務子程序入口地址的單元的偏移地址,該單元在數據段,段地址=DS。

中斷指令的執行過程:

將FLAGS壓入堆棧;

將INT指令的下一條指令的CS、IP壓棧;

由n×4得到存放中斷向量的地址;

將中斷向量(中斷服務程序入口地址)送CS和IP寄存器;轉入中斷服務程序。

中斷指令例

執行程序段:

執行INT 21H指令后

IP=[21H×4]

CS=[(21H×4)+2]

(2)溢出中斷指令

格式:

若OF=1,則啟動一個類型為4的中斷過程,給出一個出錯標志,如果OF=0,不做任何操作。

INTO指令通常安排在有符號數加減運算指令之后。

(3)中斷返回指令

格式:

IRET

六、處理器控制指令

結束語:

掌握:

指令的格式及意義;

指令對操作數的要求及對標志位的影響;

指令的應用。

主站蜘蛛池模板: 普定县| 那曲县| 和田市| 彭水| 湘乡市| 呼玛县| 久治县| 安溪县| 青神县| 沁源县| 宁远县| 剑川县| 肇东市| 钟山县| 辽宁省| 神木县| 融水| 建阳市| 永济市| 巫山县| 兴业县| 聊城市| 新宁县| 温州市| 昔阳县| 乐亭县| 仙桃市| 耒阳市| 丽水市| 太谷县| 壤塘县| 衡山县| 大宁县| 德令哈市| 嵩明县| 会昌县| 尉犁县| 德阳市| 云霄县| 紫阳县| 靖江市|