匯編指令


(一)8086/8088尋址方式

首先,簡單講述一下指令的一般格式:

操作碼

操作數

……

操作數

計算機中的指令由操作碼字段和操作數字段組成。

操作碼:指計算機所要執行的操作,或稱為指出操作類型,是一種助記符。

操作數:指在指令執行操作的過程中所需要的操作數。該字段除可以是操作數本身外,也可以是操作數地址或是地址的一部分,還可以是指向操作數地址的指針或其它有關操作數的信息。

尋址方式就是指令中用於說明操作數所在地址的方法,或者說是尋找操作數有效地址的方法。8086/8088的基本尋址方式有六種。

一、立即尋址

所提供的操作數直接包含在指令中。它緊跟在操作碼的后面,與操作碼一起放在代碼段區域中。如圖所示。

例如:MOV  AX,3000H

立即數可以是8位的,也可以是16位的。若是16位的,則存儲時低位在前,高位在后。

立即尋址主要用來給寄存器或存儲器賦初值。

二、直接尋址

操作數地址的16位偏移量直接包含在指令中。它與操作碼—起存放在代碼段區域,操作數一般在數據段區域中,它的地址為數據段寄存器DS加上這16位地址偏移量。如下圖所示。

例如:  MOV AX,DS:[2000H];

這種尋址方法是以數據段的地址為基礎,可在多達64KB的范圍內尋找操作數。

8086/8088中允許段超越,即還允許操作數在以代碼段、堆棧段或附加段為基准的區域中。此時只要在指令中指明是段超越的,則16位地址偏移量可以與CS或SS或ES相加,作為操作數的地址。

MOV   AX,[2000H]     ;數據段

MOV   BX,ES:[3000H] ;段超越,操作數在附加段

即絕對地址=(ES)*16+3000H

三、寄存器尋址

操作數包含在CPU的內部寄存器中,如寄存器AX、BX、CX、DX等。

例如:MOV  DS,AX

   MOV  AL,BH

四、寄存器間接尋址

操作數是在存儲器中,但是,操作數地址的16位偏移量包含在以下四個寄存器SI、DI、BP、BX之一中。可以分成兩種情況:

(1) 以SI、DI、BX間接尋址,則通常操作數在現行數據段區域中,即數據段寄存器(DS)*16加上SI、DI、BX中的16位偏移量,為操作數的地址,

  例如:  MOV  AX,  [SI]  操作數地址是:(DS)*16+(SI)

(2) 以寄存器BP間接尋址,則操作數在堆棧段區域中。即堆棧段寄存器(SS)*16與BP的內容相加作為操作數的地址,

    例如:MOV  AX,[BP]   操作數地址是:(SS)*16+(BP)

若在指令中規定是段超越的,則BP的內容也可以與其它的段寄存器相加,形成操作數地址。

例如:  MOV  AX,DS:[BP]    操作數地址是:(DS)*16+(BP)

五、變址尋址

由指定的寄存器內容,加上指令中給出的8位或16位偏移量(當然要由一個段寄存器作為地址基准)作為操作數的偏移地址。(操作數在存貯器中)

可以作為寄存器變址尋址的四個寄存器是SI、DI、BX、BP。

⑴若用SI、DI和BX作為變址,則與數據段寄存器相加,形成操作數的地址即默認在數據段;

⑵若用BP變址,則與堆棧段寄存器相加,形成操作數的地址即默認在堆棧段

例如:   MOV   AX,COUNT[SI];

操作數地址是:(DS)*16+(SI)+COUNT

但是,只要在指令中指定是段超越的,則可以用別的段寄存器作為地址基准。

六、基址加變址尋址

把BX和BP看成是基址寄存器,把SI、DI看着是變址寄存器,把一個基址寄存器(BX或BP)的內容加上一個變址寄存器(SI或DI)的內容,再加上指令中指定的8位或16位偏移量(當然要以一個段寄存器作為地址基准)作為操作數的偏移地址,如圖所示。

 

