一、為什麼 物理地址=段地址x16+偏移地址? PS:剛開始學時,我都笨到不明白為什麼是2的N次方,咱把物理地址就當數字,電腦中數字是由很多位0或1自由組合的, 而每一位上要麼是0要麼是1,只有這兩種情況,所以N位就可以組成2的N次方個編號地址了 8086CPU的地址匯流排是20條(位),因此就可以 ...
一、為什麼 物理地址=段地址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的倍數啊,然後我們就把之前用的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的情況下)可以看成記憶體中段的起始物理地址,但這不表示那些不能做首地址的記憶體單元訪問不到,因為一個記憶體單元的物理地址可以根據段地址和偏移地址有很多種組合來訪問它。
若有錯誤,請評論指正,謝謝!