ARM處理器 定址方式 2-1 寄存器定址 • 直接由暫存器取出值操作 • 指令中的位址為暫存器編號 • 例題: MOV R1,R2 ; R2 -> R1 SUB R0,R1,R2 ; R1 - R2 -> R0 2-2

Download Report

Transcript ARM處理器 定址方式 2-1 寄存器定址 • 直接由暫存器取出值操作 • 指令中的位址為暫存器編號 • 例題: MOV R1,R2 ; R2 -> R1 SUB R0,R1,R2 ; R1 - R2 -> R0 2-2

ARM處理器
定址方式
2-1
寄存器定址
• 直接由暫存器取出值操作
• 指令中的位址為暫存器編號
• 例題:
MOV R1,R2 ; R2 -> R1
SUB R0,R1,R2 ; R1 - R2 -> R0
2-2
立即定址
• 指令碼是 指令 也是 運算元
• 取出指令即可做運算
• “#”後的值為立即值,16 進制數值時以
“0x”表示
• 例題:
SUBS R0,R0,#1 ; R0 – 1 -> R0
MOV R0,#0xff00 ; 0xff00 -> R0
2-3
暫存器偏移定址
•
•
•
•
進行偏移動作
先 偏移 後 作運算
第2 個運算元在與第1 個運算元結合之前
例題:
MOV R0,R2,LSL #3 ;
R2 的值左移3 位,結果放入R0,
即R0 = R2 * 8
2-4
暫存器間接定址
• 指令中的位址碼為通用暫存器編號
• 運算元儲存在暫存器指定位址的儲存單元
中
• 例題:
LDR R1,[R2] ;
將R2 中的數值作為位址,
取出位址中的資料儲存在R1 中
2-5
基址定址
• 暫存器的內容與指令中給出的偏移量相加
• 常用於查表,陣列操作,功能指令暫存器
存取等
• 例題:
LDR R2,[R3,#0x0F] ;
將R3 中的數值加0x0F 作為位址,
將此位址的數值儲存在R2 中
2-6
多暫存器定址
• 一次可以傳多個暫存器值
• 順序由小到大的順序排列,連續的暫存器
可用“-”連接,否則,用“,”分隔書
寫
• 例題:
LDMIA R1!,{R2-R7,R12} ;
將R1 中的資料讀到R2-R7, R12,
R1 自動加1
2-7
堆疊定址
• 特定順序進行存取的儲存區
• 例題:
STMFD SP!,{R1-R7,LR} ;
將R1~R7,LR 存入
2-8
區塊複製定址
• 將資料整段複製
• 記憶體的某一位置複製到另一位置
• 例題:
STMIA R0!,{R1-R7} ;將R1~R7 的資料
儲存到記憶體中,記憶體指標在儲存第一
個值之後增加
2-9
相對定址
• 指令中的位址碼欄位作為偏移量
• 兩者相加後得到的位址即為運算元的有效位址
• 例題:
BL ROUTE1 ; 調整到ROUTE1 副程式
BEQ LOOP ; 條件跳躍到LOOP 旗標處
…
LOOP MOV R2,#2
…
ROUTE1
2-10
ARM 指令集
2-11
ARM 指令集
•
•
•
•
指令格式
記憶體存取指令
資料處理指令
跳躍指令
2-12
基本格式
• 第2 個運算元
• 條件碼
2-13
第2 個運算元
• 指令格式
<opcode>{<cond>}{S}<Rd>,<Rn>
{,<opcode2>}
<opcode>是指令助記符號
{<cond>}為指令執行條件
2-14
第2 個運算元
• 靈活的使用第2 個運算元能提高代碼效率
• 基本運算元
#immed_8r
Rm
Rm,shift
條件碼
2-15
第2 個運算元#immed_8r
• 常數是由一個8 位的常數
• 例題:
ND R1,R2,#0x0F ;
R2 與0x0F作運算,結果儲存在R1
2-16
第2 個運算元Rm
• 算元即為暫存器的數值
• 例題:
SUB R1,R1,R2 ;R1-R2=>R1
2-17
第2 個運算元Rm,shift
• 暫存器的移位結果作為運算元
• RM 值不變
• ASR #n 算術右移n 位(1≤n≤32)
LSL #n 邏輯左移n 位元(1≤n≤31)
• 例題:
ADD R1,R1,R1,LSL #3 ;
R1=R1*9
2-18
條件碼
• 相等、不相等(EQ、 NE )
• 無符號數大於或等於、無符號數小於
(CS/HS 、CC/LO )
• 負數、正數或零(MI 、PL )
• 溢出、沒有溢出(VS、 VC )
2-19
條件碼
• 無符號數大於、
無符號數小於或等於(HI、LS )
• 帶符號數大於或等於、
帶符號數小於(GE、 LT )
• 帶符號數大於、
帶符號數小於或等於(GT、 LE )
• 無條件執行(AL )
2-20
條件碼
• 例題:
CMP R0,R1 ;R0 與R1 比較
ADDHI R0,R0,#1 ;若R0>R1,則
R0=R0+1
ADDLS R1,R1,#1 ;若R0<=R1,
則R1=R1+1
2-21
ARM 記憶體存取指令
• LDR
• LDM
• SWP
2-22
ARM 記憶體存取指令LDR
• 記憶體中讀取資料放入暫存器
• 格式:
LDR{cond} {T} Rd, <地址> ;
載入指定位址上的資料(字),放入Rd 中
• 例題:
LDR R2,[R5] ;
載入R5 指定位址上的資料(字),
放入R2 中
2-23
ARM 記憶體存取指令LDM
• 為載入多個暫存器
• 格式:
LDM{cond}<模式> Rn{!},reglist{^}
• 例題:
LDMIA R0!,{R3-R9} ;
載入R0 指向位址上的多字資料,
儲存到R3~R9 中,R0 值更新
2-24
ARM 記憶體存取指令SWP
• 將一個記憶體單元(暫存器Rn 中)讀取到一
個暫存器Rd 中,同時將另一個暫存器Rm 寫
入到該單元中
• 格式:
SWP{cond}{B} Rd,Rm,[Rn]
B 參數 ;Rd 從記憶體載入到的暫存
器;Rm 儲存到記憶體中
2-25
ARM 記憶體存取指令SWP
• 例題:
SWP R1,R1,[R0] ;
將R1 的內容與R0 指向的儲存單元
的內容進行交換
2-26
ARM 資料處理指令
•
•
•
•
資料傳送指令
算術邏輯運算指令
比較指令
乘法指令
2-27
資料傳送指令
• MOV、MVN
• 格式:
MOV{cond}{S} Rd,operand2
MVN{cond}{S} Rd,operand2
• 例題:
MOV R0,R1 ;R0=R1
MVN R1,R2 ;將R2 取反,結果存到R1
2-28
算術邏輯運算指令
• ADD、SUB 、RSB 、AND 、ORR
• 格式:
ADD{cond}{S} Rd,Rn,operand2
ORR{cond}{S} Rd,Rn,operand2
• 例題:
ADD R1,R1,R2 ;R1=R1+R2
EOR R2,R1,R0 ;R2=R1^R0
2-29
比較指令
• CMP、CMN、TST、TEQ
• 格式:
CMP{cond} Rn,operand2
TST {cond} Rn,operand2
• 例題:
CMP R1,R2 ;
R1 與R2 比較,設定相關旗標位元
TST R0,#0x01 ;
判斷R0 的最低位是否為0
2-30
乘法指令
• MUL 、MLA
• 格式:
MUL{cond}{S} Rd,Rm,Rs
MLA{cond}{S} Rd,Rm,Rs,Rn
• 例題:
MUL R1,R2,R3 ;R1=R2×R3
UMLAL R0,R1,R5,R8 ;
(R1,R0)=R5×R8+(R1,R0)
2-31
跳躍指令
• B(跳躍 )、BL(帶鏈結的跳躍 )、BX(分支與
轉換的跳躍 )
• 格式:
B{cond} label
• 例題:
B WAITA ;跳躍到WAITA 標號處
BL DELAY ; 副程式使用
BX R0 ;跳躍到R0,依據R0 的最低位元
來切換處理器狀態
2-32