经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 汇编语言 » 查看文章
汇编语言——物理地址=段地址x16+偏移地址,检测点2.2
来源:cnblogs  作者:Y喜东东J  时间:2019/11/6 8:49:00  对本文有异议

一、为什么 物理地址=段地址x16+偏移地址?

 

  PS:刚开始学时,我都笨到不明白为什么是2的N次方,咱把物理地址就当数字,计算机中数字是由很多位0或1自由组合的, 而每一位上要么是0要么是1,只有这两种情况,所以N位就可以组成2的N次方个编号地址了

  8086CPU的地址总线是20条(位),因此就可以给104 8576个(1M)内存单元进行地址编号,而寄存器和数据总线都是16位的,16位对应6 5536(64K),这样就浪费了好多好多内存空间啊,咋办?于是那些聪明人整了个地址加法器,地址加法器干的活计就是把16位的段地址乘以16,为啥非得是16呢?我让你干件事:你把数字68左移一位是多少,你告诉我680,没错,你把68后面补个0 其实就是乘以了10,我再让你把十六进制38H左移一位你还是像刚才那么干在后面补个0是380H,其实还是乘以了10H, 而这里的10H对应十进制16,1位十六进制对应4位二进制,所以段地址乘以十进制的16,就是相当于在一个16位的二进制数后面补了4个0,哇这不就凑成了20位,内存就避免了浪费,乘完16得到了一个首地址(起始地址/基础地址),把首地址作为一个起始地址加上一个16位二进制偏移地址,偏移地址的偏移量是0H~FFFFH(因为16位二进制数最大是FFFFH),所以段空间最大是64K(FFFFH),我们以后就可以根据需要逻辑上把内存分段进行内存空间的访问。

二、段地址x16是一个16的倍数

一看标题这不废话吗。。。直到看到王爽老师《汇编语言》检测点2.2,加深了对这句话的理解

我们就做最小为多少,根据公式很容易想到,当偏移地址最大为FFFFH时 段地址SA肯定最小啊

①SAx16+FFFFH=20000H

②SAx16=20000H-FFFFH=10001H

③SA=10001H/16(10H)=1000H

这也太简单了吧,百度下看看答案对不对,纳尼答案咋是1001H,哪来的啊?我算错了???算了好几次都是1000H啊,咋回事?

  我们注意SAx16=20000H-FFFFH=10001H,我们再看一眼标题二,10001H=65537 显然不是16的倍数啊,然后我们就把之前用的FFFF换成FFFF-1,FFFF-2,FFFF-3...直到试到FFFF-F=FFF0H时得到了16的倍数和正确答案吻合了。但这样操作好累啊,一个一个试,所以快速的做法是反过来想:我要保证首地址是一个16的倍数,从十六进制角度看就是要保证末尾是个0,

所以20000H-?=末尾是0的数,显然FFF后面带个0就能跟20000H末尾的0对应相减得到末尾是0的数。

  总结:内存中有些内存单元不能作为段的首地址(段地址x16),因为有些物理地址不是16(10H)的倍数,但是段地址可以是任何地址因为它要乘16,无论地址是多少都可以,注意我这里说的段地址并不是内存中的地址,因为段地址是16位,内存的物理地址是20位,前面说的首地址(在偏移为0的情况下)可以看成内存中段的起始物理地址,但这不表示那些不能做首地址的内存单元访问不到,因为一个内存单元的物理地址可以根据段地址和偏移地址有很多种组合来访问它。

若有错误,请评论指正,谢谢!

原文链接:http://www.cnblogs.com/yxddj/p/11802249.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号