8086常用指令集


目錄


從功能上包括六大類:

  • 數據傳送
  • 算術運算
  • 邏輯運算和移位
  • 串操作
  • 程序控制
  • 處理器控制

一、數據傳輸指令

  • 注意點:
    • 兩操作數字長必須相同;
    • 兩操作數不允許同時為存儲器操作數
    • 兩操作數不允許同時為段寄存器;
    • 在源操作數是立即數時,目標操作數不能是段寄存器;
    • IP和CS不作為目標操作數,FLAGS一般也不作為操作數在指令中出現。

①通用數據傳輸指令

1、傳送指令MOV

​ MOV 目的操作數,源操作數

​ 注意:目的操作數和源操作數不能是IP寄存器、類型必須相同,不可以同時為段寄存器

​ 不允許在兩個存儲單元中直接傳送數據

​ 目的操作數不允許是立即數

​ 立即數不允許直接送入段寄存器

​ 2、交換指令XCHG

  • 格式:

    • XCHG REG,MEM/REG
  • 注意:

    • 操作數不能為立即數、段寄存器
    • 兩操作數必須有一個是寄存器操作數,不能同時為存儲單元。

②堆棧操作指令

  • 堆棧操作的原則
  • 先進后出
  • 以字節為單位
  • 指令的操作數必須是16位
  • 操作數可以是寄存器或存儲器兩單元,但不能是立即數;
  • 不能從棧頂彈出一個字給CS;

​ 1、進棧指令PUSH

​ PUSH 源操作數

​ 2、出棧指令POP

​ POP 目的操作數

③累加器(即AX或AL)專用傳輸指令

  • 指令尋址方式

    • 根據端口地址碼的長度,指令具有兩種不同的端口地址表現形式。
    • 直接尋址
      • 端口地址為8位時,指令中直接給出8位端口地址;
      • 尋址256個端口。
    • 間接尋址
      • 端口地址為16位時,指令中的端口地址必須由DX指定;
      • 可尋址64K個端口。
  • acc(AL/AX)

  • PORT(端口地址)

​ 1、輸入指令IN

​ IN acc,PORT

​ 2、輸出指令OUT

​ OUT PORT,acc

​ 3、查表指令XLAT

​ XLAT

  • 說明:
    • 用BX的內容代表表格首地址,AL內容為表內位移量,BX+AL得到要查找元素的偏移地址
  • 操作:
    • 將BX+AL所指單元的內容送AL

​ 注意:執行該指令前需先執行 :MOV BX,換碼表的偏移首地址MOV AL,被轉換碼

④目標地址傳輸指令

  • 取近地址指令:LEA
  • 取遠地址指令:LDS、LES
    • LDS和LES均用於將一個32位的遠地址指針寫入到目標寄存器。

1、LEA(有效地址傳輸到寄存器)

  • 操作
    • 將變量的16位偏移地址寫入到目標寄存器
  • 當程序中用符號表示內存偏移地址時,須使用該指令。
  • 格式:
    • LEA REG, MEM
  • 指令要求
    • 源操作數必須是一個存儲器操作數,目標操作數通常是間址寄存器。

2、LDS(裝入一個新的物理地址)

  • 格式:
    • LDS 通用寄存器 ,存儲器操作數

​ 將源操作數的偏移地址送目標寄存器,將源操作數的段地址送DS

3、LES(裝入一個新的物理地址)

  • 格式:
    • LES 通用寄存器 ,存儲器操作數

​ 將源操作數的偏移地址送目標寄存器,將源操作數的段地址送ES

⑤標志寄存器傳送指令

​ 1、LAHF:將FR寄存器的低八位放入AH

​ 2、SAHF:將AH放入FR寄存器的低八位

​ 3、PUSHF:將FR寄存器推入堆棧中

​ 4、POPF:將堆棧棧頂彈如FR

