微機(jī)原理與接口與接口技術(shù)第三章8086指令系統(tǒng)

3.1基本數(shù)據(jù)類型

基本數(shù)據(jù)類型在內(nèi)存中的字節(jié)順序

3.1.1 字、雙字的對齊

  • 字、雙字在內(nèi)存中并不需要對齊至自然邊界(字、雙字的自然邊界是偶數(shù)編號的地址)
  • 然而,為改進(jìn)程序的性能,數(shù)據(jù)結(jié)構(gòu)(特別是堆棧)只要可能,應(yīng)對齊在自然邊界上
  • 這樣做的理由是:對于不對齊的存儲訪問,處理器要求做兩次存儲訪問操作;而對于對齊的訪問只要做一次存儲訪問操作

3.1.2 數(shù)字?jǐn)?shù)據(jù)類型

(1)無符號整數(shù)
它們的值的范圍,對于字節(jié)是從0 ~ 255;對于字,從0 ~ 65535;對于雙字,從0 ~ 2^{32}-1
(2)符號整數(shù)

  • 符號整數(shù)是保存在字節(jié)、字、雙字中的帶符號額二進(jìn)制數(shù)
  • 負(fù)數(shù)的符號位為1,正數(shù)的符號位為0
  • 整數(shù)值范圍,對于字節(jié),從-128+127;對于字從-32768+32767;對于雙字,從-2^{32} ~ +2^{32}-1
符號整數(shù)編碼

3.1.3指針數(shù)據(jù)類型

3.1.4 串?dāng)?shù)據(jù)類型

串是位、字節(jié)、字或雙字的連續(xù)序列

3.2 8086的指令格式

指令有以下格式:
label(標(biāo)號):mnemonic(助記符)
argument1(參數(shù)1),argument2(參數(shù)2),argument3(參數(shù)3)

其中標(biāo)號是一標(biāo)記符后面跟有冒號(:)
助記符是一類具有相同功能的指令操作碼的保留名
操作數(shù)參數(shù)1、參數(shù)2和參數(shù)3是任選的

3.3 8086指令的操作數(shù)尋址方式

8086機(jī)器指令有零個或多個操作數(shù)。某些操作數(shù)是顯式規(guī)定的,有的是指令中隱含的
一個操作數(shù)能定位在以下之一中:

  • 指令自身中(立即數(shù))
  • 寄存器
  • 存儲單元
  • I/O端口

3.3.1 立即數(shù)

立即尋址方式

3.3.2 寄存器操作數(shù)

源和目的操作數(shù)能在以下寄存器中,取決于正在執(zhí)行的指令:

  • 16位通用寄存器(AX、BX、CX、DX、SI、DI、SP或BP)
  • 8位通用寄存器(AH、BH、CH、DH、AL、BL、CL或DL)
  • 段寄存器(CS、DS、SS、ES、FS和GS)
  • FLAGS寄存器
寄存器尋址

3.3.3 存儲器操作數(shù)

1.規(guī)定段選擇子
段寄存器的約定

MOV ES:[BX],AX
以下默認(rèn)段選擇,不能被超越

  • 必須從代碼段取指令
  • 在串操作中的目的串必須存儲在由ES寄存器指向的數(shù)據(jù)段
  • 推入和彈出操作必須總是引用SS段
2.規(guī)定偏移量

內(nèi)存地址的偏移量部分或者直接作為一個靜態(tài)值(稱為位移量)規(guī)定或者由以下或多個成員通過計算得到地址:

  • 位移量——一個8位或16位值
  • 基地址——在通用寄存器中的值
  • 索引——在通用寄存器中的值

作為基地址或索引的通用的通用寄存器限制如下:

  • SP寄存器不能用作索引寄存器
  • 當(dāng)SP或BP寄存器用作為基地址,SS段是默認(rèn)的段
(1)位移量
直接尋址方式示意圖
(2)基地址
基地址寄存器間接尋址示意圖
(3)基地址+位移量
基地址加位移量尋址方式
(4)索引(變址)+位移量
  • 當(dāng)數(shù)組的元素2、4或8字節(jié)時這種地址方式為索引進(jìn)入靜態(tài)數(shù)組提供了有效的方法
(5)基地址+索引+位移量
基地址、變地址加位移量
3.匯編程序和編譯程序?qū)ぶ贩绞?/h5>

在機(jī)器碼級,所選擇地位移量、基寄存器、索引寄存器和比例系數(shù)是在指令中編碼地
匯編程序允許程序員用這些尋址成員地任何允許地組合以尋址操作數(shù)
高級語言編譯程序根據(jù)程序員定義地語言結(jié)構(gòu)選擇這些成員地適當(dāng)組合