操作數在存貯器中,其偏移地址由(基址寄存器)+(變址寄存器)+相對偏移量形成

基址寄存器――BX:數據段、BP:堆棧段;

變址寄存器――SI、DI。

例如:MOV     AX,[BX][SI]  或  MOV     AX,[BX+SI]

也可放置一個相對偏移量,如COUNT 、MASK等等,用於表示相對尋址。

MOV    AX,MASK[BX][SI]  

MOV    BH,COUNT[DI][BP];MOV    BH,COUNT[BP+DI]

² 若用BX作為基地址,則操作數在數據段區域

² 若用BP作為基地址,則操作數在堆棧段區域

但若在指令中規定段是超越的,則可用其它段寄存器作為地址基准。

                                                                                    段寄存器使用的基本約定

訪問存儲器類型

默認段寄存器

可指定段寄存器

段內偏移地址來源

取指令碼

CS

IP

堆棧操作

SS

SP

串操作源地址

DS

CS、ES、SS

SI

串操作目的地址

ES

DI

BP用作基址寄存器

SS

CS、DS、ES

根據尋址方式求得有效地址

一般數據存取

DS

CS、ES、SS

根據尋址方式求得有效地址

(二)8086/8088 指令系統

8086/8088的指令系統可以分為以下六個功能組。

1.數據傳送(Data Transter)      2.算術運算(Arithmetic)    

3.邏輯運算(Logic)            4.串操作(String menipulation)

5.程序控制(Program Control)   6.處理器控制(Processor Control)

由於串操作和處理器控制指令我們較少接觸,因此只介紹其他四種。

 

一、數據傳送指令

主要介紹 MOV,XCHG、堆棧和地址傳送指令。

1.數據傳送MOV指令

一般格式:MOV  OPRD1,OPRD2

MOV 是操作碼,OPRD1和OPRD2分別是目的操作數和源操作數。

功能:完成數據傳送

具體來說,一條數據傳送指令能實現:

⑴CPU內部寄存器之間數據的任意傳送(除了代碼段寄存器CS和指令指針IP以外)。

MOV  AL,BL;字節傳送

MOV  CX,BX;字傳送

MOV  DS,BX

⑵立即數傳送至CPU內部的通用寄存器組(即AX、 BX、CX、DX、BP、SP、SI、DI),

MOV  CL,4

MOV  AX,03FFH

MOV  SI,057BH

⑶CPU內部寄存器(除了CS和IP以外)與存儲器(所有尋址方式)之間的數據傳送。

MOV  AL,BUFFER

MOV  AX,[SI]

MOV  [DI],CX

MOV  SI,BLOCK[BP]

MOV  DS,DATA[SI+BX]

MOV  DEST[BP+DI],ES

⑷   能實現用立即數給存儲單元賦值

例如:MOV  [2000H],25H

MOV  [SI],35H

 

對於MOV 指令應注意幾個問題:

①存儲器傳送指令中,不允許對CS和IP進行操作;

②兩個操作數中,除立即尋址之外必須有一個為寄存器尋址方式,即兩個存儲器操作數之間不允許直接進行信息傳送;

如我們需要把地址(即段內的地址偏移量)為AREAl的存儲單元的內容,傳送至同一段內的地址為AREA2的存儲單元中去,MOV指令不能直接完成這樣的傳送,但我們可以用CPU內部寄存器為橋梁來完成這樣的傳送:

       MOV  AL,AREAl

       MOV  AREA2,AL

③兩個段寄存器之間不能直接傳送信息,也不允許用立即尋址方式為段寄存器賦初值;如:MOV AX,0;MOV DS,AX

④目的操作數,不能用立即尋址方式。

 

2.堆棧指令    

(簡述堆棧的概念及存取特點,如先進后出)

