ARM的尋址方式好像沒有官方的定論,網間傳聞的9種尋址方式分別是:
1、立即尋址; 2、寄存器直接尋址; 3、寄存器間接尋址; 4、寄存器偏移尋址; 5、寄存器基址變址尋址; 6、批量(多)寄存器尋址; 7、相對尋址; 8、堆棧尋址; 9、塊拷貝尋址。
對於這種方式,我並不贊同。首先 所謂 “多寄存器尋址” 和 “塊拷貝尋址”,看不出有什麼區別呀!
我提出以下幾種歸類方式:
1、立即數尋址;
2、寄存器直接尋址;
這裏的直接尋址有兩種情況:
一是,寄存器R 中的數據可以直接使用;
另一種情況是,寄存器R 中的數據要經過位移,再使用,也就是“九種尋址方式” 中的 “寄存器偏移尋址”;
3、寄存器間接尋址;
這裏也分兩種:
一是,直接使用寄存器R 所指地址進行數據的訪問;
另一種情況是,寄存器R 所指地址經過加、減運算得到新的地址後,再訪問新地址的數據;也就是 “九種尋址方式” 中的 “寄存器基址變址尋址”。
4、多寄存器尋址;
這也是分兩種情況:(這裏的多寄存器指的是 多個寄存器與內存之間的數據交換,內存到內存的大量數據傳輸一般是由內存控制器處理或者分成多個尋址動作處理)
一是,針對堆棧的批量數據操作(使用記號:FA、FD、EA、ED);
二是,針對非堆棧的一般內存(使用記號:IA、IB、DA、DB);
但是在實際使用的時候,這種區別已經沒有了,統一都使用了一種記號(IA、IB、DA、DB)。
5、相對尋址;
這種尋址方式,就是彙編程序中的標號跳轉,如: BL c ;c 是main函數的入口地址。
特別說明:
1、本文更適用於 ARM9 的機器,其他機器能分出什麼類,我就不知道了。
2、網上的這種分類挺多,但是官方只給了彙編,並沒有給出尋址方式的具體分類(或者說我沒有找到 #_# !!),兼聽則明吧。
3、ARM9 好像沒有 “直接尋址”,如: MOV R0,[1000] ;直接從地址 1000 取數據。
4、如有錯誤之處,請聯繫郵箱 [email protected] 歡迎一起討論!