3.3.4 I/O端口尋址

x86處理器支持至包含65536個8位I/O端口地址和I/O地址空間

1.MOV指令

MOV DOPD(目的操作數(shù)),SOPD(源操作數(shù))

MOV指令使用舉例
2.交換指令

XCHG DOPD,SOPD

  • 使兩個操作數(shù)交換
3.堆棧操作指令
調(diào)用子程序示意圖

(1)入棧指令
PUSH DOPA

  • 在入棧操作時,把一個字(或雙字)從源操作數(shù)傳送至有SP(ESP)所指向的堆棧的頂部

PUSH AX
PUSH BX

堆棧操作示意圖
PUSH r          W    SP = SP - 1, (SP) = 2
PUSH seg        W    SP = SP -2,(SP) = seg
PUSH src        W    SP = SP -2,(SP) = src

(2)出棧指令
POP POPD

  • 把現(xiàn)行SP所指向的堆棧頂部的一個字或雙字,送至指定的目的操作數(shù),同時修改堆棧指針的操作,即SP+2 -> SP
POP r         W   r  = (SP),SP = SP + 2
POP seg       W   seg = (SP).SP = SP+2
POP dst       W   dst = (SP),SP = SP+2

(3)PUSHA推入通用寄存器至堆棧

  • PUSHA(push all)將所有地16位(即8086)地通用寄存器推至堆棧
Temp <- (SP)
Push (AX)
Push (CX)
Push (DX)
Push (BX)
Push (Temp)
Push (BP)
Push (SI)
Push (DI)

(4)POPA自堆棧彈出至通用寄存器

  • POPA(Pop All)自堆棧彈出至16位通用寄存器

DI <- Pop();
SI <- Pop();
BP <- Pop();

ESP增量2(跳過堆棧地下2個字節(jié))
BX<- Pop();
DX <- Pop();
CX <- Pop();
AX <- Pop();

4.輸入輸出指令

(1)IN

  • 允許把一個字節(jié)或一個字由一個輸入端口(port),傳送至AL(若是一個字節(jié))或是AX(若是一個字)
IN AL,n    B    AL=[n]
IN AX,n    W    AX=[n+1][N]
IN AL,DX    B    AL=[DX]
IN AX,DX    W    AX=[DX+1][DX]

(2)OUT

  • 允許把在AL中的一個字節(jié)或AX中一個字,傳送至一個輸出端口
OUT  n,AL    B    AL->[n]
OUT  N,AX    W    AX->[n],[n+1]
OUT  DX,AL    B    AL->[DX]
OUT  DX,AX    W    AX-> [DX][DX+1]
5.擴(kuò)展指令

(1)CWD

  • 能把AX中字的符號擴(kuò)展至DX中(形成32位操作數(shù))
    (2)CBW
  • 把寄存器AL中的字節(jié)的符號送至AH中(形成16位操作數(shù))

3.4.2 二進(jìn)制算術(shù)指令

1.加法指令

(1)ADD指令
ADD DOPD,SOPD

  • 完成兩個操作數(shù)的相加
ADD   r,src    B/W/D    r <- r+src
ADD  a,im    B/W/D    A <- a+im
注:im指立即數(shù)
ADD dst,im    B/W/D dst <- im+dst
ADD dst,r    B/W/D  dst <- r+dst

(2)ADC(Add with Carry)指令
ADC DOPD,SOPD

  • 兩個操作數(shù)相加時,要把進(jìn)位標(biāo)志C的現(xiàn)行值加上去,結(jié)果送至一個目標(biāo)操作數(shù)(DOPD)
ADC   r,src    r <- r+src+c
ADC  a,im    B/W/D    a <- a+im+c
注:im指立即數(shù)
ADC dst,im    B/W/D dst <- im+dst+c
ADC dst,r    B/W/D  dst <- r+dst+c
  • 兩個數(shù)分別放在自FIRST和SECOND開始的存儲區(qū)中
MOV  AX,FIRST
ADD  AX,SECOND
MOV  THIRD,AX
MOV  AX,FIRST+2
ADC  AX,SECOND+2
MOV  THIRD+2,AX
2.減法指令

(1)SUB指令
SUB DOPD,SOPD

  • 從DOPD中減去POPD


(2)SBB(Subtract with Borrow)指令
SBB DOPD,SOPD

  • 兩個操作數(shù)相減時,還要減去借位標(biāo)志CF的現(xiàn)行值


3.乘法指令

(1)MUL無符號數(shù)乘法指令
MUL SOPD

  • 完成在AL(字節(jié))或AX(字)的操作數(shù)和另一個操作數(shù)(兩個無符號數(shù))的乘法