⑥擴展指令

  1. 字節到字的擴展指令
    • 格式:
      • CBW
    • 操作:
      • 將AL內容擴展到AX
    • 規則:
      • 若最高位=1,則執行后AH=FFH
      • 若最高位=0,則執行后AH=00H
  2. 字到雙字的擴展指令
    • 格式:
      • CWD
    • 操作:
      • 將AX內容擴展到DX AX
    • 規則:
      • 若最高位=1,則執行后DX=FFFFH
      • 若最高位=0,則執行后DX=0000H

二、算術運算指令

①算術加法指令

1、算術加法ADD

​ ADD 目的操作數,源操作數
​ 功能:目的操作數 ← 目的操作數 + 源操作數

​ 注意:目的操作數不能立即尋址

​ 加法操作中產生進位影響CF標志

​ 帶符號數相加要考慮溢出

​ 2、帶進位算術加法ADC(多字節相加時使用(大於2字節))

​ ADC 目的操作數,源操作數

​ 功能:目的操作數 ← 目的操作數+ 源操作數 + CF

​ 注意:目的操作數不能立即尋址

​ 加法操作中產生進位影響CF標志

​ 帶符號數相加要考慮溢出

​ 3、加1指令INC

​ INC 目的操作數

​ 功能:目的操作數 ← 目的操作數 + 1

​ 注意:目的操作數不能立即尋址

加法操作中產生進位不影響CF標志

​ 帶符號數相加要考慮溢出

②算術減法指令

  1. 算術減法SUB

​ SUB 目的操作數,源操作數

​ 功能:目的操作數<——目的操作數-源操作數

​ 注意:目的操作數不能立即尋址

​ 減法操作中產生借位影響CF標志

​ 帶符號數相減要考慮溢出

​ 無符號數相減,若CF=1,則結果為補碼

  1. 帶進位算術加法SBB(多字節相加減使用(大於2字節))

​ ADC 目的操作數,源操作數

​ 功能:目的操作數<——目的操作數-源操作數-CF

​ 注意:目的操作數不能立即尋址

​ 減法操作中產生進位影響CF標志

​ 帶符號數相減要考慮溢出

​ 無符號數相減,若CF=1,則結果為補碼

  1. 減1指令DEC

​ DEC 目的操作數

​ 功能:目的操作數<——目的操作數-I

​ 注意:目的操作數不能立即尋址

​ 加法操作中產生進位不影響CF標志

​ 操作數為內存尋址時必須使用偽指令 如DEC WORD PTR[BX]

  1. 求補指令NEG
  • 格式:
    • NEG OPRD
  • 操作:
    • 0 - OPRD → OPRD
  • 說明:
    • 執行NEG指令后,一般情況下都會使CF為1,除非給定的操作數為零才會使CF為0;
    • 當指定的操作數的值為80H(-128)或為8000H(-32768),則執行NEG指令后,結果不變,但0F置1,其它情況下OF均置0。

對一個負數取補碼就相當於用零減去此數

用0減去操作數,可以得到負數的絕對值

  1. 比較指令CMP

​ CMP 目的操作數,源操作數

​ 功能:僅影響標志位,不產生結果

​ 注意:目的操作數不能立即尋址

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

③算術乘除指令

  1. 無符號數乘法指令MUL

​ MUL 源操作數
​ 功能:AX+DX/AX ← AX/AL存的數*源操作數

​ 注意:操作數不能立即尋址

​ AL*BL放入AX

​ AX*BX放入DX和AX

  1. 帶符號數乘法指令IMUL(多字節相加時使用(大於2字節))

​ IMUL 源操作數

​ 功能:AX+DX/AX ← AX/AL存的數*源操作數

​ 注意:操作數不能立即尋址

​ AL*BL放入AX

​ AX*BX放入DX和AX

​ 有符號數再計算機中是其補碼,用MUL計算結果有錯,IMUL會對符號數處理

  1. 無符號數除法指令DIV

    DIV OPRD

    • 執行:AX/OPRD
    • 結果:
      • AL = 商
      • AH = 余數
  2. 帶符號數除法指令IDIV

    IDIV OPRD

    • 執行:DX AX/OPRD
    • 結果:
      • AX = 商
      • DX = 余數
