首页
社区
课程
招聘
[求助]为什么CPU不支持内存到内存寻址
发表于: 2009-3-27 08:08 4914

[求助]为什么CPU不支持内存到内存寻址

2009-3-27 08:08
4914
一个经典的问题

开始我以为我懂这个问题的

所以一直也没多想

但,今天我仔细想了下

发现原来我不会,百度也找不到我认为合适的答案

别笑我()

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
什么叫“内存到内存寻址”???
2009-3-27 21:00
0
雪    币: 195
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你的意思是不是说,一个程序直接访问另外一个程序的内存地址? 如果是。那么他和cpu没有任何关系,而是windows的运行机制问题。
2009-3-27 23:01
0
雪    币: 8185
活跃值: (2681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
他是想说:从内存到内存的指令吧?因为实现起来太复杂吧
2009-3-27 23:09
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
是不是有点像DMA?
2009-3-27 23:43
0
雪    币: 25
活跃值: (477)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
6
这就跟你从北京到广州为什么不能直接不经过其他城市一样
CPU所有的操作都经过寄存器,内存对传也也有 就跟你飞机飞到广州一样
2009-3-28 10:27
0
雪    币: 229
活跃值: (27)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
有的cpu(确切地说应该是mcu,微控制器)支持从内存到内存的存储,只不过碰巧intel不支持而已,
2009-3-28 11:06
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
对于数据拷贝,INTEL提供了所谓“串操作指令”,在地址对齐的情况下,理论上是最快速的内存拷贝的方式。

而对于算术逻辑运算指令,虽然INTEL的指令集中,允许内存操作数作为dest,但这样的指令过于复杂,因为要在一条指令中发起两个总线周期(一次读,一次写),这样的指令,特别对流水线而言,实际上效率并不高。

并且,INTEL的CPU的体系结构,它的译码方式为微码流水执行;由于体系结构的限制,在一条指令中,两次对存储器的访问是极限,硬件结构无法完成单条指令的三次或更多次的存储器访问(INTEL的指令系统已经够*复杂*的了,如果硬要加上这样的超级复杂指令,那硬件电路的性能不敢相像)。

这样就好理解了。

对于add这样的指令,假设它的dest和source操作数都是内存数,那它必须执行3次内存访问(两个读一个写);而像xchg这样的指令,如果要实现两个内存之间的交换,必须执行4次存储器访问,这是不可接受的!

并且,这样的指令实际上没有存在的意义,对程序来说,虽然变量在内存中存储,但是程序的运算,绝大多数是对某中间结果进行的,而CPU的寄存器的速度要比存储器快一个数量级以上,所以大多数RISC机器都采用load/store型的设计,而运算被限制在寄存器之中。

虽然x86不是RISC,自己看一下就会发现,编译器通常情况并不会选择那些复杂的指令,即使一条i++;指令,编译器一般还是倾向于使用mov eax, dword ptr [i] / add eax,1 / mov dword ptr [i],eax这样的指令组合(当然具体情况跟编译器的优化选项有关系,如果是按最小目标代码进行优化,那就可能生成inc dword ptr [i]这样的指令了),因为这样在性能上并没有损失(在流水线中),而编译器的设计会简化很多
2009-3-29 14:16
0
雪    币: 8185
活跃值: (2681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了,收学生吗?
2009-3-29 16:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe
10
中国式的教育,我到现在也没从任何的教材中找到答案,基本都是直接提示这个不能那个不能而没有任何解释。下面是我的理解:系统中存在地址总线和数据总线,当然还有控制总线。CPU要寻址首先要将地址放到地址总线上,而这样做的目的从根本上来说就是选中对应的电子设备(我们姑且将一个内存单元独立成一个设备),然后再通过读引脚通知那个设备将数据放到数据总线上。可以想象如果寻址时要访问两个地址,那势必造成冲突,也就是说地址总线上一次只能放上一个地址,这就是操作数不能同时都为内存地址的原因,我想in和out指令的操作数应该也不能都为内存地址吧。
2012-1-9 23:52
0
游客
登录 | 注册 方可回帖
返回
//