包括入棧(PUSH)和出棧(POP)指令兩類。僅能進行字運算。(操作數不能是立即數)

⑴  入棧指令PUSH

一般格式:PUSH  OPRD

源操作數可以是CPU內部的16位通用寄存器、段寄存器(CS除外)和內存操作數(所有尋址方式)。入棧操作對象必須是16位數。

功能:將數據壓入堆棧

執行步驟為:SP=SP-2;[SP]=操作數低8位;[SP+1]= 操作數高8位

例如:PUSH  BX

執行過程為:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如下圖所示。

             

⑵   出棧指令POP

一般格式:POP  OPRD

功能:將數據彈出堆棧

對指令執行的要求同入棧指令。

例如:POP   AX                                圖2-8

POP   [BX]                          

POP   DS

 

3.交換指令  XCHG

一般格式:XCHG OPRD1,OPRD2

功能:完成數據交換

這是—條交換指令,把一個字節或一個字的源操作數與目的操作數相交換。交換能在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲器之間進行。但段寄存器和立即數不能作為一個操作數,不能在累加器之間進行。

例如: XCHG  AL,CL

XCHG  AX,DI

XCHG  BX,SI

XCHG  AX,BUFFER

XCHG  DATA[SI],DH

 

4.累加器專用傳送指令

有三種,輸入、輸出和查表指令。前兩種又稱為輸入輸出指令。

⑴  IN 指令

一般格式: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]

功能:從I/O端口輸入數據至AL或AX。

輸入指令允許把一個字節或一個字由一個輸入端口傳送到AL或AX中。若端口地址超過255時,則必須用DX保存端口地址,這樣用DX作端口尋址最多可尋找64K個端口。

⑵  OUT 指令

一般格式:OUT  n,AL  ;   B    AL→[n]

           OUT  n,AX  ;   W   AX→[n+1][n]

     OUT  DX,AL ;  B    AL→[DX]

     OUT  DX,AX ;  W   AX→[DX+1][DX]

功能:將AL或AX的內容輸出至I/O端口。

該指令將AL或AX中的內容傳送到一個輸出端口。端口尋址方式與IN指令相同。

⑶  XLAT指令

一般格式:XLAT     ;     AL=(DX)×16+(BX)+(AL))

功能:完成一個字節的查表轉換。

要求:①寄存器AL的內容作為一個256字節的表的下標。②表的基地址在BX中,③轉換后的結果存放在AL中.                         

例如:MOV   BX,OFFSET TABLE                      

MOV   AL,8                               

IN   AL,1                                 

XLAT  ;查表                                   

OUT   1,AL  ;(AL)= AAH                      

本指令可用在數制轉換、函數表查表、代碼轉換等場合。

 

5.地址傳送指令(有三條地址傳送指令)

⑴  LEA (Load Effective Address)

一般格式: LEA OPRD1,OPRD2

功能:把源操作數OPRD2的地址偏移量傳送至目的操作數OPRD1。

要求:①源操作數必須是一個內存操作數,②目的操作數必須是一個16位的通用寄存器。這條指令通常用來建立串操作指令所須的寄存器指針。

例:LEA  BX,BUFR;把變量BUFR的地址偏移量部分送到BX

 

⑵  LDS (Load pointer into DS)

一般格式: LDS  OPRD1,OPRD2

功能:完成一個地址指針的傳送。地址指針包括段地址部分和偏移量部分。指令將段地址送入DS,偏移量部分送入一個16位的指針寄存器或變址寄存器。

要求:源操作數是一個內存操作數,目的操作數是一個通用寄存器/變址寄存器。

例如:LDS SI,[BX] ;將把BX所指的32位地址指針的段地址部分送入DS,偏移量部分送入SI。

如下圖所示。

⑶ LES (Load pointer into ES)          

一般格式: LES  OPRD1,OPRD2

這條指令除將地址指針的段地址部分送入ES外,與LDS類似。例如: LES  DI,[BX+COUNT]

 