算術乘除運算指令總結:
  • 指令執行影響狀態標志位
  • 乘法指令執行結果為相乘數的雙倍字長;除法指令要求被除數是除數的雙倍字長。

④標志寄存器傳送指令

​ 1、LAHF:將FR寄存器的低八位放入AH

​ 2、SAHF:將AH放入FR寄存器的低八位

​ 3、PUSHF:將FR寄存器推入堆棧中

​ 4、POPF:將堆棧棧頂彈如FR

算術運算類指令總結:

  • 算術運算類指令的執行會影響狀態標志位。其中:
    • INC和DEC指令的執行不會影響CF標志位
  • 該類指令中,全部雙操作數指令對操作數的要求與MOV指令完全相同;
  • 所有單操作數指令都要求操作數:
    • 不能是立即數
    • 如果是存儲器操作數,需要聲明操作數的字長( 用PTR運算符)
  • 乘法運算中:乘積是乘數的雙倍字長
  • 除法指令要求被除數是除數的雙倍字長

三、邏輯運算和移位指令

  • 對操作數的要求
    • 大多與MOV指令相同
    • “非”運算指令要求操作數不能是立即數
  • 對標志位的影響
    • 除“非”運算指令,其余指令的執行都會影響除AF外的5個標志;
    • 無論執行結果是什么,都會使標志位OF=CF=0;
    • “非”運算指令的執行不影響標志位。

①“與”指令:

  • 格式:
    • AND OPRD1, OPRD2
  • 操作:
    • 兩操作數相“與”,結果送目標地址。
  • 應用:
    • 實現兩操作數按位相與的運算
      • AND BL ,[ SI ]
    • 使目標操作數的某些位不變,某些位清零
      • AND AL, OFH
    • 在操作數不變的情況下使CF和OF清零
      • AND AX, AX

②“或”運算指令

  • 格式:
    • OR OPRD1 , OPRD2
  • 操作:
    • 兩操作數相“或”,結果送目標地址
  • 應用:
    • 實現兩操作數相 “或”的運算
    • 使某些位不變,某些位置“1”
      • OR CL, 0FH
    • 在不改變操作數的情況下使OF=CF=0
      • OR AX ,AX

③“非”運算指令

  • 格式:
    • NOT OPRD
  • 操作:
    • 操作數按位取反再送回原地址

注意:“非”運算指令的執行對標志位無影響

④“異或”運算指令

  • 格式:
    • XOR OPRD1, OPRD2
  • 操作:
    • 兩操作數相“並或”,結果送目標地址

xor al,al 相當於 mov al,0

⑤“測試”指令

  • 格式:
    • TEST OPRD1,OPRD2
  • 操作:
    • 執行“與”運算,但運算的結果不送回目標地址。
  • 應用:
    • 常用於測試某些位的狀態

⑥移位操作指令

  • 控制二進制位向左或向右移動的指令
  • 分類:
    • 非循環移位指令
    • 循環移位指令
  • 說明:
    • 指令格式在形式上為雙操作數,本質上為單操作數;
    • 指令的目標操作數為被移動對象,源操作數為移動次數
      • 當目標為存儲器操作數時,需要說明其字長
    • 移動移動1位時由指令直接給出;移動兩位及以上時,移位次數必須由CL指定。
      • 指令源操作數只能是1或CL
1、非循環移位指令
  • 算術 —— 有符號數
  • 邏輯 —— 無符號數
  • 左移最低位補零,最高位移入CF
  • 邏輯右移最低位移入CF,最高位補零
  • 算術右移最低位移入CF,最高位復制符號位
  • 應用:
    • 左移可實現乘法運算
    • 右移可實現除法運算
  1. 邏輯左移
    • SHL OPRD,1
    • SHL OPRD,CL
  2. 算術左移
    • SAL OPRD, 1
    • SAL OPRD,CL
  3. 邏輯右移
    • SHR OPRD,1
    • SHR OPRD,1
  4. 算術右移
    • SAR OPRD, 1
    • SAR OPRD, 1
