能力值:
(RANK:260 )
|
-
-
2 楼
什么叫“内存到内存寻址”???
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你的意思是不是说,一个程序直接访问另外一个程序的内存地址? 如果是。那么他和cpu没有任何关系,而是windows的运行机制问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
他是想说:从内存到内存的指令吧?因为实现起来太复杂吧
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
是不是有点像DMA?
|
能力值:
(RANK:20 )
|
-
-
6 楼
这就跟你从北京到广州为什么不能直接不经过其他城市一样
CPU所有的操作都经过寄存器,内存对传也也有 就跟你飞机飞到广州一样
|
能力值:
( LV8,RANK:130 )
|
-
-
7 楼
有的cpu(确切地说应该是mcu,微控制器)支持从内存到内存的存储,只不过碰巧intel不支持而已,
|
能力值:
(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]这样的指令了),因为这样在性能上并没有损失(在流水线中),而编译器的设计会简化很多
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
学习了,收学生吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
中国式的教育,我到现在也没从任何的教材中找到答案,基本都是直接提示这个不能那个不能而没有任何解释。下面是我的理解:系统中存在地址总线和数据总线,当然还有控制总线。CPU要寻址首先要将地址放到地址总线上,而这样做的目的从根本上来说就是选中对应的电子设备(我们姑且将一个内存单元独立成一个设备),然后再通过读引脚通知那个设备将数据放到数据总线上。可以想象如果寻址时要访问两个地址,那势必造成冲突,也就是说地址总线上一次只能放上一个地址,这就是操作数不能同时都为内存地址的原因,我想in和out指令的操作数应该也不能都为内存地址吧。
|
|
|