【汇编语言/底层开发】7、更灵活的定位内存地址方法

1、[bx+idata]

通常情况下,我们使用ds和[bx]指定内存中的一个内存单元。而[bx+idata]所表示的是一种更加灵活的方式来定位内存地址,其表示的是段地址为DS,偏移地址为(bx)+idata的内存位置。通常idata为一个常量,表示一个固定的地址偏移量。如下面几条指令实际上是等价的:

mov ax, [bx+200]
mov ax, 200[bx]
mov ax, [bx].200

其中值得注意的是200[bx]这种方法。通常在给定的数据段中,ds的值通常在程序开始时确定,中间不会改动,此时m[bx]这种方法可以实现对数组的处理。即提前确定好针对某个数组相对于ds的地址偏移,并替换m。这样通过改变bx的值就可以实现对数组元素的遍历。这种方法同高级语言的数组的实现思想类似,如C中表示数组的方法a[i],a也是表示首地址的常量,通过改变索引i的值对数组元素进行遍历。


2、si和di

这两个寄存器的功能同bx类似,只是不能拆成高低两个8位寄存器。这两个寄存器可以在bx被占用的时候作为辅助内存定址寄存器。引入了si和di后,可以使用更加灵活的内存定址方式:[bx+si],以及更加复杂的:[bx+si+idata]。

各种定位内存地址的方法比较:

(1):[idata]:使用一个常量表示地址,可直接定义一个内存单元;

(2):[bx]:使用一个变量表示地址,间接定义一个内存单元;

(3):[bx+idata]:使用一个常量+一个变量表示地址,可以在一个常量基础地址上用变量间接定义内存单元;

(4):[bx+si]:用两个变量表示地址;

(5):[bx+si+idata]:两个变量+一个常量表示地址。

上一篇:[置顶]


下一篇:嵌入式arm linux蓝牙文件传输移植