2、循環移位指令
  • 指令格式、對操作數的要求與非循環移位指令相同
  • 應用:
    • 用於對某些位狀態的測試;
    • 高位部分和低位部分的交換;
    • 與非循環移位指令一起組成32位或更長字長數的移位
  1. 不帶進位位的循環移位

    • 左移最高位移入CF,同時移入最低位

    • 右移最低位移入CF,同時移入最高位

    • 左移ROL

    • 右移ROR

  2. 帶進位位的循環移位

    • 左移CF移入最低位,最高位移入CF

    • 右移CF移入最高位,最低位移入CF

    • 左移RCL

    • 右移RCR

四、串操作指令

  • 說明:

    • 針對數據塊或字符串的操作
    • 可實現存儲器到存儲器的數據傳送;
    • 待操作的數據串稱為源串,目標地址稱為目標串。
    • 串操作指令的操作對象是多個字節數(一串字符或數據)因此,指令的執行需要確定:
      • 串所在的區城
      • 串的首地址(原串、目標串起始地址)
      • 串長度(大小)
      • 串的操作方向
  • 串操作指令的要求:

    • 串所在區域及首地址:
      • 源串一般存放在數據段,偏移地址由SI指定。允許段重設。
      • 目標串必須在附加段,偏移地址由DI指定。
    • 串長度:
      • 串長度值由CX指定
    • 串的操作方向:
      • 由DF標志位決定。指令根據DF狀態自動修改地址指針:
        • DF=0 → 增地址方向(cld指令:將標志寄存器的DF位置0)
        • DF=1 → 減地址方向(std指令:將標志寄存器的DF位置1)
  • 重復前綴:

    • 無條件重復
      • REP
        • 當CX≠0時,REP后的指令將繼續重復執行
        • 常用於傳送類指令前 → 未傳完則繼續傳送
    • 條件重復
      • 相等(為零)重復: REPE (REPZ)
        • CX≠0 ∩ ZF=1,則前綴后的指令將繼續重復執行
      • 不相等(不為零)重復: REPNE ( REPNZ)
        • CX≠0 ∩ ZF=0,則前綴后的指令將繼續重復執行

    條件前綴常用於運算類指令前,當:

    1. 操作未結束AND結果=0
    2. 操作未結束AND結果≠0

    使其后的指令繼續重復執行。

    • 若按增地址方向操作,串操作結束時:
      • 串傳送指令:指針將指向串尾+1
      • 串比較類指令:指針將指向結束位+1
    • 若按減地址方向操作,串操作結束時:
      • 串傳送指令:指針將指向串尾-1
      • 串比較類指令:指針將指向結束位-1

①串傳送MOVS

  • 說明:

    • 將源數據串傳送到目標地址
  • 格式:

    1. MOVS OPRD1,OPRD2
    2. MOVSB
    3. MOVSW
  • 串傳送指令常與無條件重復前綴連用

②串比較CMPS

  • 說明:

    • 用於實現兩個數據串的比較
  • 操作:

    • 目標串-源串,結果不寫回目標地址
    • 常與條件重復前綴連用
  • 格式:

    1. CMPS OPRD1,OPRD2
    2. CMPSB
    3. CMPSW
  • 前綴的操作對標志位不影響

  • 例:

    	lea si,mem1
    	lea di,mem2
    	mov cx,200
    	cld
    	repe cmpsb
    	jz stop			; 兩數據串相同
    	dec si			; 指向存放不相等數據的地址
    	mov al,[si]
    	mov bx,si
    stop:	
    	hlt
    

③串掃描 SCAS

  • 常用於在指定存儲區域中尋找某個關鍵字
  • 格式:
    • SCAS OPRD
    • SCASB
    • SCASW
  • 執行與CMPS指令相似的操作,區別是:
    • 這里的源操作數是AX或AL

④串裝入LODS

  • 說明:

    • 用於將內存某個區域的數據串依次裝入累加器,以便顯示或輸出到接口。
    • LODS指令一般不加重復前綴。
  • 格式:

    • LODS OPRD(源操作數)

    • LODSB

    • LODSW

  • 操作:

    • 對字節:[ DS : SI ] → AL
    • 對字: [ DS : SI ] → AX

