| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1715 人关注过本帖
标题:汇编为什么不能操作两个内存数
只看楼主 加入收藏
yhbs
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-5
收藏
得分:0 
并不能说绝对没有

以下仅对Intel X86处理器:

在内存之间进行数据的操作(例如add,sub,and,test,xor,or等,但不包括数据移动和比较)指令的确是没有的。

在内存之间直接移动数据,可以通过movsb/w/d/q指令进行
比较两个内存数据,可以通过cmpsb/w/d/q指令进行
这两者都是两个内存之间直接进行操作,只是源和目的的寻址方式被固定死了,在32位汇编中由于采用flat内存模式,这个限制到不必在意,因为内存操作总是要寻址的,采用固定的寄存器寻址也没有什么不可以的

内存数据的交换,通常是建议使用一个寄存器,用3次XCHG指令完成;也可以通过两次push加两次pop指令完成,对内存数据进行的push和pop操作本身就是内存和内存之间数据的移动

不管是什么原因,Intel在最初的时候没有加入这种寻址方式,等到以后再想添加这种寻址方式,发现代价比较高:一是硬件体系要更改许多,毕竟一个指令访问一次内存(例add eax, [di])、两次内存(例add [di], eax)与访问三次内存(例add [di], [si];次指令目前是不存在)有很大区别,并且最初的设计中就没有此种考虑;二是指令体系,双操作数的指令很多,每种指令都要增加这种寻址方式的指令编码,而内存寻址本身就有众多方式,如果一个指令的两个操作数都采用“基址加变址加偏移”的方式,一个指令的编码恐怕就得要近10个字节了,是不是有点儿恐怖?
2011-05-05 10:02
快速回复:汇编为什么不能操作两个内存数
数据加载中...
 
   



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

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