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