ARM纯汇编实验环境的搭建
本文讲解,如何通过MDK进行ARM纯汇编实验环境的搭建。
有时需要进行ARM纯汇编代码的学习,却苦于没有一个能实际操作的环境。本文使用MDK5.23完成ARM纯汇编实验平台的搭建。
1,首先新建一个ARM的工程。我以STM32F103VET6(后面简称芯片)为例子。按照正常新建工程的流程即可,但需要注意以下设置
a.设置IROM1和IRAM1的参数。为什么要设置这些数值?这是根据芯片的参数来的,这款芯片的确就是这个参数,这没什么好玄乎的,可以查查芯片手册。
b.设置工程为仿真调试模式。这样设置之后,我们不需要手上真的有芯片,只需要有电脑就能做实验。
2,向工程添加一个test_asm.s文件,我们往这里面写汇编代码。
为什么要这样写代码?这是根据芯片的特点来的。这个芯片一启动,便会从0x00000000的存储单元取数据,用来给MSP寄存器赋值;然后从0x00000004存储单元取数据,作为初次运行的代码的地址(代码在运行前,也需要预先存储在存储器的某个区域,这个区域的地址就是所谓代码的地址)。
所以这个汇编代码可以分为两块:
a.[上电后为芯片填充的数据]
这片代码的存在就是为了给0x00000000,0x00000004填充正确的值。
这个值也就是 __initial_sp, Reset_run_code;
b.[上电后一开始运行的代码]
这个地方很简单,就是在Reset_run_code的地址区域,存储了
MOV R1,#0X01
MOV R2,#0X02
ADD R1,R2
这三条简单的指令。
3,__initial_sp,Reset_run_code,写在代码中只是一些标号。但在实际运行时,它们都是确定的值。那么它们到底是多少呢?我们可以让工程运行起来看看。
点击Keil的调试模式,再打开Memory内存查看窗口。我们可以看到,在0x00000000处,数值为0x20000400,而0x00000004处,数值为0x08000009。
这说明,一开始MSP为0x20000400,而芯片的RAM地址范围为0x20000000~0x20010000。所以MSP指向RAM中的一个存储单元。而芯片的入栈过程是,MSP先减,然后把值放入MSP指向的空间,所以这个栈最多可以一次性压入0x20000400 – 0x20000000 = 0x400个字节,即1024字节,即1KB。
芯片规定,代码执行区域为0x08000000~0x08040000,所以一开始从0x08000009开始执行是合法的。但是依然有两个问题。
- 我们会从寄存器窗口发现,PC的值为0x08000008,这并不完全等于0x08000009.这是由于芯片规定,函数地址的最低位的含义并不是地址,而是指令集。总之它是有另外的含义,有兴趣的同学可以查阅一些资料;
- 为什么不是从0x08000000开始执行呢?其实,在这个芯片,地址0x00000000对应的存储单元根本和0x08000000完全一致。做成这样是为了芯片和ARM定下的规矩保持兼容。可以对照图片比对一下。那么0x08000000,0x08000004都去存储MSP,和PC初始值的数据了;所以指令只能放在0x08000008。
4,运行代码,可以发现代码的功能是完成了1+2的运算。那么这个工程就运行OK了,我们可以在这个平台做ARM的汇编实验,学习ARM汇编。