⑤(串存儲)串送存STOS

  • 格式:

    1. STOS OPRD(目標操作數)

    2. STOSB

    3. STosW

  • 操作:

    • 對字節:AL → [ ES : DI ]
    • 對字: AX → [ ES : DI ]
  • 應用:

    • 常用於將內存某個區域置同樣的值
    • 此時:
      • 將待送存的數據放入AL(字節數)或AX(字數據);
      • 確定操作方向(增地址/減地址)和區域大小(串長度值);
      • 使用串存儲指令+無條件重復前綴,實現數據傳送。

串操作指令應用注意事項

  • 需要定義附加段
    • 目標操作數必須在附加段
  • 需要設置數據的操作方向
    • 確定DF的狀態
  • 源串和目標串指針分別為SI和DI
  • 串長度值必須由CX給出
  • 注意重復前綴的使用方法
    • 傳送類指令前加無條件重復前綴
    • 串比較類指令前加條件重復前綴,但前綴不影響ZF狀態

五、程序控制

  • 程序控制類指令的本質:
    • 控制程序的執行方向
  • 決定程序執行方向的因素:
    • CS、IP
  • 程序控制類指令以‘'隱含” 的方式修改CS和IP,以實現控制程序走向的目的( Intel指令集不允許由指令直接修改CS和IP)
  • 通過修改IP或CS和IP,實現程序的三種基本控制結構
    • 順序,選擇(分支),循環

①轉移指令

  • 通過修改指令的偏移地址或段地址及偏移地址實現程序的轉移
  1. 無條件轉移指令

    • 無條件轉移到目標地址,可以實現在當前代碼段內或段間轉移
    • 格式:
      • JMP OPRD(目標地址)

    (1)無條件段內轉移

    • 轉移的目標地址在當前代碼段內,段地址不改變。
    • 即:目標地址是16位偏移地址。
    • 目標地址可以由 指令中直接給出目標地址,段內直接轉移。也可以由指令中的寄存器或存儲器操作數指出目標地址段內間接轉移。
    1. 段內直接轉移

      • 轉移的目標地址由指令直接給出
      • 格式:
        • JMP Label(近地址標號)
    2. 段內間接轉移

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

      • 例如:

        mov bx,1200h

        jmp bx

      • 例如:

        mov bx.1200

        jmp word ptr [bx]

    (2)無條件段間轉移

    • 轉移的目標地址不在當前代碼段內。
    • 目標地址為32位,包括段地址和偏移地址。
    • 目標地址可以由指令中直接給出目標地址,即段間直接轉移;也可以由指令中的32位存儲器操作數指出目標地址,即段間間接轉移。
    1. 段間直接轉移
      • 轉移的目標地址由指令直接給出
      • 格式:
        • JMP FAR Label(遠地址標號)
    2. 段間間接轉移
      • 轉移的目標地址由指令中的32位操作數給出
      • 32位目標地址須存放於內存中
      • 格式:
        • JMP DWORD PTR [ BX ]
      • 低地址存放IP,高地址存放CS
  2. 條件轉移指令

    • 當具備一定條件時轉移到目標地址(通常指狀態標志位)

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

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

    轉移指令 條件 意義 英文助記
    jz/je ZF = 1 相減結果等於0/ 相等時轉移 jump if Zero/Equal
    jnz/jne ZF = 0 不等於0 / 不相等時轉移 Jump if Not Zero / Not Equal
    js SF = 1 負數時轉移 Jump if Sign
    jns SF = 0 整數時轉移 Jump if Not Sign
    jo OF = 1 溢出時轉移 Jump if Overflow
    jno OF = 0 未溢出時轉移 jump if Not Overflow
    jp/jpe PF = 1 低字節中有偶數個1時轉移 jump if Parity/Parity Even
    jnp/jpo PF = 0 低字節中有奇數個1時轉移 jump if Not Parity/Parity Odd
    jbe/jna CF = 1或ZF = 1 小於等於/不大於時轉移 jump if Below or Equal/Not Above
    jnbe/ja CF = ZF = 0 不小於等於/大於時轉移 Jump if Not Below or Equal/ Above
    jc/jb/jnae CF = 1 進位/小於/不大於等於時轉移 Jump if Carry/ Below /Not Above Equal
    jnc/jnb/jae CF = 0 未進位/不小於/大於等於時轉移 Jump if Not Carry /Not Below /Above Equal
    jl/jnge SF != OF 小於/不大於等於時轉移 Jump Less /Not Great Equal
    jnl/jge SF = OF 不小於/ 大於等於時轉移 Jump if Not Less /Great Equal
    jle/jng ZF != OF或ZF = 1 小於等於/不大於 Jump if Less or Equal /Not Great
    jnle/jg SF = OF且ZF = 0 不小於等於/ 大於時轉移 Jump Not Less Equal /Great
    jcxz CX 寄存器值 = 0 cx寄存器值為0時轉移 Jump if register CX's value is Zero

