標籤:處理器 目的 資料載入 大小 lis 子程式 訪問 label 交換
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 32ADR R0,thumbcode+1 BX R0 @跳轉到thmbcode,並將處理器切換為thumb模式 thumbcode:.code 16...
BLX帶連結與狀態切換的跳轉指令
格式:BLX{cond} Rm
儲存空間訪問指令LDR
格式:
LDR{type}{cond} Rd,labelLDRD{cond} Rd,Rd2,label
type指定了操作的資料大小
用於從儲存空間中載入資料到寄存器。
LDRD 一次載入雙字的資料,將資料載入到Rd,Rd2中
STR
格式:
STR{type}{cond} Rd,labelSTRD{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中
將寄存器列表中的資料存放區到指定儲存單元
PUSHPOPSWP
格式:
SWP{B}{cond} Rd,Rm,[Rn]
Rd:為要從儲存空間載入資料的寄存器
Rm:為寫入資料到儲存空間的寄存器
Rn:為儲存空間地址
如果 Rd 與 Rm 相同,則可實現寄存器與儲存空間的交換
資料處理指令
ARM組合語言基礎