关于常见问题点的解答[涉及检测点1.1和2.2、2.3]
本帖最后由 loop 于 2017-1-11 11:23 编辑为了解答新手的困惑,特推出此贴。
限于篇幅,只讲下经常被提及的问题。
如果是有其它问题不是很清楚的,可以直接短信我。
检测点 1.1的第一题,这是初学者最容易迷糊的。
我们知道1KB=1024Byte,8KB=1024*8=8192Byte。
那么算出地址总线的宽度就套用公式,2的n次方=8192Byte
n就代表地址总线的宽度,只要算出n就行了。 2^10=1024
2^11=2048
2^12=4096
2^13=8192所以这道题的地址总线宽度为13。
检测点 2.1的问题可以自己在DEBUG里调试就知道了。
检测点 2.2的问题,这也论坛上被提问最多的一道题。
先讲下第1小题:
因为偏移地址大小是0000~FFFF,所以用段地址乘以16,在加上最小0000和最大FFFF。 0001H * 16 + 0000 = 00010H
0001H * 16 + FFFF = 1000FH所以这道题的答案是:00010H~1000FH
第2小题:
先套用公式,段地址*16+偏移地址=物理地址
那么我们已经知道了物理地址为20000H
SA = (20000 - 0000H) / 16 = 2000H ;最大值
SA = (20000 - FFFFH) / 16= 10001H :最小值
那么这里就出问题了,10001不能被16整除,也就是段地址不能满足*16+偏移地址= 20000H
所以偏移地址就要发生变化来满足段地址*16+偏移地址=20000H
20000H - FFFF = 10001H
20000H - FFFE = 10002H
20000H - FFFD = 10003H
20000H - FFFC = 10004H
20000H - FFFB = 10005H
20000H - FFFA = 10006H
直到.......
20000H - FFF0 = 10010H
这时10010H满足16的倍数了
物理地址减去最大偏移地址除以16等于最小段地址
20000H - FFF0H/ 16 = 1001H;最小值
所以最小值是1001H,最大值是2000H
注意上面的16是10进制的数,运算时要转化成16进制,也就是10H。
mov ax,bx ;读入指令缓冲器IP++ (第一次)
sub ax,ax;读入指令缓冲器IP++,(第二次)sub命令把ax值清零了。(等同于ax-ax)
jmp ax;读入指令缓冲器IP++ (第三次)
执行jmp ax后,IP值被ax覆盖,IP==0。(第四次) IP值变化了4次,因为ax=0,jmp命令把ax的值赋值给IP,所以最后IP为0
后续会继续添加,未完待续……
看完了前5章后,在回头看看之前的知识点发现又有所理解,
当时检测点1.1我理解错误,认为是按照bit来计算的,所以用1024*8*8 嘿嘿
检测点2.2 第二题也错了,因为没有遵守 一个原则“段的起始地址也一定要是16的倍数”
检测点2.3错的更离谱,因为还不理解IP是什么,哈哈
温故而知新,谢谢 mark一下@@ 顶楼主,请继续~~~ 谢谢楼主,本来2.3很迷茫,看到楼主的解析,终于懂了 jmp ax 这条指令后,IP还会增加? 我觉得应该是直接改变IP。。。有没有增加IP,待验证…… 非常感谢楼主写的如此详细,1.2课后题终于弄明白了。 可能我很笨,还是半解中。。。。 哮月苍狼 发表于 2011-7-2 15:34 static/image/common/back.gif
可能我很笨,还是半解中。。。。
不懂的话,可以发帖提问,如果觉得比较简单,可以直接PM我。
同时也欢迎提问、交流、讨论。
楼主好人,答疑解惑。非常感谢,解决了我百思不得其解的问题。 这讲解的很详细 强烈支持 我有点笨,没理解透mov ax,bx;应该是将bx的值给了ax,bx又不知道是多少,在执行jmp ax时,ip值被ax覆盖,这个能理解,但此时ax不应该就是bx吗,为什么ip==0呢 神马叫PM? 看了,楼主的分析,又相当于复习了前几章的内容 谁给个监测点的链接啊 我怎么找不到啊 mark一下 难得糊涂,感谢鱼哥指点迷津 还有些在哪里啊 俺来学习,多多指教 不错 哦 比小甲鱼的详细诶