复习时可以先不看答案,再把题目做一遍:
检测点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)的缩写和英文名,有效地址和偏移地址是同一种东西。