ARM匯編語言基礎
阿新 • • 發佈:2018-08-09
指令 加載數據 操作 實現 code reg 操作數 處理器 csp
ARM 與 Thumb 寄存器對應關系
- PC寄存器: ARM狀態為R15,Thumb狀態為PC
- LR寄存器: ARM狀態為R14,Thumb狀態為LR
- SP寄存器: ARM狀態為R13,Thumb狀態為SP
- IP寄存器: ARM狀態為R12,Thumb狀態為IP
- FP寄存器: ARM狀態為R11,Thumb狀態為FP
其他對應關系一一相同
ARM 與 Thumb 指令集
指令格式:
其中
- opcode為助記符
- cond為條件
- S指定其是否影響CPSR寄存器的值(也就是程序狀態字)
- .W與.N指定指令寬帶。(一個指定32,一個指定16)
- Rd 目的寄存器
- Rn 第一個操作數寄存器
- operand2為第二個操作數
跳轉指令
B 跳轉指令
格式:B{cond} label
BL帶鏈接的跳轉指令
格式:BL{cond} label
當條件滿足時,會將當前指令的下一條指令保存到R14(LR)寄存器中,然後跳轉到label中。這通常用於調用子程序,在子程序的尾部,通過 MOV PC,LR 返回
BX 帶狀態切換的跳轉指令
格式:BX{cond} Rm
當執行BX指令時,如果條件cond滿足,則處理器會檢查Rm的為[0]是否為1,如果為1,這將CSPR寄存器的T置1,並將目標代碼解釋為Thumb代碼來執行。為0的話,復位 CSPR寄存器的T。並將目標代碼解釋為ARM代碼來執行。
eg:
.code 32 ADR R0,thumbcode+1 BX R0 @跳轉到thmbcode,並將處理器切換為thumb模式 thumbcode: .code 16 ...
BLX帶鏈接與狀態切換的跳轉指令
格式:BLX{cond} Rm
存儲器訪問指令
LDR
格式:
LDR{type}{cond} Rd,label
LDRD{cond} Rd,Rd2,label
type指定了操作的數據大小
用於從存儲器中加載數據到寄存器。
LDRD 一次加載雙字的數據,將數據加載到Rd,Rd2中
STR
格式:
STR{type}{cond} Rd,label
STRD{cond} Rd,Rd2,label
用於儲存數據到指定的存儲單元
LDM
格式:
LDM{addr_mode}{cond} Rn{!},reglist
其中 ! 為可選,如果有,則將最終地址回寫到Rn中
該指令從指定的存儲單元,加載數據到寄存器列表中
eg:
LDMIA R0!,{R1-R3} @依次加載R0地址處的數據到R1,R2,R3寄存器中
STM
格式:
STM{addr_mode}{cond} Rn{!},reglist
其中 ! 為可選,如果有,則將最終地址回寫到Rn中
將寄存器列表中的數據存儲到指定存儲單元
PUSH
POP
SWP
格式:
SWP{B}{cond} Rd,Rm,[Rn]
Rd:為要從存儲器加載數據的寄存器
Rm:為寫入數據到存儲器的寄存器
Rn:為存儲器地址
如果 Rd 與 Rm 相同,則可實現寄存器與存儲器的交換
數據處理指令
ARM匯編語言基礎