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

一、爲什麼 物理地址=段地址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的倍數啊(就看十六進制的數末尾是否爲0,是0就肯定是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的情況下)可以看成內存中段的起始物理地址,但這不表示那些不能做首地址的內存單元訪問不到,因爲一個內存單元的物理地址可以根據段地址和偏移地址有很多種組合來訪問它。

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

原文出處:https://www.cnblogs.com/yxddj/p/11802249.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章