彙編語言——物理地址=段地址x16+偏移地址,檢測點2.2

1、爲何 物理地址=段地址x16+偏移地址?

 

  PS:剛開始學時,我都笨到不明白爲何是2的N次方,咱把物理地址就當數字,計算機中數字是由不少位0或1自由組合的, 而每一位上要麼是0要麼是1,只有這兩種狀況,因此N位就能夠組成2的N次方個編號地址了spa

  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),咱們之後就能夠根據須要邏輯上把內存分段進行內存空間的訪問。blog

2、段地址x16是一個16的倍數

一看標題這不廢話嗎。。。直到看到王爽老師《彙編語言》檢測點2.2,加深了對這句話的理解內存

咱們就作最小爲多少,根據公式很容易想到,當偏移地址最大爲FFFFH時 段地址SA確定最小啊io

①SAx16+FFFFH=20000H基礎

②SAx16=20000H-FFFFH=10001H百度

③SA=10001H/16(10H)=1000H二進制

這也太簡單了吧,百度下看看答案對不對,納尼答案咋是1001H,哪來的啊?我算錯了???算了好幾回都是1000H啊,咋回事?float

  咱們注意SAx16=20000H-FFFFH=10001H,咱們再看一眼標題二,10001H=65537 顯然不是16的倍數啊,而後咱們就把以前用的FFFF換成FFFF-1,FFFF-2,FFFF-3...直到試到FFFF-F=FFF0H時獲得了16的倍數和正確答案吻合了。但這樣操做好累啊,一個一個試,因此快速的作法是反過來想:我要保證首地址是一個16的倍數,從十六進制角度看就是要保證末尾是個0,im

因此20000H-?=末尾是0的數,顯然FFF後面帶個0就能跟20000H末尾的0對應相減獲得末尾是0的數。
d3

  總結:內存中有些內存單元不能做爲段的首地址(段地址x16),由於有些物理地址不是16(10H)的倍數,可是段地址能夠是任何地址由於它要乘16,不管地址是多少均可以,注意我這裏說的段地址並非內存中的地址,由於段地址是16位,內存的物理地址是20位,前面說的首地址(在偏移爲0的狀況下)能夠當作內存中段的起始物理地址,但這不表示那些不能作首地址的內存單元訪問不到,由於一個內存單元的物理地址能夠根據段地址和偏移地址有不少種組合來訪問它。

如有錯誤,請評論指正,謝謝!

相關文章
相關標籤/搜索