把內(nèi)存單元FIRST和SECOND這兩個字節(jié)的內(nèi)容相乘


(2)IMUL符號數(shù)乘法指令

  • 若結(jié)果的高半部分(對于字節(jié)相乘則為AH,對于字相乘則為DX)不是低半部分符號位擴(kuò)展則標(biāo)志CF=1,OF=1;否則CF=0,OF=0


4.除法指令

(1)DIV

  • 無符號除法指令,能把在AX和它的擴(kuò)展部分(若是字節(jié)相除則在AH和AL中,若是字相除則在DX:AX中)中的的無符號被除數(shù)被源操作數(shù)除,且把相除以后的商送至累加器(8位時送至AL。16位時送至AX),余數(shù)送至累加器的擴(kuò)展部分(8位時送至AH,16位時送至DX),若除數(shù)為0,則會在內(nèi)部產(chǎn)生一個類型0中斷


(2)IDIV

  • 在字節(jié)相除時,最大的商為+127(7FH),而最小的負(fù)數(shù)商為-127(81H);在字相除時,最大的商為+32767(7FFFH),最小的負(fù)數(shù)商為-32767(8001H)
5.增量減量指令

(1)INC增量

  • 對指定操作數(shù)加1,然后返回此操作數(shù)


(2)DEC減量

  • 對指定操作數(shù)減1,然后把結(jié)果送回操作數(shù)
6.NEG取補(bǔ)指令
  • 這條指令是對操作數(shù)取補(bǔ),即用零減去操作數(shù),再把結(jié)果送回操作數(shù)
  • 若在字節(jié)操作時對-128,或在字操作時對-32768取補(bǔ),則操作沒變化,但溢出標(biāo)志位OF置位
7.CMP指令
  • 完成兩個操作相減,使結(jié)果反映在標(biāo)志位上,但兩操作數(shù)不變

CMP AX,BX
若要求比較AX和BX中兩個正數(shù)的大小,把大數(shù)放在AX中就可以用一下程序段:


要把AX和BX中的大的值放在AX中的程序段,可改為:


四種情況

(1)若參與比較的兩數(shù)為A和B,A與B都為正數(shù),則執(zhí)行CMP指令后,若SF=0,則A>B;反之A<B。
(2)若A>0,B<0.
A=+127,B=-63,比較時執(zhí)行A-B=A+(-B)=+127+(-(-63))=+127+63,則在機(jī)器中的結(jié)果


(3)若A<0,B>0
例如:A=-63,B=+127,則顯然A<B
,且運(yùn)算結(jié)果應(yīng)為負(fù)。
但A-B=A+(-B),在機(jī)器中的運(yùn)行結(jié)果為:

(4)若A<0,B<0
在沒有溢出的情況下,即OF=0時:SF=0,則A>B;SF=1,則A<B
在發(fā)生溢出的情況下,即OF=1時:SF=1,A>B;SF=0,A<B
所以當(dāng)兩個帶符號數(shù)相比較時,要把標(biāo)志位SF和OF結(jié)合起來一起考慮,才能判斷哪個數(shù)大。

3.4.3十進(jìn)制算術(shù)命令

1.在加法后進(jìn)行十進(jìn)制調(diào)整(Decimal Adjust for Addition,DAA)
  • 對在AL中的的由兩個組合的十進(jìn)制數(shù)相加的結(jié)果進(jìn)行校正,以得到正確的組合的十進(jìn)制和

若(AL&0FH)> 9或標(biāo)志AF=1,則AL <- AL + 6
AF <- 1
若AL>9FH或標(biāo)志CF=1,則AL <- AL + 60H
CF <- 1
此指令影響標(biāo)志AF、CF、PF、SF、ZF,而對標(biāo)志位OF未作定義

2.在減法后進(jìn)行十進(jìn)制調(diào)整(Decimal Adjust for Subtraction,DAS)
  • 能對在AL中兩個組合的十進(jìn)制數(shù)相減以后的結(jié)果進(jìn)行校正以得到正確組合的十進(jìn)制差

校正的操作為:
若(AL&0FH)> 9或標(biāo)志AF=1,則AL <- AL - 6
AF <- 1
若AL>9FH或標(biāo)志CF=1,則AL <- AL - 60H
CF <- 1

指令執(zhí)行的結(jié)果,影響標(biāo)志AF、CF、PF、SF和ZF,但對標(biāo)志位OF未定義

