ARM的定址:
在ARM中運算方式是採用Load/Stor架構
(即其運算,需先放在暫存器中且結果也是)
- 立即定址:
- 即其運算元本身即為其資料。故取出指令也就取得運算元.
- ADD R3,R3,#1 ;R3=R3+1
- ADD R8,R7,#&ff ;R8=R7[7:0]
- 是"#"為頭開.十六進位為在"#"後加0x or &
- 暫存器定址:
- 以暫存器中的內含值作為運算元。
- ADD r1,r2,r3 ;r1=r2+r3
- 暫存器間接定址:
- 以暫存器中的數值作為運算元的位址,而真正的運算元放在"memory"
- ADD r0,r1,[r2] ;r0=r1+[r2]
- Ldr r0,[r1] ; r0=[r1]
- 暫存器間接定址大多使用一個暫存器(基底暫存器)的數值作為記憶体的位址.
- 基底定址:
- 將暫存器(基底)的內容與指今中所給多的位址偏移量加以相加,並進而得到一個運算元的有效位址
- LDR r0,[r1,#4] ; r0=[r1+4]
- 用來處理基底附近的記憶体,基底加偏移量:前索引(pre-index)和後索引(基底+索引定址)
- "暫存器間接定址[]"是移移量為0的氐加上偏移定址 ;"基底加偏移[,#]"定址中基底暫存器包含的並非是確定位址,基底需加(減)若干偏移量(max 4KB)來計算所要處理的位址。
- 除了找到基底定址所指資料外,還可改為基底暫存器內容
- LDR r0,[r1,#4]! ;r0=[r1+4],r1=r1+4,以"!"表示在完成資料傳送後,同時更新基底暫存器內容.
- 前索引 [r1,#4] ;後索引[r1],#4。
- 後索引:基底不包今偏移量來做傳送的位址,且再傳送後,自動加上索引
- LDR r0,[r1],#4 ;r0=[r1],r1=r1+#4
- 相對定址:
- 以PC計數暫存器為基底,而指今中的位址作為偏移量來得到有效位址
- BL Next
- …
- Next
- …
- mov pc,lr
- 多暫存器定址:
- 一個指今完成多個暫存器的傳送
- LDMIA R0,{R1,R2,R3,R4}; R1=[R0];R2=[R0+4];R3=[R0+8];R4=[R0+12]
- 最多可傳16個暫存器及其"IA"為表示在執行完LOAD/STOR後,r0以work增加長度。
- 堆疊定址:
- LIFO/FILO
- 以一個堆疊指標器來指向一塊stack的頂端,並且可分為
- 向上:向高位址生長,
- 向下:向低位址
- 可分為滿遞增(FA)、空遞增(EA)、滿遞減(FD)及空遞減(ED)
- 要pop, push存取
組合組言:
<opcode>{<cond>}{S} <Rd>,<Rn>,<Shifter-operand>
ADD r0,r1,r2 ; r0=r1+r2 ,no update flage
ADDS r0,r1,r2 ; r0=r1+r2,update flage
ADDCSS r0,r1,r2 ;if C flage set then r0=r1+r2 and update flage
CMP r0,r1 ;update flage based on r0-r1
//---------------
c file
if(z==1) r1=r2+(r3*4) ;
a.ADDS r1,r2,r3,LSL #2 ; r1=r2+r3*4 and update flage
b.EQADDS …; if zero flage is 1
其符號<>: 必存在; {}選擇項
//-----------------
ARM的指令集分為
- 跳躍指今
- 資料處理指令
- 程式狀態暫存器(PSR)處理指令
- 載入/存回指令
- 協同處理器指今
- 例外事件產生指令
程式狀態暫存器:
http://www.slideshare.net/jserv/arm-and-soc-traning-part-ii-system
沒有留言:
張貼留言