6.標志寄存器傳送(有四條標志傳送指令)

⑴ LAHF (LOAD  AH  WITH  FLAG)

將標志寄存器中的SF、ZF、AF、PF和CF(即低8位)傳送至AH寄存器的指定位,空位沒有定義。

⑵ SAHF (STORE  AH  WITH  FLAG)

將寄存器AH的指定位,送至標志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根據AH的內容,影響上述標志位,對OF、DF和IF無影響。

⑶ PUSHF (PUSH  FLAG)

將標志寄存器壓入堆棧頂部,同時修改堆棧指針,不影響標志位。

⑷ POPF (POP  FLAG)

堆棧頂部的一個字,傳送到標志寄存器,同時修改堆棧指針,影響標志位。

 

二、算術運算指令

8086/8088提供加、減、乘、除四種基本算術操作。這些操作都可用於字節或字的運算,也可以用於帶符號數與無符號數的運算。   帶符號數用補碼表示。同時8086/8088也提供了各種校正操作,故可以進行十進制算術運算。

參與加、減運算的操作數可如上圖所示。

1.加法指令 (Addition)

⑴一般形式:ADD OPRD1,OPRD2   

功能:OPRD1←OPRD1+OPRD2

完成兩個操作數相加,結果送至目的操作數OPRD1。目的操作數可以是累加器,任一通用寄存器以及存儲器操作數。

例如:

ADD AL,30;累加器與立即數相加

ADD BX,[3000H];通用寄存器與存儲單元內容相加

ADD DI,CX;通用寄存器之間

ADD DX,DATA[BX+SI];通用寄存器與存儲單元內容相加

ADD BETA[SI],DX;存儲器操作數與寄存器相加

這些指令對標志位CF、DF、PF、SF、ZF和AF有影響。

⑵一般形式:ADC  OPRD1,OPRD2;帶進位的加法

功能:OPRD1←OPRD1+OPRD2 +CF

這條指令與上—條指令類似,只是在兩個操作數相加時,要把進位標志CF的現行值加上去,結果送至目的操作數。

ADC指令主要用於多字節運算中。若有兩個四字節的數,已分別放在自FIRST和SECOND開始的存儲區中,每個數占四個存儲單元。存放時,最低字節在地址最低處,則可用以下程序段實現相加。

MOV  AX,FIRST

ADD  AX,SECOND;進行字運算

MOV  THIRD,AX

MOV  AX,FIRST+2

ADC  AX,SECOND+2

MOV  THIRD+2,AX

這條指令對標志位的影響與ADD相同。

⑶一般形式:INC  OPRD   ;

功能:OPRD←OPRD+1

完成對指定的操作數OPRD加1,然后返回此操作數。此指令主要用於在循環程序中修改地址指針和循環次數等。

這條指令執行的結果影響標志位AF、OF、PF、SF和ZF,而對進位標志沒有影響。

如:INC AL    

INC  [BX]

2.減法指令(Subtraction)

⑴一般形式:SUB OPRD1,OPRD2  ;

功能:OPRD1←OPRD1-OPRD2

完成兩個操作數相減,也即從OPRD1中減去OPRD2,結果放在OPRD1中。

例如:  SUB CX,BX

    SUB [BP],CL

⑵一般形式:SBB  OPRD1,OPRD2   ;

功能:OPRD1←OPRD1-OPRD2-CF

這條指令與SUB類似,只是在兩個操作數相減時,還要減去借位標志CF的現行值.本指令對標志位AF、CF、OF、PF、SF和ZF都有影響。

同ADC指令一樣,本指令主要用於多字節操作數相減。

⑶一般形式:DEC  OPRD    ;

功能:OPRD←OPRD-1-CF

對指令的操作數減1,然后送回此操作數,

在相減時,把操作數作為一個無符號二進制數來對待。指令執行的結果,影響標志AF、OF、PF、SF和ZF.但對CF標志不影響(即保持此指令以前的值)。

