|
主题 : : 为什么段地址:偏移地址 = 段地址 * 16:偏移地址 [已解决] |
回复[ 6次 ]
点击[ 372次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-05-22 16:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:4
注册日期:2008-05-22 14:44 |
而不是:
段地址 * 16^4 + 偏移地址.
本来可以表达 0000 0000 --- FFFF FFFF 的.
而现在只能表达 0000 0000 --- 0010 FFEF 了.
这样 多浪费呀.... | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-05-22 17:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
楼主还是不了解情况啊。
寻址能力是由数据总线确定的。8086就20根地址总线,所以寻址最大为FFFFFH。
而使用段地址和偏移地址进行寻址的设计,是因为很多硬件和软件方面的原因进行最终设计的,并不是楼主想的那样。
这个设计理念单单学习汇编是不够的。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-05-23 09:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2008-05-15 17:49 |
不浪费,如楼上所说:寻址能力是由数据总线确定的。8086就20根地址总线,所以寻址最大为FFFFFH
16位机器怎么才能表示20位的地址呢,采用了段地址左移4位+偏移地址,刚好20位。如果象楼主那样说,左移个千八百位的,表示的不是更多,当然可以,不过没必要啊,只要能表示20位的地址就OK了。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-05-23 09:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:37
信誉值:0
注册日期:2008-01-29 18:06 |
原理是是这样的
8086cup拥有20根地址总线,所以cup可以访问的地址范围就从 00000 -- fffff 总共有1M空间
但是寄存器的大小为16位,其能寻址的范围为0000--ffff(64k大小的空间),由此可见单单依靠一个寄存器是无法访问到1m空间
8086给出的解决办法就是 使用两个寄存器来表示地址.一个段寄存器,和一个通用寄存器
具体的解决办法是:cpu中有个地址运算单元,它就是将段寄存器的值*16(16为10进制,二进制的话为4位),这样生成一个20位大小的数据,然后在此基础上加上一个16位的偏移,组成最后的20位物理地址
楼主有什么不明白的,回帖 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-05-23 10:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:4
注册日期:2008-05-22 14:44 |
明白了,因为10FFEF 与FFFFF最接近对吧?
那么这样的话,是不是有些地址是无效的呢?
比如FFFF:FFFF = FFFF0 + FFFF = 10 FFEF,
而10FFEF > FFFFF | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-05-23 10:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:4
注册日期:2008-05-22 14:44 |
不浪费,如楼上所说:寻址能力是由数据总线确定的。8086就20根地址总线,所以寻址最大为FFFFFH
16位机器怎么才能表示20位的地址呢,采用了段地址左移4位+偏移地址,刚好20位。如果象楼主那样说,左移个千八百位的,表示的不是更多,当然可以,不过没必要啊,只要能表示20位的地址就OK了。
------------------
回复:
左移个千八百位当然可以啦,但是中间就有很多数值无法表示咯。。。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-05-26 11:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:4
注册日期:2008-05-22 14:44 |
此贴由 贴主 于 [ 2008-05-26 11:12 ] 结贴。 结贴原因:问题已解决 | | |