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

汇编为什么不能操作两个内存数

m1c2f4843 发布于 2011-04-28 14:25, 1747 次点击
如 mov 内存数,内存数

新手求解
10 回复
#2
2011-04-29 04:49
这个可以从两个地方解释  一是opcode  opcode里  关于解析指令的时候  只有24种寻址方式   没有两内存寻址

从另一个方面说。如果两内存能寻址  那不就把CPU给绕过了吗??那内存就有运算的能力了。这也是不靠谱的
#3
你们都要疼我哦2011-04-29 16:38
楼上朋友还是要多了解一下。

这个是出于效率方面的考虑。英特尔在设计芯片时就没支持这种内存到内存的mov。
因为进行内存操作效率远比不上进行寄存器操作。
从内存取的数是放在寄存器中,从寄存器中再放回到内存中,如果用一条指令完成,
就需要进行2次存储器读写操作,这样就造成一条指令的效率太低。所以就干脆不支持。
虽然说分成2条指令在我们看起来还不是一回事吗。。。但是这微小的差别就能提升不少效率。

至于说opcode 是先有硬件设计上的考虑,才有opcode上的反映。并不是因为OPCODE没有所以才不支持的。  我倒不记得有24种寻址方式  
记得有篇很好的讲述opcode的文章,还附带3个小例子,是学习操作码的好资料。

另外即使是可以使用这样的指令,也并不表示 “把cpu给绕过了”。。。
#4
yoy2011-04-29 19:50
书上说cpu没这功能
#5
zaixuexi2011-04-29 22:19
先记住不能就行了,有兴趣的话,自己慢慢往下学
#6
makebest2011-04-29 23:42
这些指令都是由CPU执行的,绕过CPU没有道理,
而且如何操作两个内存数,指令会太长了.
#7
mjsxjy2011-04-30 01:06
像三楼说的。
这样的指令没必要存在。
mov 内存,内存。就像点要交换二个变量的值,这个楼主肯定知道吧,a=1,b=2,那要交换,也得用一个中间变量比如c来交换。
像mov 内存,内存 这样的指令中间也是要经过内存->寄存器->内存的过程的。你不能直接用内存去交换另一个内存啊,地址为1的内存要和地址为2的内存交换,如果直接交换,那总有一个地址的内容会被洗掉啦。
像这样的间接型操作,写成一个函数就OK了。
当然,我说的不全面。只是个例子。但如三楼版主大大说的又有点深。已经讨论到硬件设计方面了,新手未必看得懂,我才这样回答滴,哈哈。

[ 本帖最后由 mjsxjy 于 2011-4-30 01:12 编辑 ]
#8
2011-04-30 01:20
嘿嘿。3楼啊   这方面你得多指点我哈    我的回答。基本上都是基于我目前的理解

肯定有很多不对的   因为我接触汇编也没多准  你懂的。嘿嘿

大概的取指令过程  和 CPU译码  大概知道。因为有流水线  所以还是有点迷糊  嘿嘿。1楼别建议哈

我回答的都是参考  
最后说下。汇编真是个好东西。但开发让人蛋疼
#9
zklhp2011-04-30 11:57
我觉得就是x86CPU没这功能 其他的可能有

记住就好了。。
#10
xiaomarn2011-05-02 17:21
恩,好像是intel没有,其它的有
虽然见了很多次这个问题了,不过是最有营养的问题了。
微代码,以及其它的一些不懂的。

#11
yhbs2011-05-05 10:02
并不能说绝对没有

以下仅对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个字节了,是不是有点儿恐怖?
1