3.在加法后進(jìn)行ASCII調(diào)整(Unpacked BCD[ASCII] Adjust for Addition,AAA)
  • 這條指令對在AL中的由兩個未組合的十進(jìn)制操作數(shù)相加后的結(jié)果進(jìn)行校正,產(chǎn)生一個未組合的十進(jìn)制和



    校正的操作為:
    若(AL&0FH)> 9或標(biāo)志AF=1,則
    AL <- AL + 6
    AH <- AH + 1
    AF <- 1
    CF <- 1
    AL <- AL&0FH

  • 這條指令對標(biāo)志位AF和CF有影響,而對OF、PF、SF、ZF等標(biāo)志位未定義

4.在減法后進(jìn)行ASCII調(diào)整(Unpacked BCD[ASCII] Adjust for subtraction,AAS)

校正的操作為:
若(AL&0FH) > 9或標(biāo)志AF=1,則
AL <- AL -6
AH <- AH - 1
AF <- 1
CF <- 17
AL <- AL & 0FH

5.在乘法后進(jìn)行ASCII調(diào)整(Unpacked BCD[ASCII]Adjust for Multiply,AAM)
  • 這條指令能把在AX中的兩個未組合的十進(jìn)制數(shù)相乘的結(jié)果進(jìn)行校正,最后在AX中能得到正確的未組合的十進(jìn)制數(shù)的乘積(即高位在AX中,低位在AL中)
    校正的操作為:
    AH <- AL/0AH (AL被0A除的商 -> AH)
    AL <- AL%0AH(AL被0A除的余數(shù)->AL)
6.在除法前進(jìn)行調(diào)整(Unpacked BCD[ASCII]Adjust for Division)
  • 這條指令能把在AX中的兩個未組合的十進(jìn)制數(shù)相除以前進(jìn)行校正,這樣在兩個未組合的十進(jìn)制數(shù)相除以后,可以得到香澤的未組合的十進(jìn)制結(jié)果
    校正的操作為:
    AL <- AH * 0AH + AL
    AH <- 0

3.4.4邏輯指令

1.AND執(zhí)行按位邏輯與

(1)AND指令
AND DOPD,SOPD

  • 這條指令對兩個操作數(shù)進(jìn)行按位與運(yùn)算,即只有相“與”的兩位全為1,與的結(jié)果才為1;否則結(jié)果為0.“與”以后的結(jié)果送到目的操作數(shù)



    (2)TEST

  • 若要檢測AL中的最低位是否為1,若為1則轉(zhuǎn)移,可用以下指令:
    TEST AL 01H
    JNZ THERE
    THERE:...

  • 若要檢測AL中的最高位是否為1,若為1則轉(zhuǎn)移,可用以下指令:
    TEST AL 8000H
    JNZ TBERE
    TBERE:...

若要檢測CX中的最低位是否為0,若為0則轉(zhuǎn)移,可用以下指令:
TEST CX 0FFFFH
JZ THERE
THERE:...

2. OR執(zhí)行按位邏輯或

OR DOPD,SOPD

  • 此條指令對指定的兩個操作數(shù)進(jìn)行邏輯“或”運(yùn)算。即進(jìn)行或運(yùn)算的兩位中任意一個為1(或兩個都為1),則或的結(jié)果為1;否則為0.或運(yùn)算的結(jié)果返回目的操作數(shù)

例如:


3.XOR執(zhí)行按位邏輯異或

XOR DOPD,SOPD

  • 這條指令對兩個指定的操作數(shù)進(jìn)行異或運(yùn)算,當(dāng)進(jìn)行異或運(yùn)算的兩位不相同時(即一個為1,另一個為0),“異或”的結(jié)果為0.異或運(yùn)算的結(jié)果返回目的操作數(shù)

例如


4.NOT執(zhí)行按位邏輯非

NOT OPRD; B/W/D
OPRD的反碼 -> OPRD

  • 這條指令對源操作數(shù)求反,然后送回源操作數(shù)

3.4.5移位和循環(huán)移位指令

1.移位指令

SAL(算術(shù)左移) DOPD,OPD2
SHL(邏輯左移) DOPD,OPD2
SAR(算術(shù)右移) DOPD,OPD2
SHR(邏輯右移) DOPD,OPD2

  • 第一個操作數(shù)時目標(biāo)操作數(shù),即對它進(jìn)行移位操作。目標(biāo)操作數(shù)可以時任一通用寄存器或內(nèi)存操作數(shù)(可用于所有尋址方式)。第二個操作數(shù)規(guī)定移動的次數(shù)(或移位的位數(shù))。

  • SAL/SHL在物理上是完全一樣的,每移動一次后,最低位補(bǔ)0,最高位移入標(biāo)志位CF


  • SAR每執(zhí)行一次,使目標(biāo)操作數(shù)右移移位,但保持符號位不變,最低位移至標(biāo)志位CF


  • SHR指令每執(zhí)行一次,使目標(biāo)操作數(shù)右移移位,最低位進(jìn)入標(biāo)志位CF,最高位補(bǔ)0


