X86 寻址方式(其它单片机也类似)

来源:互联网 发布:ae视频软件 编辑:程序博客网 时间:2024/05/19 20:22

计算机中的指令由操作码和操作数组成,操作数可以是一个、两个或三个,通常称为一地址、二地址、三地址指令。

数据寻址方式:

1、  立即寻址

操作数直接放在指令中,作为指令的一部分放在代码段里,常用于给寄存器赋初值。
如:MOV  AX,3064H

2、  寄存器寻址

操作数在寄存器,指令指定寄存器号,不需要访问存储器,因而可以取得较高的运算速度。
如:MOV  AX,BX

3、  直接寻址

操作数的有效地址(EA)在指令中,要取得操作数,先要算得其物理地址。如:MOV  AX,[2000H];
可以使用符号地址代替数值地址,

如:MOV  AX,VALUE,与MOV  AX,[VALUE]等价,推荐用后者。
IBM PC机允许数据存放在数据段以外的段中,此时要指定段跨越前缀,如:MOV  AX,ES:[VALUE]

4、  寄存器间接寻址

操作数的EA在BX、BP、SI、DI中,而操作数在存储器中,
用于表格处理,只需修改寄存器内容就可取出表格中的每一项,
此时:物理地址=16d×(DS)+(BX)或(SI)或(DI) 或物理地址=16d×(SS)+(BP)

5、  寄存器 +偏移量寻址 (基址寻址 或 变址寻址)

 

所谓基址寻址是数据基地址在bp 或 bx 寄存器中。 偏移量就是常数。 变址寻址是数据基地址在si 或 di 寄存器中。

注意: 在c 语言里,对数组的操作。 我们更容易理解的是把数组名叫基地址,把数组元素相对于数组地址叫偏移量。

恰恰相反的是, 这个基地址是个常数, 作为指令寻址的偏移地址。 而数组中的偏移地址是一个变量,用一个寄存器

表示,这个变量往往就是指令寻址中的si 或 di, 指令寻址中把它叫基地址。 不管怎么说,理解了两部分相加就可以了,

可变的部分往往是寄存器而不是偏移量。

 

操作数的EA是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量的和,
物理地址=16d×(DS)+(BX)或(SI)或(DI)+8位位移量或16位位移量
物理地址=16d×(SS)+(BP)+8位位移量或16位位移量
物理地址=16d×(SS)+(BP)+(SI)或(DI)
在将8位位移量扩充到16位时,如果最高有效位为0,前面就添8个0,反之就添8个1,
若得到的EA超过FFFFH时,就取其与64K的模。


6、  基址+变址+偏移量寻址
我更愿意理解为,偏移量是不变的,基址或变址是可以变化的,构成一个更加灵活的寻址方式。
操作数的EA是一个基址和一个变址寄存器的内容和8位或16位位移量的和。
物理地址=16d×(DS)+(BX)+(SI)或(DI)+8位位移量或16位位移量
 物理地址=16d×(SS)+(BP) +(SI)或(DI)+8位位移量或16位位移量
   
7. 相对寻址:
   就是PC寄存器 + 偏移量 构成数据地址。 在51下, arm 下均广泛使用。

   但要注意, jump 指令为pc + 偏移量构成新pc 值,只是立即数运算,没有内存操作。

 
后面的寻址方式都是指对内存的操作。取到内存中数据。
而计算内存地址的运算。则只有立即寻址取到数据,再进行加减运算还是立即寻址。
然后再取数据为间接寻址。
可见后面的多重寻址简化了取数操作,扩展了数据处理能力。

原创粉丝点击