关于段地址,初学者实在是想不明白了,请高手指点!

王爽《汇编语言》有几个地方不明白:

1:段地址X16,哪个16我换成10用10进制来乘可以吗?

2:起始地址为10000H, 段地址为1000H(这个段地址1000H是怎么得来的?请尽量详细通俗点) 大小为100H(这个就更不明白了大小指的是什么?为什么又变成100H了?)

3:我们也可以认为地址:10000H~1007FH 、10080H~100FFH 的内存单元组成两个段,它们的起始地址(基础地址)为:10000H 和 100080H, 段地址为: 1000H(这个也不明白) 和 1008H(这个也不明白是怎么出来的),大小都为80H(这个更是不明白,为什么说是大小都为80H.) 请各位大哥指点指点,,请尽量详细通俗点,谢谢!
第一个问题.我是否能这样理解?
那个16和10其实就是16进制和10进制(16进制就X16, 10进制就X10),我算的时候能不能把它换成10进制来算X10最后在把结果换成16进制.对了(十六进制计算 2E * 0x10 = 2E0 那个0x10是什么意思呢?
)
第二个问题:也是最搞不清的一个问题/
偏移是16位 最大是FFFF(65535=64K)最多只能表示64K的大小,不能访问1M的内存(如果要访问的话就必须要把1M内存分成N块每块在64K以内?)
地址10000H(65536=64K)~100FFH(65791=64K)两数相差255,一个8位寄存位)的内存单元组成一个段(这里的两个地址都是64K能小点吗?)
将10000H/16=10000H/0x10=1000H(这里不是太明白为什么要除呢?段地址X16=物理地址,难道基地址除16是算段地址?)这个就是段地址了;它的大小是100FF-10000+1=(100H 256)(这个大小指的是什么,有什么意义?起到什么作用?)还请在指点指点,就差一点就明白了!

第一个问题:
先看下面的计算
十六进制计算 2E * 0x10 = 2E0
把上面的每个数换算成10进制 46 * 16 = 736
而2E0(16) = 736(10)
为了好理解你在计算时用同一种进制计算.
我们所说的:段地址乘以16,它的含义是
段地址是用16表示的一个数比如1000F
而乘以16,这个16又是指我们10进制意义里面的16,把它换成16进制表示就是0x10了,所以16进制的2E乘以16可以表示成2E * 0x10
而它的计算结果就是2E0

第二个问题:
地址可以表示成这样:段地址:偏移
由于这个偏移是16位(最大是FFFF)的,所以它最多只能表示64K的大小,不能访问1M的内存;如果将1M内存分段的话,我们就可以访问1M的内存了。
第二个问题它的原话是:
我们可以认为:地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。
将10000H/16=10000H/0x10=1000H这个就是段地址了;它的大小是100FF-10000+1=100H,为什么要加1(1到10有10个数而不是10-1=9个数)呢?

第三个问题:
第三个问题其实是两个第二个问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-21
1、段地址是16进制的,所以左移一位就是乘16,不能乘10
2、
我来打个比方:
一把尺子,从0到20厘米,每一毫米作为一个单元,就有200个单元,从000开始编号,就是000到199;
我们说000到199这个段的起始地址是000,大小是200
3、上面是把尺子做为一个段,现在把它看成两个段:
000到099、100到199——它们的起始地址是000和100,大小都为100。
我们把它们的起始地址作为它们的名字写在段寄存器上,可是段寄存器只能写两位数,于是我们把名字是高两位写上就行了,CPU寻找这两个段的时候会自动地在后面加上个0。
注意:它们的名字(段地址)是00和10,而它们的起始地址是000和100。
希望这样说,你能明白。
第2个回答  2010-11-03
这本书我看得也差不多了,归结起来,你就是不明白为什么会有段地址的存在及其表现的形式为什么会只单纯的设计进制。建议去补充一下进制间换算的关系,看二进制与十进制、二进制与十六进制间转换的区别。再者,重新阅读一下本章开始部分关于物理地址和内存地址间的联系,你理解的并不是很透彻。
相似回答