【FreeRTOS】ARM寄存器&汇编语句

目录
1.ARM寄存器
2. ARM汇编指令
3. 实验

1.ARM寄存器

ARM32处理器有37个寄存器,寄存器都是32位的。其中31个寄存器为通用寄存器R0~R15,6个状态寄存器。在ARM状态下,所有指令都是4字节长。
程序计数器(PC)为R15:存储下一条指令所在的内存地址
程序链接寄存器(LR)为R14:保存子程序的返回地址
堆栈指针寄存器(SP)为R13:存储堆栈区域的起始地址

2.ARM汇编指令

ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/SDR指令来完成。RISC(精简指令集计算机)构架的指令格式和长度通常是固定的(如ARM是32位的指令)、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕。

LDR:从存储器中将32位的字数据送入目的寄存器,该指令通常用于从存储器中读取32位字数据到通用寄存器中,然后对数据进行处理。

// 格式:LDR{条件} 目的寄存器,<存储器地址>
LDR RO,[R1]     //将存储器地址为R1的字数据读入到寄存器R0
LDR R0,[R1,R2]  //将存储器地址为R1+R2的字数据读入到寄存器R0
LDR R0,[R1,#8]  //将存储器地址为R1+8的字数据读入到寄存器R0
LDR R0,[R1,R2]!  //将存储器地址为R1+R2的字数据读入到寄存器R0,并将新的地址R1+R2写入到R1
LDR R0,[R1,#8]!  //将存储器地址为R1+8的字数据读入到寄存器R0,并将新的地址R1+8写入到R1
LDR R0,[R1],R2   //将存储器地址为R1的字数据读入到寄存器R0,并将新地址R1+R2写入R1
LDR R0,[R1,R2,LSL#2]!  //将存储器地址为R1+R2*4的字数据读入到寄存器R0,并将新地址R1+R2*2写入R1
LDR R0,[R1],R2,LSL#2   //将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2*4写入R1

//LS为移位寄存器,R2,LSL#3相当于R2寄存器左移三位,也就是需要乘8

STR:从源寄存器中将32位字数据传输到存储器中,该指令用于将源寄存器中的字数据写入到存储器。指令的格式与LDR相同。

PUSH:入栈,支持同时多个寄存器入栈。格式为:PUSH {R0,R1,R2}
入栈的顺序为入栈序号低的寄存器位于低地址,因此PUSH {R1,LR}与PUSH{LR,R1}入栈的效果是相同的。ARM是按照寄存器序号来入栈的,因此高序号的寄存器先入栈,存放在高地址,然后SP指针地址减4,存放低序号的地址,比如R0放在最低地址。

POP:出栈,同样支持多个寄存器出栈。 先进后出,低序号的寄存器先出栈,与入栈顺序相反。

3.实验

  void add_val(int *pa,int *pb)
{
	//*pa=*pa+*pb;
	
	volatile int tmp;	
	
	tmp=*pa;
	tmp=tmp+*pb;
	*pa=tmp;
	
}
int main( void )
{
	int a=1;
	int b=2;
	add_val(&a,&b); //LR为子程序的返回地址
	
	prvSetupHardware();
	return 0;
}

反汇编:
请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值