汇编寻址方式

80x86的寻址方式

 计算机是通过执行指令序列来解决问题的,因此每种计算机都有一组指令系统提供给用户使用,这组指令集就称为计算机的指令系统。

 计算机中的指令由操作码字段和操作数字段两部分组成。

 指令的操作码字段在机器里面的表示比较简单,只需对每一种操作指定确定的二进制代码就可以了。

 指令的操作数字段情况较为复杂。

 确定指令中用于说明操作数所在地址的方法称为寻址方法

 8086/8088有七种基本的寻址方式。

1.立即寻址方式

 操作数就包含在指令中,它作为指令的一部分,跟在操作后存放在代码段,这种操作数就称为立即数。

 立即数可以是8位的,也可以是16位的。

 如果是16位立即数,按“高高低低”原则进行读取。

 例如:MOV AX,1234H

 再如:MOV AL, 5  则执行指令后(AL)=05H

            MOV BX,2064H  则执行指令后,(BX)=3064H

 

2.寄存器寻址方式

  操作数在CPU内部的寄存器中,指令指定寄存器号。

  对于16位操作数,寄存器可以是:

  AX,BX,CX,DX,SI,DI,SP,BP

  对于8位操作数,寄存器可以是:

  AL,AH,BL,BH,CL,CH,DL,DH

  这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。

  例如:MOV AX, BX

  如指令执行前(AX)=3064H,(BX)=1234H。则指令执行后,

  (AX)=1234H,  (BX)保持不变

  又如:  MOV SI,  AX

     MOV AL, DH

  都是寄存器寻址的的例子。

3.直接寻址方式

 操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)。操作数一般存放在数据段

 所以,操作数低地址由DS加上指令中直接给出的16位偏移得到。

 例如:如果(DS)=2000H ,MOV AX,[8054H]



在汇编语言指令中,可以用符号地址代替数值地址

 如:MOV AX, VALUE

 此时,VALUE为存放操作数单元的符号地址。

 如写成:MOV AX, [VALUE]也是可以的,两者等价。

 如VALUE在附加段中,则应指定段超越前缀如下:

 MOV AX , ES : VALUE

 或MOVAX , ES:[VALUE]

 直接寻址方式常用语处理单个存储器变量的情况。它可以实现在64K字节的段内寻址操作数。直接寻址的操作数通常是程序使用的变量

 注意:立即寻址和直接寻址书写表示方法上是不同的,直接寻址的地址要放在方括号中。在源程序中,往往用变量名表示。

4.寄存器间接寻址方式

 操作数在存储器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之一中。

 在一般情况下,如果有效地址在SI、DI和BX中,则以DS寄存器之内容位段值。

 如果有效地址在BP中,则以SS段寄存器之内容位段值。

 例如:如果(DS)=5000H ,(SI)=1234H

            MOV AX, [SI]

指令中也可指定段超越前缀来取得其它段中的数据。

 如,MOV AX , ES : [BX]

 引用的段寄存器是ES

  请熟悉下面的表达形式:

 MOV [SI] , AX ; 目的操作数间接寻址

 MOV [BP] , CX ;目的操作数引用的段寄存器是SS

 MOV SI , AX; 目的操作数寄存器寻址



5.寄存器相对寻址方式

 操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。

 即:

 在一般情况下,如果SI、DI或BX之内容作为有效地址的一部分,那么引用的段寄存器是DS;如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS

 在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如位移量是8位,则被带符号扩展成16位。

例如:如果(DS)=5000H,(DI)=3678H

            MOV AX, [DI+1234H]

  则,物理地址=50000+3678+1223=5489BH

  假设该字存储单元的内容如下,则(AX)=55AAH

请熟悉下面的写作形式:

  MOV BX , [BP-4]

  源操作数间接相对寻址,引用的段寄存器是SS。

  MOV ES : [BX + 5] , AL

  目的操作数采用寄存器相对寻址,引用的段寄存器是ES。

  指令MOV AX , [SI + 3]与MOV AX ,3[SI]是等价的。

