当前位置: 代码迷 >> 汇编语言 >> 内存储器到内存
  详细解决方案

内存储器到内存

热度:1278   发布时间:2013-02-26 00:00:00.0
内存到内存


哪个说法是正确的?
------解决方案--------------------------------------------------------
哪个说法是正确的?倾向于“说法1”。寻址方式的编码位数决定了寻址模式的个数,不同组合超出了这个范围,只能按照当时设计人员的想法将它们排序,优先选用更常用的模式了。不幸的是,内存到内存的操作落选了,虽然现在看起来还是有不少的需求的;但实际上确实远不如其它的寄存器和寄存器/内存间的几率大。
段重叠的问题,这是 16 位实模式下的吧。由于 EA=SEG*16+OFF,所以一个地址 EA 就可能有许多不同的 SEG 和 OFF 的组合;必然 EA=20000=2000:0000=1fff:0010 之类。不同的段可能指向同一内存空间,所以确实会发生冲突,这就是这种内存模式的脆弱甚至是要命之处,所以 dos 是非常容易崩溃的。后来的保护模式就有改进了,内存段有大小和访问控制,轻易不会被冲突,系统也因此强壮了许多。
------解决方案--------------------------------------------------------
引用:
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解?
多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?


首先要明白一点程序是分段的,至于为什么要分段,那是因为早期的程序如实模式下的dos程序,只能访问64K的内存。为了访问更大的程序,系统采用了段地址+偏移地址的形式来增加程序能够访问的地址空间。
所以真实的物理内存都是由段地址+偏移地址来访问的,所以同一个物理内存可以有多个逻辑地址来表示。当然存储的数据只有一份,程序员写程序的时候要明白里面放的是什么,由程序员去解决访问上的冲突问题。
------解决方案--------------------------------------------------------
关于lz的第一个问题,
其实不光x86,在arm、mips、一些dsp系统上,都是禁止内存到内存的数据传输的。由于我不是搞cpu开发,只能猜测原因:
RAM从src地址的数据直接发送给dest地址,不通过cpu的寄存器的话,这个需要ram能够不依赖于cpu而能够自己传输数据,如果ram有这个功能,还要cpu干吗 :),所以需要cpu发出ram的读写操作时序,来驱动ram干活。

------解决方案--------------------------------------------------------
后者不完全正确。

主要是前者,效率为先。毕竟效率与灵活不能兼顾。
------解决方案--------------------------------------------------------
引用:
引用:后者不完全正确。

主要是前者,效率为先。毕竟效率与灵活不能兼顾。
你好,还有就是我第二个问题怎么解释啊?

还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解?
多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两……


逻辑地址0000:0123和0012:0003是一个指向同一个物理地址吗?显然是同一个地址,但是他们一个是段地址为0偏移量是123,而另一个是段地址12偏移量是3的逻辑地址,所以,一个物理地址可用多个逻辑地址来表示。
------解决方案--------------------------------------------------------
引用:
引用:
后者不完全正确。

主要是前者,效率为先。毕竟效率与灵活不能兼顾。
你好,还有就是我第二个问题怎么解释啊?

还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解?
多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自……

同一段数据主要是看CPU中寄存器的设置,即CS IP DS SS SP的指向.可以有不同的含义

可以看一下王爽汇编第69页
比如我们将10000H-1001FH安排为代码段,并在里面存储如下代码:
mov ax,1000h
mov ss,ax
mov sp,0020h      ;初始化栈顶
mov ax,cs
mov ds,ax         ;设置数据段段地址
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx

设置CS = 1000H,IP=0,这段代码将得到执行.可以看到在这段代码中,又将10000H-1001FH安排为栈段和数据段.10000H-1001FH这段内存,既是代码段,又是栈段和数据段