ARM處理器 八種定址方式
阿新 • • 發佈:2019-01-25
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)
特點:快,單週期;但受合法立即數的限制;
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;
如: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)