②循環控制

  • 循環范圍
    • 以當前IP為中心的[-128 , +127]范圍內循環。
  • 循環次數由CX寄存器指定。
  • 循環指令:
    • 無條件循環指令:LOOP
    • 條件循環指令:LOOPZ、LOOPNZ
  1. 無條件循環指令

    • 格式:

      • LOOP LABEL
    • 循環條件:

      • CX ≠ 0
    • 操作:

      完全相當於

      DEC CX

      JNZ 符號地址

  2. 條件循環指令

    • 功能:
      • 先使CX-1,再根據CX中的值及ZF值來決定是否繼續循環
    • 格式:
      • LOOPZ Label:繼續循環的條件: CX≠0,且ZF=1
      • LOOPNZ Label:繼續循環的條件: CX≠0,且ZF=0

③過程調用

  • 過程調用指令

    • 用於調用一個子過程
  • 與轉移指令的比較

    • 子過程執行結束后要返回原調用處
      • 必須保護返回地址
  • 調用指令的執行過程

    1. 保護斷點
      • 將調用指令的下一條指令的地址(斷點)壓入堆棧
    2. 獲取子過程的入口地址
      • 子過程第1條指令的地址
    3. 執行子過程
      • 功能實現,參數的保存及恢復
    4. 恢復斷點,返回原程序。
      • 將斷點偏移地址由堆棧彈出

    斷點保護和恢復由系統自動完成,但會影響堆棧的棧頂指針

  • 直接調用:
    指令中直接給出子過程的入口地址

  • 間接調用:
    由內存獲得子過程的入口地址

  1. 段內調用

    • 段內直接調用
      • 格式:CALL TIMER
    • 段內間接調用
      • 格式:CALL WORD PTR[SI]
  2. 段間調用

    • 說明:

      • 子過程與原調用程序不在同一代碼段,調用前需保護斷點的段基地址和偏移地址
      • 先將斷點的CS壓棧,再壓入IP。
    • 段間直接調用

      • 格式:CALL FAR TIMRE
    • 段間間接調用

      • 格式:CALL DWORD PTR[SI]
  3. 返回指令

    • 功能:
      • 從堆棧中彈出斷點地址,返回原程序
    • 格式:RET

    子程序的最后一條指令必須是RET

④中斷控制

  • 中斷的概念
    • 某種異常或隨機事件(中斷源)使處理器暫時停止正在運行的程序,轉去執行一段特殊處理程序,並在處理結束后返回原程序被中斷處繼續執行的過程。

中斷與過程調用

  • 相似點:
    • 從一個正在執行的過程轉向另一個過程(處理程序) ,並在執行完后返回原程序繼續執行
  • 區別:
    • 中斷是隨機事件或異常事件引起,調用是事先已在程序中安排好;
    • 調用指令在指令中直接給出子程序入口地址,中斷指令只給出中斷向量碼,入口地址則在向量碼指向的內存單元中。
    • 調用可以是近過程調用或遠過程調用,中斷處理程序均為遠過程;
    • 響應中斷請求不僅要保護斷點地址,還要保護FLAGS內容。

