标签:
本文最初发表于2015-8-13,是由别的地方迁移过来的
汇编语言中的寻址方式十分重要,下面就是王爽老师总结出来的8086CPU寻址方式,不过,仅仅看这个表,是很难理解的。但是细细琢磨就可以看出一些规律。
1.关于图中的注释:
自定义符号:“()”表示取寄存器或内存单元中的值,idata表示常量。[BX]表示寄存器BX中的值是DS寄存器指向的段的偏移地址,DS是段寄存器。BP,SI,DI同理,不过(BX和BP)或(SI和DI)不能同时出现在一条语句中。在DEBUG程序下,可以直接[idata],但是在MASM下就必须用SREG:[idata](SREG是段寄存器)
基址就是基地址,相当于数轴原点O的比喻,变址相当于基地址的偏移地址,起到数轴中原点外一点的比喻,两者都是段地址的偏移地址。
寻址就是寻找地址,CPU要读取一个放在内存中的数据,首先要寻找它的地址,否则,找不到地址你就干不成事。这个通过地址总线寻找内存单元地址的过程就叫寻址。
(可以下载王爽的《汇编语言》来详细地理解上述内容)
2.idata的位置
在常用格式举例中可以发现,idata可以放在“[ ]”里面,也可以放在其外面,而寄存器bx,bp,si,di则不行,可以这样记忆:idata因为其不是寄存器和内存空间,不受“[ ]”的管辖,因此可以自由穿梭在寄存器和内存空间之间。
3.寄存器相对寻址的理解
可以把寄存器看作一个数轴上的原点,idata就是那个数的绝对值,这样理解就不会出错了。如果你熟悉C语言,用数组,结构体就能更好地理解。
数组理解:把寄存器中的值看成是数组的首地址,idata就是元素的地址(一维数组),注意计算机中,地址的表示是从0开始,数制为16进制。人工读内存时,若debug给出如下数据:0000:0200 00 01 02 03如果数据是字节形式存放的,就是四个数:0,1,2,3。如果是字形式存放就是两个数(注意!!!):0100,0302。是倒过来的(高地址高字节低地址低字节)
结构体理解:寄存器是一个结构体变量,而idata就是一个成员。
4.基址变址寻址的理解
如上图,也可以理解成一维数组,BX为数组首地址,SI为元素地址,表示的地址就是N+(SI ),也可以理解为二维数组,BX为行坐标,SI为列坐标。要注意的就是第一条提示的:基址不能同时出现,变址也如此。
5.相对基址变址寻址(难点)
这种定位方法很少用到,不过在复杂的程序中还是可以见到的。
这样理解更简单:
这种理解方法需要一定的C语言基础,把BX看成一个结构体,idata为结构体中的一个数组的首地址,SI就是数组元素的地址。以前有学过C语言编程的人看一遍就可以轻松地理解这种方法。由于内存中的数据是一维线性排布的,引进二维数组的概念将使初学者很难理解二维数组在一维内存空间中的存放方式,也就更难理解寻址方式了。
利用二维数组来理解idata[BX][SI]:将idata作为一个二维数组的首地址,[BX]为行,[SI]为行中的列。这样就确定了内存的地址了。
(二维数组A[x][y]的线性排布:A[0][0],A[0][1]…A[0][y-1],A[1][0]…A[1][y-1],A[2][0]…A[x-1][y-1])
标签:
原文地址:http://www.cnblogs.com/mrblug/p/5721171.html