王爽《汇编语言》检测点2.2答案及解析

复习时可以先不看答案,再把题目做一遍:

检测点2.2:

(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为___到___。

(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元。则SA应满足的条件是:最小为______,最大为______。

提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻找到20000H单元?


答案与解析:

(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为___到___。

答:00010H;1000FH

注:

  • 8086CPU中,段地址和偏移地址都是16位,所以偏移地址的范围是0000H~FFFFH。
  • 物理地址=段地址*16+偏移地址,所以起始位的物理地址=00010H+0000H=00010H;末尾位的物理地址=00010H+FFFFH=1000FH。(因为8086CPU有20位地址总线,地址加法器计算段地址*16+偏移地址得到的物理地址是20位的,所以此处最高位的1不会丢失)
  • 1位十六进制对应4位二进制,所以上述寻址范围结果均为有5位的十六进制数,即20位二进制数,对应8086CPU20位的地址总线。
  • ”段地址*16“有一个更为常见的说法是左移4位(二进制位);一个数据的十六进制形式左移1位,相当于乘16;一个数据的十进制形式左移1位,相当于乘10;一个X进制的数据左移1位,相当于乘X。(详见书第2.6节“由段地址*16引发的讨论”)

(2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元。则SA应满足的条件是:最小为______,最大为______。

答:1001H;2000H

注:

  • 段地址可称为SA,偏移地址可称为EA,物理地址=SA*16+EA;在8086CUP中,SA和EA都为16位二进制数。
  • 一个数据的十六进制形式左移1位,相当于乘16;那么十六进制形式右移一位,相当于除16。
  • EA的取值范围为0000H~FFFFH:
    • 当EA=0000H时,20000H=SA*16+0000H,SA=20000H/16(即十六进制右移1位)=2000H;
      • 验算:2000H*16(十六进制左移1位相当于*16)+0000H=20000H;物理地址20000H固定,所以当EA取到最小值0000H,则SA取到最大值2000H。
    • 当EA=FFFFH时,20000H=SA*16+FFFFH,20000H-FFFFH=10001H(注意计算该式子列竖式时,类比十进制减法的竖式,最后一位向前借1,使得最后一位计算是16-FH(15)=1,倒数第二位因为已经被最某位借了1,倒数第二位再向前借1后,该位的计算是FH(15)-FH(15)=0,以此类推),SA=10001H/16(即十六进制右移1位,最末位的1丢失)=1000H;
      • 验算:1000H*16+FFFFH=1FFFFH≠20000H,此时物理地址为1FFFFH比应在的20000H少1,而此时EA已取得最大值FFFFH,不能再增加1来填补缺少的1,所以SA=1001H才是能取得的最大值,而相应的EA=20000H-1001H*16=FFF0H。

 提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻找到20000H单元?

答:[0000H, 1000H]∪[2001H, FFFFH]

注:

由第(2)题可知,若想用偏移地址寻找到物理地址为20000H单元,段地址SA的取值范围应为1001H~2000H,所以无法寻找到20000H的SA取值范围应该是[0000H, FFFFH]与[1001H,2000H]的差集。


总结:

1、十六进制的加减法可以类比十进制的加减法理解。十进制加减法列竖式时,向前一位进1或者借1时,对应的十进制数字是10;十六进制加减法列竖式时,向前一位进1时或者借1时,对应的十进制数字应该是16。

2、在第(2)题计算段地址SA能取得的最大地址时,在进行除16操作(左移1位)时导致最末位的1丢失的情况下,非常有必要进行验算,以免丢失而带来的误差。

3、牢记段地址SA(Segment Address),有效地址EA(Effective Address)/ 偏移地址(Offset Address)的缩写和英文名,有效地址和偏移地址是同一种东西。

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值