实验前请点击获取配套资料
关于LAB1:在本实验 LAB1 中, 你将动手学习 Keil 开发环境的搭建, 基础汇编程序的编写, 编译和仿真调试方法, 并通过几个简单程序理解函数调用的 ATPCS 规则.
在进行本实验之前, 你应该提前掌握了一些基础的 Arm 指令和伪指令语法, 并阅读过一些简单的汇编程序.
运行吧, 第一个汇编程序
在上一小节中, 我们已经搭建好了一个基础的 Keil 开发环境, 在本小节中, 我们将在源文件中编写程序并进行仿真测试.
在 Keil 工程中打开源文件 "startup_CMSDK_CM0.s", 可以发现我们已经编辑好了 Cortex-M0 的初始化汇编, 对于这些代码大家可以先不用去关心, 在之后的章节中我们会对这些初始化代码进行展开讨论. 你需要做的只是在源代码的这个位置:
;Inset a loop algorithm there;
;****************************;
插入以下代码:
;Inset a loop algorithm there;
AREA template, CODE, READONLY
start PROC
MOVS R1, #4
Clear MOVS R0, #0
Adder ADDS R0, R0, #1
CMP R0, R1
BEQ Clear
BNE Adder
ENDP
;****************************;
这段代码实现的功能很简单: 使 R0 在 0 到 4 间循环计数.
不要指望我在这里讲解基本语法在实验过程中, 我们认为你已经掌握了 ARM 的基本语法, 包括指令语法和伪指令语法, 虽然有些易错点我还是会强调指出, 但你们更应该养成独立查阅资料的习惯.
保存编写的文件, 然后点击 Keil 工具栏中的编译按钮, 对工程进行编译.
编译工程
有三个编译按钮, 我应该选哪一个?
只编译当前文件, 这种编译单独文件的行为一般被称为 translate, translate 会生成当前文件的 .o 目标文件.
整个工程的增量编译, 只对修改过了的文件进行编译, 生成 .o 目标文件, 然后链接生成 .axf 可执行文件, 是大多数情况下推荐的选择.
对整个工程的全部文件进行编译, 效果与增量编译相同.
编译成功后, 点击工具栏中的按钮进入程序调试模式, 由于在上一节中我们设置调试模式为软件仿真, 所以接下来的程序运行现象都是软件仿真得到的.
调试界面
上图展示了调试界面的三个重要窗口:
- 1: 寄存器窗口. 展示了随着程序运行的每一步, CPU中 (当然这个CPU是软件模拟出来的) 每个寄存器的值的变化.
- 2: 反汇编窗口. 展示反汇编得到的汇编代码, 并指示当前程序运行到的位置.
3: 源代码窗口. 展示程序的源代码 (汇编, c等), 并指示当前程序运行到的位置.
不容小觑的 "反汇编"
- 程序是基于最终的机器码运行的, 在很久以前, 我们还没有这么如今这么先进的调试工具, 只能通过观察机器码的运行情况对程序进行调试, 但是机器码看着实在太难受了. 于是有了反汇编器, 它通过机器码反向生成其对应的汇编代码, 从而为我们调试程序提供了方便.
- 直到如今, 反汇编还在发挥着巨大的作用, 因为它的价值不仅体现在程序的调试, 比如当我们期望解读一个 .o 目标文件中的机器码时, 可以调用反汇编器将其转换成方便阅读的汇编代码.
- 反汇编器是个 "死脑筋", 它会把所有二进制数据都进行反汇编, 不管这些数据是否是机器码, 所以我们会看到反汇编窗口中所有未使用的 0 数据都被反汇编成了 MOV R0, R0 指令.
程序从哪里开始运行
刚进入调试界面时, 通过源代码窗口可以看到程序停留在 Reset_Handler 中, 并且每次按下复位按钮时, 程序都会被复位到这个地方, 这是因为刚开始 CPU 会接收到一个复位中断, ROM 中内嵌的中断向量表会告知 CPU 复位中断服务程序 (代码中的Reset_Handler) 的入口, 本实验中中断服务程序中只有一条指令, 其作用是使程序跳转到 start 地址执行, 而 start 地址正是我们添加的循环计数程序的入口.
复位中断服务程序
这时按下或者 F11 键启动单步调试, 随着程序的单步运行, 可以看到寄存器窗口中 R15(PC) 的值在不断变化, R0 的值在 0-4 之间循环计数. 这些现象表明, 你的第一个汇编程序已经成功运行起来啦!
END
文章来源:
推荐内容:
- 【课程实验 LAB0】FPGA简介
- 【课程实验 LAB0】为什么是 FPGA?
- 【课程实验 LAB0】设计方法
- 【课程实验 LAB0】平台介绍
- 【课程实验 LAB0】软硬件关系及软件Modelsim, Vivado, Keil的介绍
- 【课程实验 LAB1】搭建 Keil 环境
更多内容请关注微处理器系统结构与嵌入式系统设计专栏