尋址方式與指令系統

尋址方式與指令系統

一、尋址方式

計算機的一條指令基本上包含兩部分:

       操作碼 操作數

其中,操作碼規定了指令應完成的具體操作,在彙編語言中操作碼用助記符表示。

1、 隱含操作數尋址方式(隱含尋址)

(操作數隱含在指令代碼中)

DAA

這是一條十進制加法調整指令。

2、 立即操作數尋址方式(立即尋址)

(操作數是一個常數)

3、 寄存器操作數的尋址方式(寄存器尋址)

(指令要操作的操作數在CPU內部的寄存器中)

4.存儲器操作數的尋址方式

在程序中,一個存儲單元的地址是採用邏輯地址形式表示的,即:

段基址:偏移量

1、 直接尋址

這種尋址方式是在指令中直接給出存儲器操作數的偏移地址。有效地址EA可直接由偏移地址得到。

(1)   用常數表示。

MOV AX , DS : [100H]

該指令把當前數據量便宜100H的數字存儲單元的數據送至AX。用常數表示時,段寄存器必須指明,不能缺省。

(2)   用變量名錶示。

MOV BX , VAR

MOV AH , DA+2

第一條指令將由變量名VAR所指的存儲單元內容傳送給BX。

第二條指令將由變量名DA代表的地址偏移量再加2的那個字節單元內容送給AH。

假設VAR的偏移量爲1000H,DA的偏移量爲2000H,則上述兩條指令等效爲:

MOV BX , DS:[1000H]

MOV AH , DS:[2002H]

2、 寄存器間接尋址

寄存器間接尋址表示的偏移地址由三個地址分量的某種組合形式表示,這三個地址分量爲:

(1)基址。由基址寄存器BX或基址指針BP提供的偏移地址。

(2)變址。由源變址寄存器SI或目的變址寄存器DI提供的偏移地址。

(3)位移量。一個8爲或16位常數。

1)基址尋址。格式:

[基址寄存器]

[基址寄存器+位移量]

位移量[基址寄存器]

例:

MOV AH , [BX+VAR]

MOV AH , VAR[BX]

2)變址尋址。例:

MOV AX , ARRY[SI]

MOV [DI] ,BX

MOV DX , [SI+Z]

3)基址變址尋址。格式:

[基址寄存器+變址寄存器]

[基址寄存器][變址寄存器]

[基址寄存器+變址寄存器+位移量]

位移量[基址寄存器][變址寄存器]

位移量[基址寄存器+變址寄存器]

[基址寄存器][變址寄存器+位移量]

[基址寄存器+位移量][變址寄存器]

例:

MOV ARRY[SI][BX] , AX

MOV CL , [BX+DI+100H]

MOV DX , [BP][DI]

注意:(1)能夠作爲間址寄存器的只能是BX,BP,SI,DI,其他任何寄存器不具備間址功能。

(3)    用BX、SI、DI做間址寄存器尋找操作數時,隱含規定段基值由DS提供。當用BP做間址寄存器來尋找操作數時,隱含規定段基值由SS提供。

4、  段基址的隱含約定

操作類別                     段基址(默認)               偏移地址

取指令                         CS                               IP

堆棧操作                     SS                               SP

串操作的源                  DS                               SI

串操作的目的              ES                               DI

以BP作基址尋址        SS                               根據尋址方式計算出來的有效地址

尋取一般變量              DS                               根據尋址方式計算出來的有效地址

5、  隱含段的改變方法

1)段更換

PUSH DS

PUSH CS

POP DS

2)用ASSUME僞指令重新指定當前段

3)段超越

例:

MOV AL , [BP]            ;AL←SS:[BP]

MOV AL , DS:[BP]       ;AL←DS:[BP]

MOV BL , [SI]             ;BL←DS:[SI]

MOV BL ,CS:[SI]        ;BL←CS:[SI]

 

二、指令系統

1、  指令分類

傳送類指令

算術運算類指令

位操作類指令

串操作類指令

程序轉移類指令

處理控制類指令

2、  指令格式

(1)    雙操作數指令:

OPR DEST ,SRC

(2)    單操作數指令:

OPR DEST

(3)    無操作數指令:

OPR

3、  指令規則

8086/8088彙編語言指令共同遵循如下規則:

(1)除通用數據傳送指令(MOV,PUSH,POP)之外,段寄存器不允許作爲操作數。

(2)段寄存器不能直接用立即數賦值。

(3)代碼段寄存器CS和立即數不能做目的操作數。

(4)指令中兩個操作數不能同時爲段寄存器。

(5)指令中兩個操作數不能同時爲存儲器操作數(穿指令除外)。

(6)指令中兩個操作數的類型(字節類型或字類型)必須一致。

(7)指令中至少要有一個操作數的類型是明確的,否則需用操作符PTR臨時指定操作類型。

通用數據傳送指令

1)     傳送指令(Move)

指令格式:MOV DEST, SRC

功能:把源操作數的指令送給目的操作數。即DEST←SRC。

2)     進棧指令(Push Word Onto Stack)

指令格式:PUSH SRC

操作:(1)堆棧指針減2指向新的棧頂SP←SP-2

(2)將給定的操作數放入SP指示的字單元中。

說明:進棧指令的操作數是一個16位的寄存器操作數或存儲器操作數,不允許是立即數。

3)     出棧指令(Pop Word Off Stack Into Destination)

指令格式:POP DEST

操作:(1)將棧頂的字數據送入操作數DEST中,DEST←(SP+1 , SP)

(2)堆棧指針加2指向新棧頂SP←SP+2。

交換指令(Exchange)

指令格式:XCHG DEST, SRC

操作:將兩個操作數的內容互換,即(DEST) ←→(SRC)

查表指令(Translate)

