哪个说法是正确的?
------解决方案--------------------------------------------------------
哪个说法是正确的?倾向于“说法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这段内存,既是代码段,又是栈段和数据段