例如:  DEC  [SI]

        DEC   CL

⑷一般形式:NEG  OPRD   

功能:  (NEGDate)  取補

對操作數取補,即用零減去操作數,再把結果送回操作數。

例如: NEG AL

        NEG   MULRE

(AL=0011 1100)則取補后為1100 0100

即0000 0000-0011 1100=1100 0100

若在字節操作時對-128,或在字操作時對-32768取補,則操作數沒變化,但標志OF置位。

此指令影響標志AF、CF、OF、PF、SF和ZF。此指令的結果一般總是使標志CF=1。除非在操作數為零時,才使CF=0。

⑸一般形式:CMP OPRD1,OPRD2    ;

功能: OPRD1-OPRD2

比較指令完成兩個操作數相減,使結果反映在標志位上,但並不送回結果(即不帶回送的減法)。

例如:  CMP   AL,100

CMP   DX,DI

CMP   CX,COUHT[BP]

CMP   COUNT[SI],AX

比較指令主要用於比較兩個數之間的關系。在比較指令之后,根據ZF標志即可判斷兩者是否相等。

² 相等的比較:

①若兩者相等,相減以后結果為零,ZF標志為1,否則為0。

②若兩者不相等,則可在比較指令之后利用其它標志位的狀態來確定兩者的大小。

² 大小的比較:

如果是兩個無符號數(如CMP AX,BX)進行比較,則可以根據CF標志的狀態判斷兩數大小。若結果沒有產生借位(CF=0),顯然AX≥BX;若產生了借位(即CF=1),則AX<BX。

 

 

3.乘法指令(分為無符號乘法指令和帶符號乘法指令兩類)

(1) 無符號乘法指令MUL

   一般格式:  MUL  OPRD      

完成字節與字節相乘、字與字相乘,且默認的操作數放在AL或AX中,而源操作數由指令給出。8位數相乘,結果為16位數,放在AX中;16位數相乘結果為32位數,高16位放在DX,低16位放在AX中。注意:源操作數不能為立即數

例如:

MOV  AL,FIRST;

MUL  SECOND   ;結果為AX=FIRST*SECOND

MOV   AX,THIRD;

MUL   AX       ;結果DX:AX=THIRD*THIRD

MOV   AL,30H

CBW            ; 字擴展AX=30H

MOV   BX,2000H

MUL   BX      ;

(2) 帶符號數乘法指令IMUL

   一般格式:IMUL   OPRD       ;OPRD  為源操作數

這是一條帶符號數的乘法指令,同MUL一樣可以進行字節與字節、字和字的乘法運算。結果放在AX或DX,AX中。當結果的高半部分不是結果的低半部分的符號擴展時,標志位CF和OF將置位。

4.除法指令

(1) 無符號數除法指令 DIV

一般格式:DIV  OPRD

 (2) 帶符號數除法IDIV

一般格式:IDIV  OPRD

該指令執行過程同DIV指令,但IDIV指令認為操作數的最高位為符號位,除法運算的結果商的最高位也為符號位。

在除法指令中,在字節運算時被除數在AX中;運算結果商在AL中,余數在AH中。字運算時被除數為DX:AX構成的32位數,運算結果商在AX中,余數在DX中。

例如:AX=2000H,DX=200H,BX=1000H,則 DIV BX執行后,AX=2002H ,DX=0000。

除法運算中,源操作數可為除立即尋址方式之外的任何一種尋址方式,且指令執行對所有的標志位都無定義。

由於除法指令中的字節運算要求被除數為16位數,而字運算要求被除數是32位數,在8086/8088系統中往往需要用符號擴展的方法取得被除數所要的格式,因此指令系統中包括兩條符號擴展指令。

(3) 字節擴展指令CBW

一般格式:CBW

