1. 程式人生 > >ARM匯編語言基礎

ARM匯編語言基礎

指令 加載數據 操作 實現 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匯編語言基礎