6.基址加变址寻址方式

  操作数在存储器中,操作数的有效地址是由:

  基址寄存器之一的内容与变址寄存器之一的内容相加。

 即:

在一般情况下,如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS;否者以DS之内容为段值。

例如:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H

            MOV AX, [BX][DI]

  假设该字存储单元的内容如下,则(AX)=1234H



下面两种表示方法是等价的:

 MOV AX , [BX + DI]

 MOV AX , [DI][BX] 

 下面指令中,目的操作数采用基址加变址寻址,引用的段寄存器是DS。

 MOV DS :[BP + SI], AL

 下面指令中,源操作数采用基址加变址寻址,引用的段寄存器ES。

 MOV AX , ES :[BX + SI]

  这种寻址方式适用于处理数据或表格。用基址寄存器存放数组首地址,而用变址寄存器来定位数组中的各元素。或反之。

 由于两个寄存器都可改变,所以能更加灵活地访问数组或表格中的元素。

7.相对基址加变址寻址方式

 操作数在存储器中,操作数的有效地址是由:

 基址寄存器之一的内容与变址寄存器之一的内容

 及指令中给定的8位或16位位移量相加得到。

 即:

 

 在一般情况下,如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS;否者以DS之内容为段值。

 在指令中给定的8位或16位位移量采用补码形式表示。在计算机有效地址时,如果位移量是8位,那么被带符号扩展成16位。当所取得的有效地址超过FFFFH是,就取64K的模。

例如:如果(DS)=5000H,(BX)=1223H,(DI)=54H

 (51275)=54H,(51276)=76H

            MOV AX, [BX + DI -2]

 那么,存取的物理存储单元是多少呢?

 物理地址 = 50000 + 1223 + 0054 + FFFFE

               = 51275H

 在执行该指令后,(AX) =7654H。注意解算过程中的符号扩展

 相对基址加变址这种寻址方式的表示方法多种多样,下面四种表示方法均是等价的:

 MOV AX , [BX + DI + 1234H]

 MOVAX , 1234H[BX][DI]

 MOVAX , 1234H[BX + DI]

 MOVAX , 1234H[DI][BX]

练习:

1.现有(DS)=2000H,(BX)=0100H, (SI)=0002H

  (20100)=12H,(20101)=34H, (20102)=56H

  (20103)=78H,(21200)=2AH, (21201)=4CH

  (21202)=B7H,(21203)=65H

  试说明下列各条指令执行完后AX寄存器的内容。

   (1) MOV AX , 1200H 

   (2) MOV AX , BX

   (3) MOV AX , [1200H]

   (4) MOV AX , [BX]

   (5) MOV AX , 1100[BX]

   (6) MOV AX , [BX][SI]

   (7) MOV AX , 1100[BX][SI]

 

1.答案(我自己写,看文章的朋友最好,自己现在记事本中练习一下。光看答案没有什么意思,并且,我的理解不一定对)

 (1) MOV AX , 1200H 

    这里是立即数寻址, AX=1200H

 

(2) MOV AX , BX

    这里是寄存器寻址,AX=BX=0100H

 

 (3) MOV AX , [1200H]

    这里是直接寻址,需要考虑段的值,段要左移动一位

AX=[DS+1200H]=[20000+1200H]=2AH

 

(4) MOV AX , [BX]

这是寄存器间接寻址 ,需要考虑段

AX=[DS+BX]=[20000+0100H]=12H

 (5) MOV AX , 1100[BX]

这是寄存器相对寻址方式,要考虑段

AX=[DS+BX+1100H]=[20000+0100H+1100H]=2AH

 (6) MOV AX , [BX][SI]

这是基址+变址寻址方式,要考虑段

AX=[DS+BX+SI]=[20000+0100H+0002H]=56H

