【cotex-A7常用汇编指令】

1.处理器内部数据传输指令

使用处理器最多的操作就是在处理器内部来回传递数据,常见操作:
  • 将数据从一个寄存器传递到另一个寄存器;
  • 将数据从一个寄存器传递到特殊寄存器(如CPSR、SPSR);
  • 将立即数传递到寄存器;

(1)mov指令

MOV R0, R1      @将寄存器R1中的数据传递给R0,即R0=R1
MOV R0, #0X12   @将立即数0x12传递给R0,即R0=0X12

(2)mrs指令(读特殊寄存器)

MRS R0, CPSR    @将特殊寄存器CPSR中的数据传递到通用寄存器R0,即R0=CPSR

(3) msr指令(写特殊寄存器)

MSR CPSR, R0    @将通用寄存器R0的数据复制到特殊寄存器CPSR,即CPSR=R0

2.存储器访问指令

ARM不能直接访问存储器

指令描述
LDR Rd,[Rn,#offset]从存储器Rn+offset地址读取数据存放到Rd
STR Rd,[Rn,#offset]将Rd中的数据写入到存储器中Rn+offset地址

(1)LDR指令(读)

LDR R0, =0X0209C004     @将地址0X0209C004加载到R0中,即R0=0X0209C004(立即数用=而不是#)
LDR R1, [R0]            @读取地址0X0209C004中的数据到R1中

(2)STR指令(写)

LDR R0, =0X0209C004     @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004
LDR R1, =0X20000002     @R1保存要写入到存储器的值,即R1=0X20000002
STR R1, [R0]            @将R1中的值写入到R0中所保存的地址中

3.压栈和出栈指令

处理器的栈是向下增长的

PUSH {R0~R3,R12}    @将R12、R3、R2、R1、R0依次压栈
PUSH {LR}           @将LR压栈
POP {LR}            @先恢复LR
POP {R0~R3, R12}    @依次恢复R0~R3,R12

等价操作

STMFD SP!,{R0~R3,R12}
STMFD SP!,{LR}

LDMFD SP!,{LR}
LDMFD SP!,{R0~R3,R12}

4.跳转指令

(1)B指令

B指令会将PC寄存器的值设置为跳转目标地址,一旦执行,ARM处理器会立马跳转到指定目标地址

_start:

    LDR SP,0X80200000       @设置栈指针
    B main                  @跳转到main函数

(2)BL指令

相比B指令,会在跳转之前在寄存器LR(R14)中保存当前PC值,所以可以将LR值重新加载到PC中跳回之前位置继续运行

PUSH {R0,R1}            @R0、R1入栈
CPS #0X13               @进去SVC模式、允许其他中断再次进去

BL  system_irqhandler   @加载C语言中断处理函数到R2寄存器中

CPS #0X12               @进去IRQ模式
POP {R0,R1}             @R0、R1出栈
STR R0,{R1,#0X10}       @中断执行完成,写EOIR

5.算数运算指令

指令计算公式
ADD Rd,Rm,RnRd=Rm+Rn
Add Rd,Rm,#immedRd=Rm+#immed
ADC Rd,Rm,RnRd=Rm+Rn+进位
ADC Rd,Rm,#immedRd=Rm+#immed+进位
SUB Rd,Rm,RnRd=Rm-Rn
SUB Rd,Rm,#immedRd=Rm-#immed
SBC Rd,Rm,RnRd=Rm-Rn-借位
SBC Rd,Rm,#immedRd=Rm-#immed-借位

6.逻辑运算指令

指令计算公式
AND Rd, RnRd = Rd &Rn
AND Rd, Rn, #immedRd = Rn &#immed
AND Rd, Rn, RmRd = Rn & Rm
ORR Rd, RnRd = Rd
ORR Rd, Rn, #immedRd = Rn
ORR Rd, Rn, RmRd = Rn
BIC Rd, RnRd = Rd & (~Rn)
BIC Rd, Rn, #immedRd = Rn & (~#immed)
BIC Rd, Rn , RmRd = Rn & (~Rm)
EOR Rd, RnRd = Rd ^ Rn
EOR Rd, Rn, #immedRd = Rn ^ #immed
EOR Rd, Rn, RmRd = Rn ^ Rm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值