中斷指令

  • 引起CPU產生一次中斷的指令
  • 格式:
    • INT n (中斷類型碼n=0~ 255)
  • 說明:
    • n * 4 :存放中斷服務子程序入口地址的單元的偏移地址
    • n * 4 + 2 :存放中斷服務子程序入口地址的單元的段地址
  • 中斷指令的執行過程:
    1. 將FLAGS壓入堆棧;
    2. 將INT指令的下一條指令的CS、IP壓棧;
    3. 由n x 4得到存放中斷向量的地址;
    4. 將中斷向量(中斷服務程序入口地址)送CS和IP寄存器;
    5. 轉入中斷服務程序。

中斷返回指令

  • 格式: IRET
  • 中斷服務程序的最后一條指令,負責:
    • 恢復斷點
    • 恢復標志寄存器內容

中斷服務子程序的最后一條指令也必須是IRET指令

六、處理器控制

  • 這類指令用來對CPU進行控制,如修改標志寄存器,使CPU暫停,使CPU與外部設備同步等。
  • 處理器控制指令的控制對象是CPU均為零操作數格式指令

①對標志位的操作

  • 置標志位狀態

    指令 執行后變化 指令說明
    CLC CF=0 清進位標志位
    STC CF=1 進位標志位置位
    CMC CF取反 進位標志位取反
    CLD DF=0 清萬向標志位,串操作從低地址到高地址
    STD DF=1 方向標忐位置位,串操作從高地址到低地址
    CLI IF=0 清中斷標志位,即關中斷
    STI IF=1 中斷標志位置位,即開中斷

②與外部設備的同步

  • 處理器暫停指令HLT
    • HLT指令經常和中斷過程聯系在--起,它的執行實際上是用軟件的方法使CPU處於暫停狀態等待硬件中斷,而硬件中斷的進入又使CPU退出暫停狀態。由NMI引腳上引入的不可屏蔽(非屏蔽)中斷和在中斷允許(IF=1) 的情況下,INTR引腳上引入的可屏蔽中斷,會使CPU退出暫停狀態;同時對系統復位操作也會使CPU退出暫停狀態。
  • 等待指令WAIT
    • WAIT指令使CPU處於等待狀態,直到CPU的TEST引腳上的信號為有效。 8086 CPU的第23號引腳TEST,是用來使處理器與外部硬件同步的,也稱為同步指令,為低電平有效的輸入信號。若測試到該信號無效,CPU繼續執行WAIT指令,以令CPU處於空閑等待狀態;若測試到該信號有效,CPU轉去執行WAIT指令的下一條指令。
  • 換碼指令/交權指令ESC
    • ESC指令可以使其他處理器接收米自8086指令流中的指令,且可用8086的尋址方式對存儲器操作數進行操作。執行ESC指令,僅僅完成訪問一個存儲器操作數並把它放在總線上。
  • 總線封鎖指令LOCK
    • LOCK指令可以放在任何一條指令前面,所以LOCK指令實際上是一個特殊的1字節封鎖線。它使工作在最大模式下的8086CPU,在執行下一條指令期間發出總線封鎖信號,即LOCK引腳變為低電平有效信號。這樣,在CPU訪問存儲器或外設時,總線控制器會對總線進行封鎖,使其他處理器得不到總線控制權,從而就不能訪問存儲器或外設。
  • 空操作指令NOP
    • NOP指令不執行任何操作,也不影響任何標志,其機器碼占1個存儲單元,其功能等同於交換指令“XCHG AX, AX"。在調試程序時往往用NOP指令占據一定的存儲單元,以便在正式運行前用其他必要的指令代替。由於CPU執行任何一條指令都是需要時間的,故當程序中需要用軟件進行延時時,可以使用NOP指令來較精確地定時,而不會影響程序的其他功能。

指令系統小結

  • 8種尋址方式:
    2. 直接尋址
    4. 寄存器間接尋址
    5. 寄存器相對尋址
    6. 基址變址尋址
    7. 基址變址相對尋址
    6. 寄存器尋址
    7. 立即尋址
    8. 隱含尋址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM