下面我們看看對有效地址的訪問和對禁止地址寫入時造成的后果
第一段程序的意圖是將兩個數(shù)據(jù)31H和11H分別存入外部數(shù)據(jù)存儲器的兩個單元中,但程序中卻使用了第一片存儲器物理空間00單元所對應的兩個邏輯單元,其結 果是第二個數(shù)據(jù)11H覆蓋了第一片存儲器物理地址00單元中的第一個數(shù)據(jù)31H,這段程序說明的問題是外部存儲器的一個物理單元對應兩個邏輯地址,但它仍舊只是一個存儲器,不能當兩個存儲器使用。
第二段程序的意圖是將數(shù)據(jù)31H存入第二片外部數(shù)據(jù)存儲器物理單元00中,然后再分別使用該物理單元所對應的兩個邏輯地址從該單元中取數(shù)據(jù),其效 果一樣,說明對某一物理單元訪問時,使用該單元對應的任一個邏輯地址都可以。
第三段程序的意圖是向禁止單元0000H寫入一個數(shù)12H,其后果是將有效邏輯地址8000H和2000H中的數(shù)據(jù)覆蓋了,至使下次程序從8000H和2000H中取數(shù)據(jù)時,取得數(shù)據(jù)都為12H而不是原來存入該兩單元中的正確數(shù)據(jù)。
下面是第一段程序的運行過程:
第一條指令置累加器A的內容為31H
第二條指令置DPTR的內容為8000H
第三條指令將累加器A的內容31H存入外部數(shù)據(jù)存儲器8000H單元
(注意:今后在未作說明的情況下的地址都是指CPU的邏輯地址)
其結果是將31H存入了第一片存儲器的物理單元00中
第四條指令是將數(shù)據(jù)11H送入累加器A中
第五條指令是將0C000H送入DPRT中
第六條指令是將累加器A中的內容11H存放外部數(shù)據(jù)存儲器0C000H中
其實質是存入了第一片存儲器的物理單元00中,將上次存入該物理單元中的數(shù)據(jù)31H覆蓋掉了,從這段程序的運行我們可以看出,企圖將一個物理存儲單元的兩個邏輯地址當兩個存儲器來使用是錯誤的。
下面我們來看第二段程序的運行:
第一條指令將數(shù)據(jù)31H送入累加器A
第二條指令將2000H送入DPTR中
第三條指令將累加器中的數(shù)據(jù)31H存入外部數(shù)據(jù)存儲器2000H單元中,其實質是存入第二片存儲器的物理單元00中
第四條指令將外部數(shù)據(jù)存儲器2000H單元中的數(shù)據(jù)取入累加器,其實質是將第二片數(shù)據(jù)存儲器物理單元00中的數(shù)據(jù)取回累加器中
第五條指令是將數(shù)據(jù)6000H送入DPTR中
第六條指令將外部數(shù)據(jù)存儲器6000H單元中的數(shù)據(jù)取回累加器
可以看出其實質也是從第二片存儲器物理單元00中取數(shù)據(jù),其結果當然與上次從2000H單元中取數(shù)一樣,可見,使用同一物理單元的不同邏輯地址訪問存儲器時,效果相同。
下面我們來看第三段程序的運行過程:
第一條指令將數(shù)據(jù)000H送入DPTR
第二條指令將數(shù)據(jù)12H送入累加器A中
第三條指令將累加器中的數(shù)據(jù)12H存入外部數(shù)據(jù)存儲器0000H單元中
由于CPU發(fā)地址0000H使P2.5和P2.7同時為0,至使兩片存儲器的片選信號都有效,兩片存儲器的地址線A0-A12為低電平,所以在CPU發(fā)寫信號后,其結 果當然與上次從2000H單元中取數(shù)一樣。
可見,使用同一物理單元的不同邏輯地址訪問存儲器時,效果相同,第二片存儲器物理單元00的有效邏輯地址為2000H和6000H,可見,這條對禁止地址0000H的寫入指令破壞了上述有效邏輯地址原有內容,所以我們在程序中千萬不能使用禁止地址和無效地址。