2.循環(huán)移位指令
  • 8086有四條循環(huán)移位指令ROL(Rotate Left)、ROR(Rotate Right)、RCL(Rotate through CF Left)和RCR(Rotate through Right)
  • 前兩條循環(huán)移位指令,未把標(biāo)志位CF包含在循環(huán)的環(huán)中。后兩條把標(biāo)志位CF包含在循環(huán)的環(huán)中,作為整個循環(huán)的一部分

ROL DOPD,OPD2

  • 第一個操作數(shù)是要對其進(jìn)行移位操作的目標(biāo)操作數(shù)。第二個操作數(shù)是8位立即數(shù)或寄存器CL,用以規(guī)定移位的次數(shù)


3.4.6控制傳送指令

1.無條件轉(zhuǎn)移指令JMP
  • 轉(zhuǎn)移程序控制至指令流的不同點(diǎn)而不保留返回信息
    JMP DOPD

  • DOPD能是rel8短轉(zhuǎn)移、相對轉(zhuǎn)移,偏移量相對于下一條指令

  • DOPD能是rel16近(NEAR)轉(zhuǎn)移、相對轉(zhuǎn)移,偏移量相對于嚇一條指令

  • DOPD能是rel32近(NEAR)轉(zhuǎn)移、相對轉(zhuǎn)移,偏移量相對于下一條指令

  • DOPD能是r/m16近(NEAR)轉(zhuǎn)移、絕對簡介沒地址在r/m16中給出

  • DOPD能是r/m32近(NEAR)轉(zhuǎn)移、絕對簡介,地址在r/m32中給定

  • DOPD能是ptr16:16遠(yuǎn)(FAR)轉(zhuǎn)移、絕對轉(zhuǎn)移,地址在操作數(shù)中規(guī)定

  • DOPD能是m16:16遠(yuǎn)(FAR)轉(zhuǎn)移、絕對簡介,地址在m16:16中給定

此指令能夠用于執(zhí)行以下不同類型的轉(zhuǎn)移:

  • 近轉(zhuǎn)移——轉(zhuǎn)移至當(dāng)前碼段(由CS寄存器當(dāng)前指向的段),有時也稱為段內(nèi)轉(zhuǎn)移
  • 短轉(zhuǎn)移——一種Near轉(zhuǎn)移,其轉(zhuǎn)移范圍限制在當(dāng)前EIP的-128 ~ +127之內(nèi)
  • 遠(yuǎn)轉(zhuǎn)移——轉(zhuǎn)移至與當(dāng)前碼段不同段內(nèi)的指令,有時也稱為段間轉(zhuǎn)移
2.條件轉(zhuǎn)移指令Jcc

Jcc Label

  • Label是轉(zhuǎn)移的目標(biāo)地址。即滿足指令中規(guī)定的條件,則轉(zhuǎn)移至目標(biāo)地址;否則繼續(xù)執(zhí)行下一條指令
    (1)根據(jù)單個標(biāo)志位的條件轉(zhuǎn)移
    (2)組合條件的條件轉(zhuǎn)移

  • 8086中的條件轉(zhuǎn)移指令可分為以下兩大類我
    (1)根據(jù)單個標(biāo)志位所形成的條件的條件轉(zhuǎn)移指令
    (2)根據(jù)若干個標(biāo)志位的邏輯運(yùn)算所形成的條件轉(zhuǎn)移指令

(1)根據(jù)單個標(biāo)志位所形成的條件的條件轉(zhuǎn)移指令
①CF標(biāo)志
a.JB(低于轉(zhuǎn)移)/JNAE(不高于或等于轉(zhuǎn)移)/JC(有進(jìn)位、借位轉(zhuǎn)移)

  • 這是當(dāng)進(jìn)位標(biāo)志CF=1時,能轉(zhuǎn)移至目標(biāo)地址的條件轉(zhuǎn)移指令的三種助記符
    b.JAE(高于或等于轉(zhuǎn)移)/JNB(不低于轉(zhuǎn)移)/JNC(無進(jìn)位、借位轉(zhuǎn)移)
  • 這是當(dāng)進(jìn)位標(biāo)志CF=0時,能轉(zhuǎn)移至目標(biāo)地址的條件轉(zhuǎn)移指令的三種助記符

