寻址模式

  大多数指令有一个或多个操作数,指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。IA32 支持的操作数格式:

        1)立即数(imm,常数值),在 ATT 格式的汇编中,书写方式是‘$’ 后面跟一个用标准 C 表示法表示的整数。 

        2)寄存器,它表示某个寄存器的内容。用符号Ea来表示任意寄存器 a,用引用 R[Ea] 来表示它的值,这是将寄存器集合看成一个数组 R,用寄存器标识符作为索引。

        3)存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。因为将存储器看成一个很大的字节数组,用符号Mb[Addr]表示对存储在存储器中从地址Addr 开始的 b 个字节值的引用。为了方便,通常省去下方的 b。

        如下图所示,有很多不同的寻址方式,允许不同形式的存储器引用。表中底部用语法 Imm(Ea, Eb, s) 表示的是最常用的形式。这样的引用有四个组成部分:一个立即数偏移 Imm, 一个基址寄存器 Eb , 一个变址寄存器 Ei和一个比例因子 s,这里 s 必须是 1、 2、 4 或者 8。然后,有效地址被计算为 Imm + R[] + R[] * s。应用数组元素时,会用到这种通用形式。其他形式都是通过通用形式的特殊情况,只是省略了某些部分。当引用数组和结构元素时,比较复杂的寻址模式是很有用的。


类型

格式

操作数值

名称

立即数

$Imm

Imm

立即数寻址

寄存器

Ea

R[Ea]

寄存器寻址

存储器

Imm

M[Imm]

绝对寻址

存储器

(Ea)

M[R[Ea]]

间接寻址

存储器

Imm(Ea)

M[Imm + R[Ea]]

(基址+偏移量) 寻址

存储器

(Eb, Ei)

M[R[Eb] + R[Ei]]

变址寻址

存储器

Imm(Eb, Ei)

M[R[Eb]+R[Ei]+Imm]

变址寻址

存储器

(, Ei, s)

M[R[Ei]*s]

比例变址寻址

存储器

Imm(, Ei, s)

M[Imm + R[Ei]*s]

比例变址寻址

存储器

(Eb, Ei, s)

M[Eb + Ei * s]

比例变址寻址

存储器

Imm(Eb, Ei, s)

M[Imm+E[Eb]+E[i]*s]

比例变址寻址

 

对于寻址方式的理解:

寻址方式就是寻找操作数或操作数地址的方式。8086提供了与操作数有关和与I/O端口地址有关的两类寻址方式。与操作数有关的寻址方式有七种,分别是立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址加变址寻址,相对基址加变址寻址;与I/0端口有关的寻址方式有直接端口寻址和间接端口寻址方式。另外还有隐含寻址,即把要寻找的地址包含在操作码中。

编辑本段立即数寻址方式

  操作数直接存放在指令中,紧跟在操作码之后的寻址方式就是立即数寻址方式,这种寻址方式的操作码后面的字节内容就是操作数本身,不需要在其他地址单元去取。  例如:  MOV AX,2345H  MOV AL,0EH

编辑本段寄存器寻址

  指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的 寻址方式称为寄存器寻址方式。   例如:  MOV AX,BX  ADD AX,BX

编辑本段存储器寻址方式

  8086 指令系统提供了以下5种针对存储器的寻址方式。  直接寻址、寄存器间接寻址、 寄存器相对寻址、基址加变址寻址和相对基址加变址寻址。用于说明操作数所在 存储单元的地址。由于总线接口单元BIU能根据需要自动引用 段寄存器得到段值,所以这五种方式也就是确定存放操作数的存储单元有效地址EA的方法。有效地址EA是一个16位的无符号数,在利用这五种方法计算有效地址时,所得的结果认为是一个无符号数。  (1).直接寻址:   指令中给出的地址码即为操作数的有效地址,就是 直接寻址方式。  例子: MOV AX,[2000H] -->2000H为存放操作数单元号的符号地址  MOV AX,2000H -->2000H为源操作数,立即数  上面两者是不等效的

(2).寄存器间接寻址方式:

  操作数在存储器中,操作数的有效地址用SI,DI,BX和BP 四个寄存器之一来指定  例子: MOV AX,[BX]   计算公式: 物理地址=16d*(DS)+(BX)   物理地址=16d*(DS)+(SI)   物理地址=16d*(DS)+(DI)   物理地址=16d*(SS)+(BP)