指令格式:XLAT

功能:AL←(BX+AL)即,將數據段(DS)中的偏移地址BX+AL的內存字節單元的內容送入AL中。

地址傳送指令

地址傳送指令共三條,他們不是傳送存儲器操作數的內容,而是傳送它的地址(偏移量,段基值)。

1)     裝入有效地址(Load Effective Address)

指令格式:LEA DEST, SRC

功能:將操作數的偏移量(即有效地址EA)送給目的操作數的通用寄存器。

2)     裝入地址指針

(1)LDS DEST,SRC

(2)LES DEST,SRC

功能:將雙字長存儲器操作數SRC的低地址字單元內容送入指定的寄存器DEST中,而將雙字長存儲器操作數SRC的高地址字單元內容送入DS(LDS)或ES(LES)。

標誌傳送指令(FlagsTransfer)

1)     取標誌寄存器

指令格式:LAHF

功能:把標誌寄存器的低8位傳送給AH寄存器。

2)     存儲標誌寄存器

指令格式:SAHF

功能:把寄存器AH中的7、6、4、2、0位的內容分別送入標誌寄存器SF、ZF、AF、PF和CF各標誌位。

3)     標誌進棧

指令格式:PUSHF

功能:首先把堆棧指針SP減2,然後將16位標誌寄存器的全部內容(含所有標誌位)送入SP指向的堆棧頂部。

4)     標誌出棧

指令格式:POPF

算術運算類指令

二進制加法運算指令

1)     加法

ADD dest , src      ;dest←dest+src

2)     帶進位加

ADC dest , src              ;dest←dest+src+CF

3)     加1

INC dest                ;dest←dest+1

二進制減法運算指令

1)     減法

SUB dest , src       ;dest←dest-src

2)     帶借位減

SBB dest , src        ;dest←dest-src-CF

3)     減1

DEC dest               ;dest←dest-1

4)     比較

CMP dest , src        ;dest-src

5)     取補

NEG dest                     ;dest←0-dest

NEG對標誌位影響有特殊規定,如果被取補的操作數非0,NEG操作後,CF=1,否則CF=0。

二進制乘法運算指令

1)     無符號數乘法

MUL src         ;若src爲字節長度則AX←AL*src

                     ;若src爲字長度則DX:AX←AX*src

2)     帶符號數乘法

IMUL src        ;操作同MUL指令

二進制除法指令

1)     無符號數除法指令

DIV src          ;若src爲字節數據:AX/src,AL←商,AH←餘數

                     ;若src爲字數據:DX:AX/src,AX←商,DX←餘數

2)     帶符號數除法指令

IDIV src         ;操作同DIV指令

十進制算術運算指令

1)非組合十進制加法調整指令AAA

2)組合十進制加法調整指令DAA

3)非組合十進制減法調整指令AAS

4)組合十進制調整指令DAS

5)非組合十進制乘法調整指令AAM

6)非組合十進制除法調整指令AAD

位操作指令

邏輯運算指令(Logical)

1)     邏輯“與”指令

AND dest , src             ;CF=0,OF=0

2)     邏輯“”指令

OR dest , src                 ;CF=0,OF=0

3)     邏輯“”指令

XOR dest , src                     ;CF=0,OF=0

4)     邏輯“”指令

NOT dest                      ;

5)     邏輯“”指令

TEST dest , src             ;測試dest和src的與

移位和循環移位指令

邏輯左移SHL dest ,cnt

邏輯右移 SHR dest, cnt

算術左移 SAL dest, cnt

算術右移 SAR dest, cnt

循環左移 ROL dest, cnt

循環右移 ROR dest, cnt

帶進位循環左移 RCLdest , cnt

帶進位循環右移 RCRdest , cnt

轉移類指令

無條件轉移指令

指令格式:JMP targ

操作:(1)段內轉移:IP←目標的偏移地址

(2)段間轉移:IP←目標的偏移地址,CS←目標所處代碼段基址。

條件轉移指令

 

循環控制指令

1)     無條件循環控制指令

指令格式:LOOP targ

功能:若CX-1≠0則轉移,否則退出循環。

2)     相等循環控制指令

指令格式:LOOPZtarg 或 LOOPE targ

功能:若CX-1≠0(規定的循環次數沒用完)且ZF=1則轉移,否則退出循環。

3)     不等循環控制指令

指令格式:LOOPNZtarg 或 LOOPNE targ

功能:若CX-1≠0(規定的循環次數沒用完)且ZF=0則轉移,否則退出循環。

另外還有一條JCXZ指令可用於循環控制:

指令格式:JCXZ targ

功能:若CX = 0 則跳出循環,否則執行後續指令。

串操作指令

1、 串操作指令的隱含規定

(1)源串指針:DS:SI;

目的串指針:ES:DI。

(2)重複次數計數器:CX(加重複前綴時)。

(3)操作方向:DF=0正向(SI、DI自動增加修改);DF=1負向(SI、DI自動減量修改);注意:操作方向可以用CLD和STD指令設置。

(4)指令SCAS、LODS、STOS約定累加器爲一個操作數。

2、串操作指令格式與功能

1)串傳送

(1)MOVSB

(2)MOVSW

2)串比較

(1)CMPSB

(2)CMPSW

3)串搜索

(1)SCASB

(2)SCASW

4)從源串中取數

(1)LODSB

(2)LODSW

5)往目的串中取數

(1)STOSB

(2)STOSW

串操作的重複前綴

1)      無條件重複前綴REP

2)      相等重複前綴 REPZ/REPE

3) 不相等重複前綴 REPNZ/REPNE

處理控制類指令

1、  標誌位操作指令

CLC

STC

CMC

CLD

STD

CLI

STI

2、  空操作指令

3、  外部同步指令

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章