| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1802 人关注过本帖
标题:关于数组操作的指令(罗云彬书上的)
只看楼主 加入收藏
toyix
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2008-7-14
结帖率:50%
收藏
 问题点数:0 回复次数:8 
关于数组操作的指令(罗云彬书上的)
关于数组操作的指令
第一章  讲80386处理器工作模式的时候 ,关于 mov cx,[eax+ebx*2+数组基地址]的解释 我不是很明白,

然后他说在8086处理器实现相同的功能要进行一次乘法和两次加法 ,    不是很明白 ,我没有编写过    能给我举个代码的例子吗 ,最好是 16位 和32位  都举个例子
搜索更多相关主题的帖子: 罗云彬 指令 
2008-09-03 21:44
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
呵呵~~我看了也觉得稀里糊涂的,不知道说的是什么~~
应该说的是80386在实模式下的编程吧(谁试过?)?80386的优势在于保护模式,这点好像没有必要深究了。
2008-09-03 22:12
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
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+数组基地址] 这样也就很容易理解了.

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


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


楼上理解没错的----每一行循环完之后把eax加上  4*2就可以了吧.   
罗的书上讲就是放的下标,也没上下文,也没讲EAX重新赋值,所以不太严谨. 对1维数组直接适用,  对多维数组不能直接用.
2008-09-04 21:03
toyix
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2008-7-14
收藏
得分:0 
我在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位不行啊
2008-09-05 13:53
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
  我的16位更菜啊,就跟没学过一样.指令都知道,就是不知道干的啥.

一起等高手
2008-09-05 15:30
快速回复:关于数组操作的指令(罗云彬书上的)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027877 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved