笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~
前言
在上一篇文章中《程序是如何在 CPU 中运行的(一)》笔者讲述了程序中一条一条指令以及一条一条数据是如何在 CPU 中运行的,在本文笔者将以 ARM Cortex M3 的内核为背景分析指令是如何有序的执行。
寄存器组介绍
为了更好地介绍指令是如何在 ARM Cortex M3 内核中运行的,在这里先介绍一下 ARM Cortex M3 的寄存器组,引用 ARM Cortex M3 权威指南的一张图,图片如下:
![df46eb7f05b027990a09a79f05036bb3.png](https://img-blog.csdnimg.cn/img_convert/df46eb7f05b027990a09a79f05036bb3.png)
如上图所示,寄存器组主要包含四种类型的寄存器,分别是:
通用寄存器:用于数据操作
堆栈指针:堆栈指针有两个,但是在任一时刻只能使用其中的一个。
主堆栈指针:复位后默认使用的堆栈指针,用于操作系统内核及异常处理程序
进程堆栈指针:由用户的应用程序代码使用。
连接寄存器:当呼叫一个子程序时,由 R14 存储返回地址。
程序计数器:用于存储下一条即将运行的指令的地址。
寄存器组介绍完之后,我们来看具体的实例。
顺序执行
首先看一个顺序执行的例子,代码如下,C 语言下面对应的是汇编代码,汇编代码冒号前的是当前指令对应的地址。
int main(void){
int a = 123;
0x0800021E : MOVS r1,#0x7B
int b = 456;
0x08000220 : MOV r2,#0x1CB
int result = a + b;
0x08000224 : ADDS r3,r1,r2
return 0;
0x08000226 : MOVS r0,#0x00
}