②ZF標(biāo)志
a.JE(相等轉(zhuǎn)移)/JZ(等于零轉(zhuǎn)移)

  • 當(dāng)ZF=1時,能轉(zhuǎn)移至目標(biāo)地址的條件轉(zhuǎn)移指令的兩種助記符

b.JNE(不相等轉(zhuǎn)移)/JNZ(不等于零轉(zhuǎn)移)

  • 當(dāng)ZF=0時,能轉(zhuǎn)移至目標(biāo)地址的條件轉(zhuǎn)移指令的兩種助記符

③SF標(biāo)志
a.JS(符號轉(zhuǎn)移,在此指的是符號為負(fù)轉(zhuǎn)移)

  • 這是符號位SF=1時,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令
    b.JNS(正轉(zhuǎn)移)
  • 這是符號位SF=0時,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令

④PF標(biāo)志
a.JP(偶轉(zhuǎn)移)/JPE(偶轉(zhuǎn)移)

  • 當(dāng)奇偶標(biāo)志PF=1,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令兩種助記符
    b.JNP(奇轉(zhuǎn)移)/JPO(奇轉(zhuǎn)移)
  • 當(dāng)奇偶標(biāo)志PF=0,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令兩種助記符

⑤O標(biāo)志
a.JO(溢出轉(zhuǎn)移)

  • 當(dāng)溢出標(biāo)志位OF=1時,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令的助記符
    b.JNO(未溢出轉(zhuǎn)移)
  • 當(dāng)溢出標(biāo)志位OF=0時,能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令的助記符

(2)根據(jù)若干個標(biāo)志位的邏輯運(yùn)算所形成的條件轉(zhuǎn)移指令
①判斷無符號數(shù)的大小
a.JA(高于轉(zhuǎn)移)/JNBE(不低于或等于轉(zhuǎn)移)

  • 即兩個無符號數(shù)A和B相比較,當(dāng)A>B(不包括相等的情況)時就滿足這個條件
    b.JBE(低于或等于轉(zhuǎn)移)/JNA(不高于轉(zhuǎn)移)
  • 即兩個無符號數(shù)A和B相比較,當(dāng)A<B(包括相等的情況)時就滿足這個條件

②判斷帶符號數(shù)的大小
a.JG(大于轉(zhuǎn)移)/JNLE(不小于或等于轉(zhuǎn)移)

  • 即兩個符號數(shù)A和B相比較,當(dāng)A>B(不包括相等的情況)時就滿足這個條件。不相等,則必然ZF=0;帶符號數(shù)大于,則必須SF⊕OF=0(兩者都為0或者兩者都為1)所以反映這個標(biāo)志為(SF⊕OF=0)∩ZF=0.

b.JGE(大于或等于轉(zhuǎn)移)/JNA(不小于轉(zhuǎn)移)

  • 即兩個符號數(shù)A和B相比較,當(dāng)A>B(包括相等的情況)時就滿足這個條件。帶符號數(shù)大于,則必須SF⊕OF=0(兩者都為0或者兩者都為1)所以反映這個標(biāo)志為(SF⊕OF=0)∩ZF=0.

c.JL(小于轉(zhuǎn)移)/JNGE(不大于或等于轉(zhuǎn)移)

  • 即兩個符號數(shù)A和B相比較,當(dāng)A<B(不包括相等的情況)時就滿足這個條件。不相等,則必然ZF=0;小于必為符號標(biāo)志SF和溢出標(biāo)志OF異號,)所以SF⊕OF=1,且ZF=0。當(dāng)滿足此條件時,能轉(zhuǎn)移到目標(biāo)地址

d.JLE(小于或等于轉(zhuǎn)移)/JNG(不大于轉(zhuǎn)移)

  • 當(dāng)兩個帶符號數(shù)相比較,當(dāng)A<B時滿足這個條件。則ZF=1;小于則SF⊕OF=1,故條件為(SF⊕OF)∪ZF=1。當(dāng)滿足此條件時,能轉(zhuǎn)移到目標(biāo)地址

  • JE/JZ若相等/若為0轉(zhuǎn)移

  • JNE/JNZ若不相等/若不為0轉(zhuǎn)移

  • JA/JNBE若高于/若不低于或等于轉(zhuǎn)移

  • JAE/JNB若高于或等于/若不低于轉(zhuǎn)移

  • JB/JNAE若低于/若不高于或等于轉(zhuǎn)移

  • JBE/JNA若低于或等于/若不高于轉(zhuǎn)移

  • JG/JNLE若大于/若不小于或等于轉(zhuǎn)移

  • JGE/JNL若大于或等于/若不小于轉(zhuǎn)移

  • JL/JNGE若小于/若不大于或等于轉(zhuǎn)移

  • JLE/JNG若小于或等于。若不大于轉(zhuǎn)移

  • JC若進(jìn)位轉(zhuǎn)移

  • JNC若無進(jìn)位轉(zhuǎn)移

  • JO若溢出轉(zhuǎn)移

  • JNO若無溢出轉(zhuǎn)移

  • JS若符號位位1(負(fù))轉(zhuǎn)移

  • JNS若符號位為0(正)轉(zhuǎn)移

  • JPO/JNP若奇/若奇偶標(biāo)志位為0轉(zhuǎn)移

  • JPE/JP/若奇偶標(biāo)志位為1轉(zhuǎn)移

  • JCXZ/JECXZ寄存器CX為0/寄存器ECX為0轉(zhuǎn)移

