1. 程式人生 > >ARM處理器 八種定址方式

ARM處理器 八種定址方式

ARM處理器的八種定址方式: 前言:1.什麼是定址?資料都存在儲存器中,定址簡單地說就是找到儲存資料或指令的地址。儲存器有很多儲存單元,用於儲存資料。或者說,定址就是讀取資料所在儲存裝置中對應地址編號中儲存的內容。以儲存單位定址分為位,字,節,字,雙字定址。以功能定址分為直接定址,間接定址,暫存器定址。定址就是為運算和執行命令。            2.什麼是定址方式?通常是指某一個CPU指令系統中規定的尋找運算元所在地址的方式,或者說通過什麼的方式找到運算元。定址方式的方便與快捷是衡量CPU效能的一個重要方面.  1.立即數定址:         運算元在指令中,如: ADD R0,R0,#10   ---->R0 = R0 + 10

        特點:快,單週期;但受合法立即數的限制;
2.暫存器定址:         利用暫存器中的值作為運算元,如:ADD R0,R1,R2   ---->R0 = R 1 + R 2
        特點:也是單週期
3.暫存器移位定址:         暫存器中的值移位後得到運算元,用到桶形移位器
            介紹一下桶形移位器:
                            LSL:(邏輯左移),相當於無符號數x2;
                            ASR: (算術右移),相當於帶符號的數除2;
                            LSR: (邏輯右移),相當於無符號數除2;                             ROR:(迴圈右移),相當於位輪換;                            RRX:(帶擴充套件的迴圈右移),位輪換,從CF到MSB都參與(這一項誰比較懂的幫忙解釋一下)

  如:ADD  R0,R1,R2,LSL #2    -------->R0 = R1 + R2<<2;
4.暫存器間接定址:         暫存器中的值作為運算元的地址,運算元本身放在儲存器中;
        如:LDR   R0,【R1】   ---->R0 = 【R1】,取出R1存的地址中的值,賦給R0;
5.基址變址定址:         基址暫存器的內容與指令中的偏移量相加,得到有效運算元的地址,然後訪問該地址空間;
        分三種:
       1)、前索引:
                如:LDR  R0,【R1,#4】  --->R1存的地址+4,訪問新地址裡面的值,放到R0;
        2)、自動索引:
                如:LDR  R0, 【R1,#4】!  --->在前索引的基礎上,新地址回寫進R1;
                           注:!表示回寫地址
  3)、後索引:
                如:LDR  R0  【R1】,#4  --->R1存的地址的內容寫進R0,R1存的地址+4再寫進R1;
6.多暫存器定址: 一條指令完成多個暫存器的傳送,最多16個暫存器;
        如:STMxx  R0!,{R1-R5}
  注:xx是IDAB的任意組合:I-增;D-減;A-後;B-先;
  執行這類指令要考慮如下幾個問題:
                1)、基址暫存器指向原始地址有沒有放一個有效值?
                2)、暫存器列表哪個暫存器被最先傳送?
                3)、儲存器地址增長方向?
                4)、指令執行完成後,基址暫存器有沒有指向一個有效值?
        如:STMia  R0!,{R1-R5} 的答案分別是:有;R1;低-高;沒有。         為什麼要考慮這麼多,因為涉及到資料還原的問題;
                如:STMib   r0!,[r1-r5]
                        LDMda  r0! , [r1-r5]             ------還原
7.相對定址: pc當前值位基址,指令中值為偏移量,相加作為運算元的地址;
        如  B/BL    不過有範圍限制 pc+-32Mbytes
8.堆疊定址: 先進先出的原則;
            如:STMxx  SP! (r0 - r12)   ---  xx是FEAD的任意組合,不過規定只用fd;
 4中堆疊方式:F-滿;E-空;A-後;B-先;
            如:入棧:STMfd  SP!,(r0-r12)
                    出棧:LDMfd SP! ,(r0-r12)