該指令執行時將AL寄存器的最高位擴展到AH,即若D7=0,則AH=0;否則AH=0FFH。

(4) 字擴展指令CWD

一般格式:CWD

該指令執行時將AX寄存器的最高位擴展到DX,即若D15=0,則DX=0;否則DX=0FFFFH。

CBW、CWD指令不影響標志位。

5.十進制調整指令

計算機中的算術運算,都是針對二進制數的運算,而人們在日常生活中習慣使用十進制。為此在8086/8088系統中,針對十進制算術運算有一類十進制調整指令。

在計算機中人們用BCD碼表示十進制數,對BCD碼計算機中有兩種表示方法:一類為壓縮BCD碼,即規定每個字節表示兩位BCD數;另一類稱為非壓縮BCD碼,即用一個字節表示一位BCD數,在這字節的高四位用0填充。例如,十進制數25D,表示為壓縮BCD數時為:25H;表示為非壓縮BCD數時為:0205H,用兩字節表示。

相關的BCD轉換指令見表。

 十進制調整指令

指令格式

指令說明

DAA

壓縮的BCD碼加法調整

DAS

壓縮的BCD碼減法調整

AAA

非壓縮的BCD碼加法調整

AAS

非壓縮的BCD碼減法調整

AAM

乘法后的BCD碼調整

AAD

除法前的BCD碼調整

例如:

ADD   AL,BL

DAA

若執行前:AL=28H,BL=68H,則執行ADD后:AL=90H,AF=1;再執行DAA指令后,正確的結果為:AL=96H,CF=0,AF=1。

MUL  BL

AAM

若執行前:AL=07,BL=09,則執行MUL BL 后,AX=003FH,再執行AAM指令后,正確的結果為:AH=06H,AL=03H。

注意:BCD碼進行乘除法運算時,一律使用無符號數形式,因而AAM 和AAD應固定地出現在MUL之前和DIV之后。

 

三、  邏輯運算和移位指令

1.邏輯運算指令

(1) 一般格式:NOT  OPRD

功能:對操作數求反,然后送回原處,操作數可以是寄存器或存儲器內容。此指令對標志無影響。例如:NOT AL

(2) 一般格式:AND  OPRD1,OPRD2

功能:對兩個操作數進行按位的邏輯“與”運算,結果送回目的操作數。

其中目的操作數OPRD1可以是累加器、任一通用寄存器,或內存操作數(所有尋址方式)。源操作數OPRD2可以是立即數、寄存器,也可以是內存操作數(所有尋址方式)。

8086/8088的AND指令可以進行字節操作,也可以進行字操作。

例如:  AND AL,0FH   ;可完成拆字的動作

AND   SI,SI     ;    將SI清0

(3) 一般格式:TEST  OPRD1,OPRD2

功能:完成與AND指令相同的操作,結果反映在標志位上,但並不送回。通常使用它進行測試,

例如 若要檢測 AL中的最低位是否為1,為1則轉移。可用以下指令:

TEST AL,01H

JNZ    THERE

……

THERE:

若要檢測CX中的內容是否為0,為0則轉移。該如何做呢?

(4) 一般格式:OR  OPRD1,OPRD2

功能:對指定的兩個操作數進行邏輯“或”運算。結果送回目的操作數。

其中,目的操作數OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一個內存操作數(所有尋址方式)。源操作數OPRD2,可以是立即數、寄存器,也可以是內存操作數(所有尋址方式)。

AND  AL,0FH

AND AH,0FOH

OR AL,AH   ; 完成拼字的動作

OR AX,0FFFH ;將AX低12位置1

OR BX,BX ;  清相應標志

(5) 一般格式:XOR  OPRD1,OPRD2

功能:對兩個指定的操作數進行“異或”運算,結果送回目的操作數。

其中,目的操作數OPRD1可以是累加器,可以是任一個通用寄存器,也可以是一個內存操作數(全部尋址方式)。源操作數可以是立即數、寄存器,也可以是內存操作數(所有尋址方式)。例如:

