检测点2.2
检测点2.2的题目(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为(10)H到(1000)H。(2)有一数据存放在内存20000H单元中现给定段地址为SA,若想用偏移地址寻到单元。则SA应满足的条件是:最小为(1001)H,最大为(2000)H.
(1)套用公式:物理地址=段地址X16 + 偏移地址
最小寻址值:物理地址=0001H X16+0H (H代表该数为16进制)
=0010H+0H
=0010H
=10H
最大寻址值:物理地址=0001HX16+FFFFH (FFFF,偏移地址为16位,变换范围0——FFFFH)
=0010H+FFFFH
=1000FH
(2)物理地址=段地址X16 + 偏移地址
偏移地址最大时,SA的值最小
20000H=SAX16+FFFFH
2000H=SA+FFFFH/16 // 为了方便计算可以先把FFFFH转换为十进制
2000H=SA+65535/16
2000H=SA+4095
2000H=SA+FFFH // 再次把4905(十进制)转换为十六进制(FFFH)
SA=2000H-FFFH
SA=1001H
因为 当偏移地址最小时,SA的值最大
所以:SA最大值为:2000H = SA+0H
这是我在论坛里复制的,因为和我所写的差不多{:5_109:} ,我自己又是拿草稿纸写的,字不行,只有复制了一些,加上了我的理解请谅解,{:5_109:}
{:10_254:} 刚做完这个检测点,来对一下答案~ 段地址 最小为1001h 最大值为 2000h
这样的话 物理地址 =sa*16+ea
选最小值 来计算
10010h+ffffh 等于2000fh
这就大于 20000h 了
百思不得解,求解惑啊啊 本帖最后由 freedomOO 于 2021-5-25 06:42 编辑
Salubrious 发表于 2021-5-24 18:06
段地址 最小为1001h 最大值为 2000h
这样的话 物理地址 =sa*16+ea
选最小值 来计算
我自己是这么想的,因为,我是用window计算机计算的,所以FFFFH/16=FFFH,没有保留后面小数点的数值,如果根据位移的算法(段地址*16=16进制左移一位),小数点后应该是不能省略的 ,所以FFFFH/16=FFF.FH,
如果舍去的话,我们向前进一位也就是FFFH+1 = 1000H,所以
SA=2000H-(FFFH+1)
SA=1000H
这样的话SAx16+FFFFH= 1FFFFH,就没有超过20000H了,
但是结果还是不会直接等于20000H,毕竟是四舍五入的得到的,你看看
因为这是我自己想的,也不知道正不正确,如果你找到更好的解释,请你帮我改正{:5_109:}
本帖最后由 fc520 于 2021-6-5 21:05 编辑
Salubrious 发表于 2021-5-24 18:06
段地址 最小为1001h 最大值为 2000h
这样的话 物理地址 =sa*16+ea
选最小值 来计算
最大地址:
20000H
- 0000H
20000H
最终值SA右移一位2000H
最小地址:
10010H(SA)
+ FFF0H
20000H(目标单元)
这个不能偏移FFFF,因为段地址SA是左移一位,计算的时候最后一位是0,对应的偏移地址最后必须是0,其他的最大化,所以最小SA是1001H fc520 发表于 2021-6-5 20:57
最大地址:
20000H
- 0000H
谢谢,您的解答,现在我知道了,{:5_106:} 本帖最后由 freedomOO 于 2021-6-19 08:52 编辑
{:5_95:} fc520 发表于 2021-6-5 20:57
最大地址:
20000H
- 0000H
我现在又多了个疑问?计算的时候最后一位是0,为什么对应的偏移地址最后必须是0,呢? fc520 发表于 2021-6-5 20:57
最大地址:
20000H
- 0000H
我觉得应该是这样的
20000H=16SA+0000H;这个你能理解吧,sa = 2000h ,这个就不说了
20000H=16SA+FFFFH
20000h - ffffh = 16sa ;这个能看懂吧
10001h = 16sa
10001h / 16 = sa ;这个也能看懂吧,两边同时除以16
10001h / 16 等于多少?
应该这样理解,ffff * 16 = ffff0,对吧,左移一位
10001h / 16 = 1000h ; 这里假设等于,应该说是约等于
那么
1000h * 16 + ffffh = 1ffff 不等于20000h,为什么不等于?,因为刚刚 10001h / 16时是直接右移了一位,10001h 中的1被移没了,现在不够了,怎么办?
好办^_^
既然不够了,那加一点就行了,怎么加?
ffff已经最大了
只能是sa加1
1001h * 16 + (这里还是ffffh吗) = 20000h
因为sa加了1
所以ea得相应的减一点,减多少?
1001h * 16 = 10010h
20000h - 10010h = fff0
所以
1001h * 16 + fff0 = 20000h
分析完毕^_^ 当偏移地址最小时,SA的值最大时为什么不是2000H = SA*16+0H 本帖最后由 fc520 于 2021-8-31 00:56 编辑
freedomOO 发表于 2021-6-19 08:52
我现在又多了个疑问?计算的时候最后一位是0,为什么对应的偏移地址最后必须是0,呢?
段地址1001H+FFFFH直接溢出大于20000H,
不溢出的情况下,最后一位数就必须相同,
计算的时候SA左移一位,所以最后一位是0,偏移地址的最后一位也就是0了,
你再看一遍:
10010H(SA左移一位,最后为0)
+FFF0H(偏移地址只要大于0,地址都会溢出,大于20000H)
20000H(目标的最大地址)
看了上面的,你可能还是会有点懵:
1. 偏移地址不会超过1000H,那么SA一定要大于等于1000H
2. 偏移地址最大值FFFFH,加上SA(1000H)还是小于20000H,
3. 那么只能SA+1,即1001H,
4. 现在就是一个简单加减计算了:20000H - 10010H = FFF0H
5. 但是这种思路还是绕了一点路,你再细细品味(因为段地址SA是左移一位,计算的时候最后一位是0,对应的偏移地址最后必须是0,其他的最大化,所以最小SA是1001H) 本帖最后由 fc520 于 2021-8-31 00:37 编辑
freedomOO 发表于 2021-6-19 08:59
我觉得应该是这样的
20000H=16SA+0000H;这个你能理解吧,sa = 2000h ,这个就不说了
20000H=16SA+FFFFH
SA为任何值,16SA+FFFFH都不会等于20000H,
20000H的最低4位都是0,FFFFH的最低4位都是1,永远都不会相等,
而且计算机的原理是很严谨的,0是0,1是1,
最好不要带着约等于这样思想去学习,他一定是有严谨的推导过程 freedomOO 发表于 2021-6-19 08:59
我觉得应该是这样的
20000H=16SA+0000H;这个你能理解吧,sa = 2000h ,这个就不说了
我感觉是这样10001/16 左移一位是末尾1向前移动了一位变成1001,得到这个1001段地址*16+EA=20000H,然后反向求出20000H-16*1001=FFF0, 我在算的时候是这样的想的,我也不知道对错。 Salubrious 发表于 2021-5-24 18:06
段地址 最小为1001h 最大值为 2000h
这样的话 物理地址 =sa*16+ea
选最小值 来计算
我开始题目都没看懂{:5_99:}
段地址的最小值,就是要让偏移地址最大 即20000h-ffffh,结果是10001h,但是段地址不可能是小数,所以只能向上取,只能是10010h,右移还原后就是1001h Salubrious 发表于 2021-5-24 18:06
段地址 最小为1001h 最大值为 2000h
这样的话 物理地址 =sa*16+ea
选最小值 来计算
回复 freedomOO 发表于 2021-6-19 08:59
我觉得应该是这样的
20000H=16SA+0000H;这个你能理解吧,sa = 2000h ,这个就不说了
这个是最好的解释了
因为必须要保证物理地址=段地址X16 + 偏移地址
页:
[1]