簡介
相對於直接定址而言的,指令地址欄位的形式地址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指令也是暫存器間接定址。