汇编的寻址方式

指令操作数的寻址方式
一些概念
  DISP/16位:AX(累加器),BX(基侄寄存器),CX(计数器),DX(数据与地址寄存器),SP(堆栈指针),BP(基址指针),SI(源变址器),DI(目的变址器)
  DISP/8位:AH(高8位),AL(低8位),BH,BL,CH,CL.DH,DL
  IP指令指针,存放代码段中的偏移地址;EA偏移地址,段内相对地址,有效地址
  CS代码段,SS堆栈段,DS数据段,ES附加段
  堆栈:方便事项程序要求保留和恢复有关信息的特殊存储部件,是一种数据结构。
  pws(状态):CF(进位),PF(奇偶),SF(符号),OF(溢出),ZF(零),DF(方向),IF(中断),TF(跟踪)
  PA:20位物理地址 ;MOV传送
  
1. 立即寻址
立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操作数字段,不能用于目的操作数字段。
例1            MOV    AL,5

2.直接寻址
在IBM PC机中将操作数的偏移地址称为有效地址EA。在直接寻址方式中有效地址EA就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数.
 
如操作数在数据段中,则物理地址=16D×(DS)+EA。IBMPC机中允许数据存放在数据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。
例4              mov  AX ,       [2000H]
(DS)=3000H,地址32000H中的值为 3050H则,执行结果为;(Ax)=3050H

因为实际mov AX中的内容为 16D * (Ds) + 2000H = 32000H
 
在汇编语言指令中,可以用符号地址代替数值地址,如:
MOV  AX, VALUE   
此时VAIUE为存放操作数单元的符号地址。如写成
MOV  AX, [VALUE]   
也是可以的.两者是等效的。如果VALUE在附加段中,则应该指定段跨越前缀如下;
MOV  AX, ES:VALUE

MOV  AX, ES:[VALUE]
    直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直接寻址方式,将该变量先取到一个寄存器中,然后在做处理。
    IBM PC机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。这也是一个常量常常送到寄存器去的原因。

 

3.寄存器间接寻址
操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数则在存储器中,如下图所示。
 
a.如果指令中指定的寄存器是BX、SI、DI,则操作数在数据段(DS)中,所以用DS寄存器的内容作为段地址,即操作数的物理地址为:
物理地址=16d*(DS)+(BX)
或   
物理地址=16D*(DS)+(SI)
或   
物理地址=16d*(DS)+(DI)

b.如指令中指定SP寄存器,则操作数在堆栈段(SS)中,段地址在SS中,所以操作数的物理地址为:
物理地址=16D*(SS)+(SP)

 MOV    AX, [BX]
如果 (DS)=2000H, (BX)=1000H 则
物理地址=16d*(DS)+(BX) = 20000H+1000H = 21000H
21000H地址里的内容为 50A0H则 执行结果为:(AX)=50A0H

c.指令中也可指定段跨越前缀来取得其他段中的数据。如;
MOV AX, ES:[BX]
这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。

4.寄存器相对寻址方式
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和。即

          | (BX)
  EA =| (BP) + 8位或者16位的位移量
          | (SI)
          | (DI) 

 
举个例子:

 MOV    AX,COUNT[SI]  (也可表示为MOv    AX,[COUKT+SI]
其中,COUNT 为16位位移量的符号地址。
如果(DS)=3000H,(SI)=2000H    COUNT=3000H
则物理地址 = 30000+2000+3000 =35000H

 

5.基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
两个寄存器均由指令指定。
如果基址寄存器为BX,段寄存器使用DS;
 = 16D * DS + (BX) + SI(或者DI)
如基址寄存器为BP时,段寄存器则用SS。
 = 16D * SS + (BP) + SI(或者DI)

 
6.相对基址变址寻址方式
 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之
和。
同样,当基址寄存器为BX时,使用DS段寄存器;
16d * DS + BX + SI + 位移量(8位或16位)

而当基址寄存器为BP时,则使用SS为段寄存器。因此物理地址为:
16d * SS + BP + SI + 位移量(8位或16位)

MOV    AX,MASK[BX][SI]
(也可以写成
M0V    AX,MASK[DX+SI]
或         
MoV    AX.[MASK+BX+SI]

如(DS)=3000H,(BX)=2000H、(SI)=l000H,MASK=0250H,
则    物理地址
= 16d*(DS)+(BX)+(SI)+MASK
= 30000+2000+1000+0250
= 33250H

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值