|
主题 : : 我所理解的16位地址转20位地址 [待解决] |
回复[ 17次 ]
点击[ 765次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-03-25 01:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-16 21:08 |
刚在看2.4节,书上说8086内部是16位,而外部总线是20位,16位只能访问到64k的地址,而外部总线却有1M的地址空间,怎样用16位去访问1M的地址空间,书上讲的是分段,把1M地址分成小段,每段64k,CPU内部用了一个叫地址加法器的东西,物理段地址的形成是段地址*16+偏移地址,我看着没大明白,为什么段地址要*16,我理解的是象这样,你把1M地址分成小段,物理地址应该是,比如你是在第三段,就应该是段地址*3+偏移地址啊,怎么要*16呢,不大明白 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-03-25 07:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-03-25 21:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-12-22 18:45 |
这个可以看看书上的比喻,22页2.7
用16进制表示的,移动一位当然要乘上16,就像10进制,左移一位就乘上10.
地址是20位的,但而寄存器是16位的,在计算地址时乘16,左移一位(二进制就移动了四位,即20位)。
偏移地址,我的理解方式是,表示这段地址的大小。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-03-29 15:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-26 17:25 |
我也是在这里给卡住了
书里面有一个图表示123c8的过程
12300
+ 00c8
————
123c8
它下面的注释是1230*16=12300
我对这里百思不得其解
用16进制表示的,移动一位当然要乘上16,就像10进制,左移一位就乘上10.
但这里为什么*16=12300
应该是*10才=12300
? | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-03-29 16:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2010-03-20 10:35 |
用16进制表示的,移动一位当然要乘上16,就像10进制,左移一位就乘上10.
但这里为什么*16=12300
应该是*10才=12300
?
---------------
书中写的是*16,注意这个16后面没有“h”,也就是说乘以十进制的16 。
相当于*10h | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-03-29 16:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2010-03-20 10:35 |
但这里为什么*16=12300
应该是*10才=12300
------------
刚翻书看了下,这个12300出之21页图2.7吧?地址加法器里面默认是16进制
也就是说 1230H*10H=12300H 1230H*16=12300H | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-03-29 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-26 17:25 |
哎呀呀呀
谢谢楼上的
这个问题我琢磨了两天了
1230H*16=12300H
这个应该16是十进制的
换成十六进制的就是*10H
对不? | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-03-29 16:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2010-03-20 10:35 |
哎呀呀呀
谢谢楼上的
这个问题我琢磨了两天了
1230H*16=12300H
这个应该16是十进制的
换成十六进制的就是*10H
对不?
-----------
正确 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-03-29 16:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-26 17:25 |
|
|
|
|
|
[第9楼]
[ 回复时间:2010-04-01 10:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-30 11:45 |
主要要把十六进制和二进制之间相互转化关系搞明白!还有要把系统总线多路复用概念搞清楚,还要弄明白8086存储器原理。个人建议在学指令之前先学一下存储器原理! | | |
|
|
|
|
[第10楼]
[ 回复时间:2010-04-01 20:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-27 14:42 |
|
|
|
|
|
[第11楼]
[ 回复时间:2010-04-20 22:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:0
注册日期:2010-04-20 22:33 |
就相当于在十进制里扩大了10倍 呵呵 看来LZ已经理解了啊 | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-04-21 14:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 10:48 |
我才看一章,说说我的理解
内部总线为16 寻址空间为64K
外部总线为20 寻址空间为1M
理论上16线CPU只能寻找 64K的空间 但是现在做处理后 扩大寻址空间 ,就是把1M/64K=16
分成16段 每段64K 这样就可以使用1M的空间
物理地址=段地址*64k+偏移地址 | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-04-23 11:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:0
注册日期:2010-04-22 09:56 |
我该怎么解释呢
段地址*16+偏移地址
*16是什么意思?在一个16进制数据中,*16表示XXXXH变成XXXX0H
XXXXH是16位的,XXXX0H是20位的 | | |
|
|
|
|
[第14楼]
[ 回复时间:2010-04-23 12:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
回复:[第13楼]
------------------
8088 CPU 是不能直接给出 20 位地址信息的,这是因为 8086/8088 CPU 可编程的 14 个寄存器都是 16 位的,更没有通过编程直接输出20 位地址信息的其他途径。20 位地址输出是通过来自段寄存器的和 CPU 内部总线的两个 16 位地址分量在“地址加法器”“移位相加”得到的。
地址加法器在将两个16位分量相加之前,先将来自段寄存器的16位地址信息左移四位,然后再和 CPU 内部总线的16位地址分量相加。由于二进制数左移四位相当于乘以16,所以在通过逻辑地址计算物理地址时,就有下面的表达式进行计算:
段地址*16+偏移地址
这是我对 *16 的解释。 | | |
|
|
|
|
[第15楼]
[ 回复时间:2010-05-10 00:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-09 01:25 |
为什么要
”20 位地址输出是通过来自段寄存器的和 CPU 内部总线的两个 16 位地址分量在“地址加法器”“移位相加”得到的。”呢?
我觉得这是资源的有效利用,但是同时它会拖慢了cpu整体速度的。
不禁想,16位地址也可以扩展成24 28 32 呢!!呵呵! | | |
|
|
|
|
[第16楼]
[ 回复时间:2010-11-11 16:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-09 16:36 |
那是制造上的问题,高科技的技术上的东西还是有些不为人知 | | |
|
|
|
|
[第17楼]
[ 回复时间:2010-12-03 13:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08 |
1M=1024K
1024K/64K=16
正好等于内部的16根总线,这样就可以寻到所有的外部20根总线的物理地址了 | | |