XOR AL,AL   ;使AL清0

XOR SI,SI     ;使SI清0

XOR  CL,0FH    ;使低4位取反,高4位不變

邏輯運算類指令中,單操作數指令NOT的操作數不能為立即數,雙操作數邏輯指令中,必須有一個操作數為寄存器尋址方式,且目的操作數不能為立即數。它們對標志位的影響情況如下:NOT不影響標志位,其它四種指令將使CF=OF=0,AF無定義,而SF、ZF和PF則根據運算結果而定。

 

2.移位指令

(1)算術/邏輯移位指令

① 算術左移或邏輯左移指令  

SAL/SHL   OPRD,M  ;

② 算術右移指令      SAR  OPRD,M  

③ 邏輯右移指令      SHR  OPRD,M  

M是移位次數,可以是1或寄存器CL

這些指令可以對寄存器操作數或內存操作數進行指定的移位,可以進行字節或字操作;可以一次只移1位,也可以移位由寄存器CL中的內容規定的次數。

(2)循環移位指令

ROL  OPRD,M    ;左循環移位

ROR  OPRD,M    ;右循環移位

RCL  OPRD,M  ;帶進位左循環移位

RCR  OPRD,M ;帶進位右循環移位

前兩條循環指令,未把標志位CF包含在循環的環中,后兩條把標志位CF包含在循環的環中,作為整個循環的一部分。

循環指令可以對字節或字進行操作。操作數可以是寄存器操作數,也可以是內存操作數。可以是循環移位一次,也可以循環移位由CL的內容所決定的次數。

左移一位,只要左移以后的數未超出一個字節或一個字的表達范圍,則原數的每一位的權增加了一倍,相當於原數乘2。右移—位相當於除以2。

在數的輸入輸出過程中乘10的操作是經常要進行的。而X10=X*2+X*8,也可以采用移位和相加的辦法來實現*10。為保證結果完整,先將AL中的字節擴展為字。

MOV   AH,0                        

SAL    AX,1   ;X*2               

MOV   BX,AX  ;移至BX中暫存    

SAL    AX,1   ;X*4               

SAL    AX,1   ;X*8               

ADD   AX,BX  ;X*10             

 

、  程序控制指令

轉移類指令可改變CS與IP的值或僅改變IP的值,以改變指令執行的順序。

  1.無條件轉移、調用和返回指令

  (1) 無條件轉移指令JMP     分直接轉移和間接轉移兩種。

  一般格式:  JMP OPRD    ;OPRD是轉移的目的地址

 直接轉移的3種形式為:

· 短程轉移  JMP  SHORT OPRD   ;IP=IP+8位位移量

目的地址與JMP指令所處地址的距離應在-128~127范圍之內。

· 近程轉移  JMP  NEAR PTR  OPRD   ;IP=IP+16位位移量

    或  JMP  OPRD    ;NEAR可省略

目的地址與JMP指令應處於同一地址段范圍之內。

· 遠程轉移  JMP  FAR  PTR  OPRD ;IP=OPRD的段內位移量,CS=OPRD所在段地址。

遠程轉移是段間的轉移,目的地址與JMP指令所在地址不在同一段內。執行該指令時要修改CS和IP的內容。

間接轉移指令的目的地址可以由存儲器或寄存器給出。

· 段內間接轉移  JMP  WORD  PTR OPRD  ;IP=[EA] (由OPRD的尋址方式確定)。

JMP  WORD  PTR[BX]   IP=((DS)*16+(BX))

JMP  WORD  PTR BX    IP=(BX)

· 段間間接轉移 JMP  DOWRD  PTR  OPRD;IP=[EA],CS=[EA+2]

該指令指定的雙字節指針的第一個字單元內容送IP,第二個字單元內容送CS。

JMP   DWORD PTR [BX+SI]