(3).寄存器相对寻址方式:

  你就想成:你要找的"门户号(家)"其实就在你家的楼上或者楼下,你要找到它,就 必须知道它在你楼上几楼,或者在楼下几楼!就OK了!   例子: MOV AX,COUNT[SI]   MOV AX,[COUNT+SI]   其中 COUNT为位移量的符号地址   计算公式: 物理地址=16d*(DS)+(BX)+8位位移量   物理地址=16d*(DS)+(BX)+16位位移量  物理地址=16d*(DS)+(BX)+16位位移量  物理地址=16d*(SS)+(BP)+8位偏移量

(4).基址变址寻址方式:

  你就想成:你要找的"门户号(家)"是跟住在同一栋楼的不同"单元号",你要找到它,就必须知道它是该栋的哪个"单元号",并且住在几楼!那样你就可以找到它了 !   例子: MOV AX,[BX][DI]   MOV AX,[BX+DI]   计算公式: 物理地址=16d*(DS)+(BX)+(SI)  物理地址=16d*(DS)+(BX)+(DI)   物理地址=16d*(SS)+(BP)+(SI)   物理地址=16d*(SS)+(BP)+(DI)

(5).相对基址变址寻址方式:

  你就想成:你要找的"门户号(家)"是跟住在同一栋楼的不同"单元号",它比你高几层楼或者低几层楼,然后用的你目前的楼数+/-就可以得出你要找的住在几楼了!   例子: MOV AX,MASK[BX][SI]   MOV AX,MASK[BX+SI]   MOV AX,[MASK+BX+SI]   以上三个例子是等效的!!   计算公式: 物理地址=16d*(DS)+(BX)+(SI)+8位位移量   物理地址=16d*(DS)+(BX)+(DI)+16位位移量  物理地址=16d*(SS)+(BP)+(SI)+8位位移量  物理地址=16d*(SS)+(BP)+(DI)+16位位移量  上述共计七种操作数寻址方式,与 80C51单片机的完全一致。

编辑本段与I/0端口有关的寻址方式

  8086微处理器采用独立编址的I/0端口,有专门的输入指令IN和输出指令OUT,寻址方式有以下两种。

直接端口寻址

  直接端口寻址是在指令中直接给出要访问的端口地址,一般采用2位十六进制数表示,也可以是符号,访问的端口范围0~255.  例如:  IN AL,20H  表示从I/0端口地址为20H的端口中取数据送入AL寄存器中。

间接端口寻址

  若访问的端口地址大于255时,就要用间接寻址方式。可以访问的端口范围0~65535.  例如:  MOV DX,356H ;将端口地址356H送入DX寄存器  OUT DX,AL ;将AL中的内容输出到DX指定的端口

编辑本段隐含寻址

  不是明显的给出操作数地址,而是在指令中隐含着操作数的地址, 即要寻找的地址包含在操作码中。例如在单地址指令格式中,就是不明显的给出第二操作数的地址,而是以隐含的方式规定累加器作为第二操作数的地址。   如DAA ;指令的操作对象为AL,结果也存于AL中。
扩展阅读:
  • 1

    基址寻址:在基址寻址中,有效地址由两部分组成。一部分在基址寄存器中,另一部分为常量 。

  • 2

    ① 基址寻址的地址表达式:

  • 3

    段寄存器:[基址寄存器+位移量]

  • 4

    或 段寄存器: 位移量[基址寄存器]

  • 5

    物理地址=段寄存器内容×16+基址寄存器+位移量

  • 6

    ② 访问约定的逻辑段,简化的地址表达式:

  • 7

    [基址寄存器+位移量]

  • 8

    物理地址=约定的段寄存器内容×16+基址寄存器+位移量

  • 9

    变址寻址:

  • 10

    ① 有比例因子的变址寻址其地址表达式为

  • 11

    段寄存器:[比例因子*变址寄存器+位移量]

  • 12

    或 段寄存器: 位移量[比例因子*变址寄存器]

  • 13

    ② 物理地址=段寄存器×16+比例因子×变址寄存器+位移量

  • 14

    没有比例因子的变址寻址其地址表达式为:

  • 15

    段寄存器:[变址寄存器+位移量]

  • 16

    访问约定的逻辑段可简化为 :

  • 17

    [变址寄存器+位移量]

  • 18

    物理地址=约定的段寄存器×16+变址寄存器+位移量


参考来源:http://baike.baidu.com/view/889427.htm


   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值