間接定址
出自 MBA智库百科(https://wiki.mbalib.com/)
目錄 |
間接定址是相對於直接定址而言的,指令地址欄位的形式地址D不是操作數的真正地址,而是操作數地址的指示器,或者說是D單元的內容才是操作數的有效地址。
間接定址是在直接定址的基礎上面建立起來的,也就是直接定址得到的數據是一個地址,通過這個地址找到最終的數據,也就是兩次定址,第一次得到的是地址,第二次才是目標數據。
寄存器間接定址:
在MCS-51單片機中,為了對寄存器定址和寄存器間接定址加以區別,在寄存器名稱前加一個符號@來表示寄存器間接定址。
如mov A,@R0
第一次定址得到寄存器R0的值,這個值是一個地址,再通過這個地址,第二次定址得到存數器數據。就是把寄存器里的內容看成是地址,然後把這個地址裡面的內容賦給累加器A。比如說,R0寄存器的內容是3AH,而3AH這個地址里的內容是77H,那麼上條指令執行後累加器A的內容變為77H。所謂“間接”,即A通過“3AH”找到77H。
操作數放在RAM某個單元中,該單元的地址又放在寄存器R0或R1中。 如果RAM的地址大於256,則該地址存放在16位寄存器DPTR(數據指針)中,此時在寄存器名前加@符號來表示這種間接定址。如MOV A,@ R0。其它還有變址定址、相對定址、位定址等。如用單片機控制溫度時,時時需要將給定的控制溫度(如20℃)減去環境溫度,而環境溫度時時有變化,顯然無法在程式指令中給出,只有通過一定方式,將其送入某個輸入/輸出口,再存放在某個寄存器中,這就必須用到寄存器定址。又如要進行算術運算,要計算每班學員各科成績的平均值,如果把每個學員的各科都編一個程式,在程式中直接給出該學員各科成績,再求平均值,顯然太麻煩。這裡可以編一個求平均成績的通用程式,把每位學員的成績送入存貯器的各個單元中,這時可採取直接定址,所以,定址方式越多,編製程式就越方便、靈活,適用範圍就越廣。
寄存器的間接定址需要以寄存器符號的形式來表示,且在寄存器名稱前面加上間接定址符號“@”。例如指令MOV A,@R0就使用了寄存器間接定址方式,這條指令的意義為將地址指針R0指向的內部數據存儲器單元中的數據送入累加器A中.
假設R0中內容為30H,則此指令的功能是以R0寄存器的內容30H為地址,把內部RAM 30H單元中的內容傳送給累加器A。
8051規定,採用R0、R1 DPTR作為間接定址寄存器,可定址片內數據存儲器RAM的低128B單元和片外數據存儲器的低256單元。
採用DPTR作間址寄存器,可定址片外數據存儲器的整個64KB地址空間。堆棧指針SP用於指示堆棧操作的地址,因此,PUSH和POP指令也是寄存器間接定址。