注册 登录
编程论坛 汇编论坛

关于数组操作的指令(罗云彬书上的)

toyix 发布于 2008-09-03 21:44, 1811 次点击
关于数组操作的指令
第一章  讲80386处理器工作模式的时候 ,关于 mov cx,[eax+ebx*2+数组基地址]的解释 我不是很明白,

然后他说在8086处理器实现相同的功能要进行一次乘法和两次加法 ,    不是很明白 ,我没有编写过    能给我举个代码的例子吗 ,最好是 16位 和32位  都举个例子
8 回复
#2
ONEPROBLEM2008-09-03 22:12
呵呵~~我看了也觉得稀里糊涂的,不知道说的是什么~~
应该说的是80386在实模式下的编程吧(谁试过?)?80386的优势在于保护模式,这点好像没有必要深究了。
#3
你们都要疼我哦2008-09-04 01:21
mov cx,[eax+ebx*2+数组基地址]

这是访问数组的方式. 主要靠理解这种表示形式.


数组元素在内存单元中都是线性排列的,比如最简单的1维数组,从基地址开始,往下顺序放,
第一个元素,基地址指着呢,如果找第2个元素,那就是基地址再加上一个元素所占内存单元的个数,因为一维数组只有列变化,所以只要关心EBX就可以,
第1个元素0,第2个元素1,第3个元素2......  


第1个元素就是基地址指向,
第2个元素就是基地址加上1, 这个1表示一个内存单元,
第3个元素就是基地址加上2......      
这是一个元素占1个内存单元的情况,即8位.如果一个元素是16位,就占2个内存单元了, 那就要*2,如果一个元素是64位,那就要*8.

上面是最简单的1维数组, 如果是2维数组,道理也一样,只不过因为是按行存储,所以要EAX来指明是第几行.

mov cx,[eax+ebx*2+数组基地址] 这样也就很容易理解了.

我表达能力太差,郁闷啊
#4
你们都要疼我哦2008-09-04 02:35
刚才又仔细想了一下,发现老罗的这个mov cx,[eax+ebx*2+数组基地址]对一维数组适用,
但是对多维数组的时候好象不太对.EAX应该在之前重新给偏移值.
恐怕作者写这个的时候就是随便举了个例子.
#5
toyix2008-09-04 06:59
总结   :我好像明白了 ,我感觉 一维,二维都适合吧,比如像num[5][4]:word  这样的数组,就是5行4列 ,如果循环数组   一行就像你说的那样   ,word类型 就乘以2就可以了 ,每一行循环完之后把eax加上  4*2就可以了吧  (因为word类型所以乘以2),我这样理解是你说的意思吧
#6
toyix2008-09-04 07:02
还有  忘了说 谢谢了
#7
你们都要疼我哦2008-09-04 21:03
是啊.  放其他代码里去理解,或者上下文有另外的地方去改变EAX的偏移值就没问题的.


如果按照书上的解释, EAX EBX放的是下标,再直接按照mov cx,[eax+ebx*2+数组基地址]这个来计算, 1维数组没问题,多维数组就不对了, 因为没根据EAX的下标修正到行的偏移地址,比如a[3][4],EAX直接按照3算肯定不对的,要计算前3行占了多少内存单元.即该行相对数组基地址的偏移量.


楼上理解没错的----每一行循环完之后把eax加上  4*2就可以了吧.   
罗的书上讲就是放的下标,也没上下文,也没讲EAX重新赋值,所以不太严谨. 对1维数组直接适用,  对多维数组不能直接用.
#8
toyix2008-09-05 13:53
我在csdn也提了这个问题    有个答案  是
在8086模式下
mov cx,[eax+ebx*2+数组基地址]该指令就得拆成

示意如下:

Assembly code
mov    cx,ax
mov     ax,bx
mov     bx,2
mul     bx   ;1次乘法
mov     bx,    数组基地址
add     bx, ax ;1次加法
add     bx, cx  ;2次加法
mov     cx, [bx]
可以吧这个16位代码补充完整吗?我16位不行啊
#9
你们都要疼我哦2008-09-05 15:30
  我的16位更菜啊,就跟没学过一样.指令都知道,就是不知道干的啥.

一起等高手
1