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汇编。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值