(7) MOV AX , 1100[BX][SI]

这是相对基址+变址寻址,要考虑段

AX=[DS+BX+SI+1100H]=[20000H+0100H+0002H+1100H]

=[21202H]=B7H

2.假设(DS)=2000H,(ES)=2100H, (SS)=1500H,

  (SI)=00A0H,(BX)=0100H,(BP)=0010H,

  数据段中变量名VAL的偏移地址值为0050H,

  试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?

   (1) MOV AX , 0ABH

   (2) MOV AX , BX

   (3) MOV AX , [100H]

   (4) MOV AX , VAL

   (5) MOV AX , [BX]

   (6) MOV AX , ES : [BX]

   (7) MOV AX , [BP]

  (8) MOV AX , [SI]

2 答案,同上,自己写,看官,还是自己再笔记本上练习,然后我们对照,以为,我写的不一定对。

  (1) MOV AX , 0ABH

这是立即数寻址,AX=0ABH

 

   (2) MOV AX , BX

这是寄存器寻址,AX=BX=0100H

 

   (3) MOV AX , [100H]

这是直接寻址,AX=[DS+100H]=[20100H]

 

   (4) MOV AX , VAL

    这是直接寻址,AX=[DS+VAL]=[20000+0050H]

   (5) MOV AX , [BX]

   这里是寄存器相对寻址,AX=[DS+BX]=[20000H+0100H]=[20100H]

   (6) MOV AX , ES : [BX]

    这是寄存器相对寻址 AX=[ES+BX]=[21000H+0100H]=[21100H]

   (7) MOV AX , [BP]

这是寄存器相对寻址 AX=[SS+BP]=[15000H+0010H]=

[15010H]

  (8) MOV AX , [SI]

      这里是寄存器相对寻址 AX=[DS+SI]=[20000H+00A0H]=[200A0H]

 (9) MOV AX , [BX + 10]

这里是寄存器相对寻址

AX=[DS+BX+10H]=[20000H+0100H+10H]=[20110H]

   (10) MOV AX , VAL[BX]

这里是寄存器相对寻址

AX=[DS+BX+VAL]=[20000H+0100H+0050H]=[20150H]

   (11) MOV AX , [BX][SI]

这里是基址+变址寻址

AX=[DS+BX+SI]=[20000H+0100H+0010H]=[20110H]

   (12) MOV AX , VAL [BX][SI]

这里是相对基址+变址寻址

AX=[DS+BX+SI+VAL]=[20000H+0100H+0010H+0050H]

=[20160H]

除了这7中基本的寻址方式外,8086/8088还提供了4种基于转移地址的寻址方式(第一个为段内,第二个为段间):

 

(DS)=2000H,(CS)=6000H,(SS)=8000H,(ES)=A000H

   (BX)=1256H,位移量TABLE=20A1H,(232F7H)=3280H

  (1)JMP BX

  执行后,(IP)=1256H,

  下一条指令的物理地址是:6000(0) +1256 = 61256H

  (2)JMP TABLE[BX]

  执行后,(IP)=(2000(0) + (BX) + 位移量)

  =(20000 + 1256 + 20A1)

  =(232F7)

  =3280H

  下一条指令的物理地址是:6000(0)+3280=63280H

 

汇编语言程序经翻译转换为机器语言程序,而且相互之间存在映射关系。

  例:ADD CL , BH

  机器语言为:00000010   11001111

  从左到右开始,各位的意义是:

  000000:OP(操作)

  1:reg为目的操作数

  0:字节操作

  11:寄存器方式

  001:reg , CL

  111:r/m , BH

 

指令的执行是需要时间的

  一条指令的执行时间是取指令、取操作数、执行指令及传送结果各个阶段所需时间的总和。

  不同的指令的执行时间差别可能会很大。

  同一种指令使用不同寻址方式时执行时间相差也可能会很大。





 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



 

 

 

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值