《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础

2023-06-14,,

1.1 ARM CPU寄存器

ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以要搞清楚ARM有哪些寄存器;ARM寄存器分为两类:普通寄存器和状态寄存器;普通寄存器一共有16个,分别为R0——R15,状态寄存器有2个,分别为CPSR和SPSR。

R15别名PC(program Counter),中文称程序计数器,它的值是当前正在执行的指令在内存中的位置,而当指令执行结束后,CPU硬件会自动将PC值加1,使PC指向下一条即将执行的指令,因此,当对PC寄存器赋值时,也就相当于完成了一次无条件跳转;

R14别名LR(Linked Register),中文称为链接寄存器,用于存放子程序的返回地址,与子程序调用密切相关,下面用例子说明LR如何被使用

汇编器会将例子中的第4行编译为指令:BL addsub,将11行编译为:MOV pc,lr;其中,BL addsub会完成两件事:

1)将子程序的返回地址(也就是第5行代码在内存中的位置)保存到寄存器LR中;

2)跳转到子程序addsub的第一条指令处,完成了子程序的调用;

而指令MOV pc, lr 则将保存在LR中的返回地址赋给PC,这样就完成了从子程序的返回。

如果我们调用的子程序又调用了孙子程序,该怎么办?如果我们写的是C程序,就完全不用管,因为编译器为我们提供了方案:编译器会在孙子程序的入口处增加入栈操作,将LR的值入栈,然后在孙子程序的返回处增加出栈操作,将LR的值恢复;如果编写汇编程序,一定要在子程序的入口处保存LR寄存器的值。

R 13 别名SP(stack pointer),中文名称栈指针寄存器,它是用来存放堆栈的栈顶地址的,也就是说,每次进行出栈和入栈的时候,都将根据该寄存器的值来决定访问内存的位置。32位ARM指令集中没有专门的入栈和出栈指令,所以并不是一定要用SP来作为栈指针寄存器,除了PC外,任何了普通寄存器都可以作为栈指针寄存器,只不过约定俗成都是用SP罢了。

R0——R12是普通寄存器,可以用于任何地方。

状态寄存器CPSR(Current Program Status Register)中文名称 当前程序状态寄存器,也就是说它是用于保存程序的当前状态的,如下图

1)条件代码标志位,它们是ARM指令条件执行的依据

①  N:运算结果的最高位反映在该标志位:对于有符号二进制补码,结果<0,N =1;结果>=0, N  = 0;

②  Z:指令结果为0时,Z =1,(通常表示结果“相等”),否则 Z = 0;

③  C:当进行加法运算并且最高位产生进位时C=1,否则,C =0;减法产生借位C=0,否则C=1;移位操作C表示从最高位最后移出的值,其他指令C通常不变

④  V:当进行加减法运算,并且发生有符号溢出时 V =1,否则 V =0

2)控制位,它们将控制CPU是否响应中断

I:中断禁止位,当I位为1时,IRQ中断被禁止

F:快中断禁止位,当F为1时,FIQ中断被禁止

T:反映了CPU当前状态,当T为1时,处理器运行在Thumb状态下,当T为0时,运行在ARM状态

3)模式位,包括M4,M3,M2, M1,M0,这些位决定了处理器的模式,总共有7种模式:用户、快中断、中断、管理、中止、未定义、系统

SPSR(Saved Program Status Register)中文名称:保存的程序状态寄存器,该寄存器的结构和CPSR完全一样,在异常发生时,由硬件自动将异常前的CPSR的值存放到SPSR中,以便将来在异常处理结束后,程序能恢复原来CPSR的值

1.2 流水线对PC的值的影响

从图中可以看出CPU内部主要有3部分:指令寄存器、指令译码器、指令执行单元(包括ALU和通用寄存器组)。CPU在执行一条指令的时候,主要有3个步骤:取指(将指令从内存或指令cache中取入指令寄存器),译码(指令译码器对指令寄存器的指令进行译码操作,从而辨识出该指令时要执行add还是sub,或是其他操作,从而产生各种时序控制信号),执行(指令执行单元根据译码的结果进行运算并保存结果)。CPU串行执行程序会特别慢,因为执行指令的3个步骤占用的CPU硬件完全不同,所以,在对第一条指令进行取指操作的时候,同时可以对第二条指令进行译码操作,对第三条指令进行执行操作,这种并行运行指令的方式称作流水线操作。PC总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;

深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础的相关教程结束。

《《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础.doc》

下载本文的Word格式文档,以方便收藏与打印。