目录
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;
}
反汇编: