這道題是彙編語言第二版的習題,一開始我也是百思不得其解,下面看看吧:
有一數據存放在內存20000H單元中,現給定段地址爲SA,若想用偏移地址尋址到此單元,
則SA 應知足的條件是:最小爲 1001H 最大爲 2000H ;
最大值: (不少人最大值很容易算出來,可是最小值卡住了,很納悶爲何是1001H)
咱們能夠根據原題列出一個式子: X * 10H + 0H = 20000H
咱們以前是乘以16,可是那個16是十進制的,由於整個式子裏都是16進制,加入個10進制去算會出錯的
因此呢,咱們把16轉換爲16進制的數,就是10H
段地址 = 物理地址 - 偏移地址 除以 10H
X = 20000H - 0H / 10H
求得結果是2000H
由於咱們要求的是最大的段地址,因此就用上最小的偏移地址配合他,也就是0H
最小值:
SA * 16 + FFFFH = 20000H 段最小值那麼就要用最大偏移地址來配合它。
SA * 16 = 20000H - FFFFH
SA * 16 = 10001H 咱們求得了這個段地址,可是還要除以10H,或者轉換爲10進制,再除以10進制的16
(那爲何不是1000H呢?下面是daan……)
段地址要爲16(10H)的倍數,
20000H - FFFF = 10001H 10001H十進制是65537,除以16是4096.0625 有小數說明不是倍數,不能整除
20000H - FFFE = 10002H 10002H十進制是65538,除以16是4096.125 有小數說明不是倍數,不能整除
20000H - FFFD = 10003H 10001H十進制是65539,除以16是4096.1875 有小數說明不是倍數,不能整除
20000H - FFFC = 10004H 10001H十進制是65540,除以16是4096.25 有小數說明不是倍數,不能整除
20000H - FFFB = 10005H 10001H十進制是65541,除以16是4096.3125 有小數說明不是倍數,不能整除
20000H - FFFA = 10006H 10001H十進制是65542,除以16是4096.375 有小數說明不是倍數,不能整除
(這些的值都不是16的倍數)
咱們不斷減少值,由於FFFF是最大,不能再大了,因此只能減少,直到....... (要直到除以16是整數爲止)
20000H - FFF0 = 1 0010H 1 0010H十進制是65552,除以16是4097,能夠整除
這時10010H知足16(10H)的倍數了
物理地址減去 [能夠被16整除的最大偏移地址,在這一題中也就是FFF0H] 的結果,除以16(10H)等於最小段地址
20000H - FFF0H / 10H = 1001H ,因而這個1001H這個苦逼的孩子就是daan了。。。
提示,反過來思考一下,當段地址給定爲多少,CPU不管怎麼變化偏移地址都沒法尋到20000H單元?
·根據上面一題的daan,小於1001H,或者大於2000H都沒法尋到20000H單元
內存