3.重復(fù)控制指令

8086處理器有三種控制的指令:
(1)LOOP

  • LOOP指令使CX(ECX)減1,且判斷若CX(ECX不等于0),則循環(huán)至目標(biāo)操作數(shù)——IP+偏移量(符號擴(kuò)展至16位)

  • 一條LOOP指令相當(dāng)于以下兩種指令的組合:
    DEC CX
    JNZ AGAIN

(2)LOOPZ/LQOPE

  • 此指令使CX減1,且判斷只有在CX不等于0,而且標(biāo)志ZF=1的條件下,才循環(huán)至目標(biāo)操作數(shù)——IP+偏移量

(3)LOOPNZ/LOOPNE

  • 此指令使CX減1,且判斷只有在CX不等于0,而且標(biāo)志ZF=0的條件下,才循環(huán)至目標(biāo)操作數(shù)——IP+偏移量
4.調(diào)用與返回指令

(1)CALL調(diào)用過程
CALL指令能執(zhí)行官不同類型的調(diào)用:

  • NEAR調(diào)用——調(diào)用在當(dāng)前代碼段(由CS寄存器指向的當(dāng)前段)內(nèi)的過程,也稱為段內(nèi)調(diào)用

  • FAR調(diào)用——調(diào)用位于與當(dāng)前代碼段不同段的過程,也稱為段間調(diào)用
    (2)RET返回

  • 有兩種返回指令:
    RET
    RET OPD

RET指令能用于執(zhí)行不同類型的返回:

  • NEAR返回——返回至當(dāng)前代碼段(由CS寄存器當(dāng)前指向的段)內(nèi)的調(diào)用過程,也稱為段內(nèi)返FAR返回——返回至與當(dāng)前代碼段不在同一段內(nèi)的調(diào)用過程,也稱為段間返回
    (3)IRET從中斷返回
    (4)INT軟件中斷、INTO在溢出時中斷
5.過程指令

(1)BOUND檢測值是否超過范圍
BOUND OPD1,OPD2

  • 確定第一個操作數(shù)(數(shù)組索引)是否由第二個操作數(shù)(邊界操作數(shù))規(guī)定的數(shù)組邊界內(nèi)
    (2)ENTER高級進(jìn)入過程
    ENTER OPD1,OPD2
  • 為過程建立堆棧幀。第一個操作數(shù)(尺寸操作數(shù))規(guī)定堆棧幀的尺寸(即過程分配到堆棧上的動態(tài)存儲的字節(jié)數(shù))。第二個操作數(shù)(嵌套層操作數(shù))給定過程的此法嵌套層(0~8)。
    嵌套層確定從前面幀拷貝至新堆棧幀的“顯示區(qū)”的堆棧幀指針的數(shù)量。這兩個個操作數(shù)都是立即數(shù)

(3)LEAVE高級過程退出

  • LEAVE指針拷貝幀指針(在EBP寄存器洪)到堆棧指針寄存器(ESP),它釋放分配給堆棧幀的空間

3.4.7串指令

串指令對字節(jié)串操作,允許它們移至存儲器或從存儲器傳送。

8086處理器有七種基本的串操作指令
(1)MOVS(Move String)
前面?zhèn)魉?00個操作數(shù)的例子,可以改為:



可簡化為:


(2)CMPS
CMPS/CMPSB比較串/比較字節(jié)串
CMPS/CMPSW比較串/比較字串
利用CMPS指令對STRING1和STRING2兩個字符串進(jìn)行比較的程序:



(3)SCAS
SCAS/SCASB掃描串/掃描字節(jié)串
SCAS/SCASW掃描串/掃描字串

  • 搜索串指令,關(guān)鍵字放在AL(字節(jié))或AX(字)中,操作時從AL(字節(jié)操作)或AX(字操作)的內(nèi)容中減去由DI作為指針的目的串元素,結(jié)果反映在標(biāo)志位上,但不改變目的串元素以及累加器的值

