寻址方式与指令系统

来源:互联网 发布:信贷规模数据 编辑:程序博客网 时间:2024/06/05 11:32

寻址方式与指令系统

一、寻址方式

计算机的一条指令基本上包含两部分:

       操作码 操作数

其中,操作码规定了指令应完成的具体操作,在汇编语言中操作码用助记符表示。

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、  外部同步指令

 

 

 

 

0 0
原创粉丝点击