(2) 調用和返回指令  

CALL指令用來調用一個過程或子程序。由於過程或子程序有段間(即遠程FAR)和段內調用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。。因此RET也分段間與段內返回兩種。

  調用指令一般格式為:

  段內調用: CALL  NEAR PTR OPRD ;,

操作:SP=SP-2,((SP)+1),(SP))=IP,IP=IP+16位位移量

CALL指令首先將當前IP內容壓入堆棧。當執行RET指令而返回時,從堆棧中取出一個字放入IP中。

段間調用:CALL  FAR  PTR OPRD  ;

操作:SP=SP-2,((SP)+1),(SP))=CS;SP=SP-2,((SP)+1),(SP))=IP;IP=[EA];CS=[EA+2]

CALL指令先把CS壓入堆棧,再把IP壓入堆棧。當執行RET指令而返回時,從堆棧中取出一個字放入IP中,然后從堆棧中再取出第二個字放入CS中,作為段間返回地址。

返回指令格式有:

RET     ;SP=((SP+1),SP),SP=SP+2   

RET  n  ;SP=((SP+1),SP),SP=SP+2  SP=SP+n

RET n指令要求n為偶數,當RET正常返回后,再做SP=SP+n操作。

 

2.條件轉移指令

8088有18條不同的條件轉移指令。它們根據標志寄存器中各標志位的狀態,決定程序是否進行轉移。條件轉移指令的目的地址必須在現行的代碼段(CS)內,並且以當前指針寄存器IP內容為基准,其位移必須在十127~—128的范圍之內。

條件轉移指令表

匯編格式  

操    作   

標志位轉移指令

 

JZ/JE/JNZ/JNE   OPRD

結果為零/結果不為零轉移

JS/JNS   OPRD

結果為負數/結果為正數轉移

JP/JPE/JNP/JPO   OPRD

結果奇偶校驗為偶/結果奇偶校驗為奇轉移

JO/JNO    OPRD

結果溢出/結果不溢出轉移

JC/JNC    OPRD

結果有進位(借位)/結果無進位(借位)轉移

不帶符號數比較轉移指令

 

JA/JNBE   OPRD

高於或不低於等於轉移

JAE/JNA   OPRD

高於等於或不低於轉移

JB/JNAE   OPRD

小於或不大於等於轉移

JBE/JNA   OPRD

小於等於或不大於轉移

帶符號數比較轉移指令

 

JG/JNLE   OPRD

高於或不低於等於轉移

JGE/JNL   OPRD

高於等於或不低於轉移

JL/JNGE   OPRD

小於或不大於等於轉移

JLE/JNG   OPRD

小於等於或不大於轉移

測試轉移指令

 

JCXZ      OPRD  

CX=0 時轉移

從該表可以看到,條件轉移指令是根據兩個數的比較結果或某些標志位的狀態來決定轉移的。在條件轉移指令中,有的根據對符號數進行比較和測試的結果實現轉移。這些指令通常對溢出標志位OF和符號標志位SF進行測試。對無符號數而言,這類指令通常測試標志位CF。對於帶符號數分大於、等於、小於3種情況;對於無符號數分高於、等於、低於3種情況。在使用這些條件轉移指令時,一定要注意被比較數的具體情況及比較后所能出現的預期結果。

 

3.循環控制指令

對於需要重復進行的操作,微機系統可用循環程序結構來進行,8086/8088系統為了簡化程序設計,設置了一組循環指令,這組指令主要對CX或標志位ZF進行測試,確定是否循環。

 

循環指令表

指令格式

執行操作

LOOP  OPRD

CX=CX-1;若CX<>0,則循環

LOOPNZ/LOOPNE  OPRD

CX=CX-1,若CX<>0 且ZF=0,則循環

LOOPZ/LOOPE   OPRD

CX=CX-1,若CX<>0 且ZF=1,則循環


免責聲明!

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



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