例子:把要搜索的關(guān)鍵字放在AL(字節(jié))或AX
(字)中,用以搜索內(nèi)存的某一數(shù)據(jù)塊或字符串中,有無此關(guān)鍵字。若有,把搜索次數(shù)記下(若次數(shù)為0,表示無要搜索的關(guān)鍵字),且記錄下存放關(guān)鍵字的地址



(4)LODS
LODS/LODSB裝入串/裝入字節(jié)串
LODS/LODSW裝入串/裝入字串

  • 本指令把由SI作為指針的串元素,傳送至AL(字節(jié)操作)或AX(字操作),同時修改SI,使其指向串中的下一個元素。

(5)STOS
STOS/STOSB 存儲串/存儲字節(jié)串
STOS/STOSW 存儲串/存儲字串

例:若在內(nèi)存緩存區(qū)中有一個數(shù)據(jù)塊,起始地址為BLOCK。數(shù)據(jù)塊中的數(shù)據(jù)有正有負(fù),要求把其中的正負(fù)數(shù)分開,分別送至同一段的兩個緩沖區(qū),存放整數(shù)的緩沖區(qū)的其實(shí)地址為PLUS_DATA;存放負(fù)數(shù)的緩沖區(qū)的起始地址為MINUS_DATA



(6)串輸入指令I(lǐng)NS/INSB/SINSW/INSD——從端口輸入至串
INS M8.DX
INS M16,DX
INSB
INSW

  • 此類指令從源操作數(shù)(第二個操作數(shù))拷貝至由目標(biāo)操作數(shù)(第一個操作數(shù))。源操作數(shù)是一I/O端口地址(從0 ~ 65535)由DX寄存器規(guī)定。目標(biāo)操作數(shù)是以內(nèi)存單元,其地址由ES:DI寄存器規(guī)定。

(7)串輸出指令OUTSB/OUTSW——拷貝至端口
OUTS DX,m8
OUTS DX,m16
OUTSB
OUTSW

  • 此類指令從源操作數(shù)(第二個操作數(shù))拷貝至由目標(biāo)操作數(shù)(第一個操作數(shù))規(guī)定的I/O端口。源操作數(shù)是以內(nèi)存單元,其地址由DS:DI寄存器規(guī)定。目標(biāo)操作數(shù)是一I/O端口地址(從0 ~ 65535),由DX寄存器規(guī)定

3.4.8標(biāo)志控制操作

標(biāo)志控制指令對EFLAGS寄存器中的標(biāo)志進(jìn)行操作

  • STC設(shè)進(jìn)位標(biāo)志
  • CLC清楚進(jìn)位標(biāo)志
  • CMC對進(jìn)位標(biāo)志取反
  • CLD清楚方向標(biāo)志
  • STD設(shè)置方向標(biāo)志
  • LAHF加載標(biāo)志至AH寄存器
  • SAHF存AH寄存器至標(biāo)志
  • PUSHF推入FLAGS至堆棧
  • POPF從堆棧彈出至FLAGS
  • STI設(shè)中斷標(biāo)志
  • CLI清楚中斷標(biāo)志

3.4.9段寄存器指令

格式位:
LDS r16,mem16:16
LDS r32,mem16:32
LES r16,mem16:16
LES r32,mem16:32
LSS r16,mem16:16
LSS r32,mem16:31

  • 從源操作數(shù)(第二個操作數(shù))架子以FAR指針,段選擇子和偏移量至指定的段寄存器和第一個操作數(shù)(目標(biāo)操作數(shù))。指令操作碼和目標(biāo)操作碼規(guī)定段寄存器/通用寄存器對.16位段選擇子從源操作數(shù)加載至用操作碼規(guī)定的段寄存器(DS、ES、SS、FS或GS)。16位偏移量加載至目標(biāo)操作數(shù)規(guī)定的寄存器

3.4.10雜項(xiàng)指令

(1)LEA加載有效地址
LEA r16,m

  • 計算操作數(shù)的有效地址(即段內(nèi)偏移地址)并存儲至目標(biāo)操作數(shù)
    (2)NOP空操作
    (3)XLAT/XLATB表格查找傳送
    XLAT m8
    XLATB
  • 用AL寄存器作為表的索引,定位在內(nèi)存中的字節(jié)項(xiàng)。然后把它送至AL。在AL寄存器中的索引作為無符號數(shù)對待。此指令從DS:BX寄存器得到內(nèi)存中表的基地址(DS段可以用段超越前綴來超越)

https://wenku.baidu.com/view/6ef5630ff12d2af90242e608

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容