极术小能手 · 2022年03月12日

【课程实验 LAB1】“施法”让CPU动起来:运行吧,第一个汇编程序

实验前请点击获取配套资料

关于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 工具栏中的编译按钮, 对工程进行编译.

image.png
编译工程

有三个编译按钮, 我应该选哪一个?

  • image.png 只编译当前文件, 这种编译单独文件的行为一般被称为 translate, translate 会生成当前文件的 .o 目标文件.
  • image.png 整个工程的增量编译, 只对修改过了的文件进行编译, 生成 .o 目标文件, 然后链接生成 .axf 可执行文件, 是大多数情况下推荐的选择.
  • image.png 对整个工程的全部文件进行编译, 效果与增量编译相同.

编译成功后, 点击工具栏中的image.png按钮进入程序调试模式, 由于在上一节中我们设置调试模式为软件仿真, 所以接下来的程序运行现象都是软件仿真得到的.

image.png
调试界面
上图展示了调试界面的三个重要窗口:

  • 1: 寄存器窗口. 展示了随着程序运行的每一步, CPU中 (当然这个CPU是软件模拟出来的) 每个寄存器的值的变化.
  • 2: 反汇编窗口. 展示反汇编得到的汇编代码, 并指示当前程序运行到的位置.
  • 3: 源代码窗口. 展示程序的源代码 (汇编, c等), 并指示当前程序运行到的位置.

    不容小觑的 "反汇编"

  • 程序是基于最终的机器码运行的, 在很久以前, 我们还没有这么如今这么先进的调试工具, 只能通过观察机器码的运行情况对程序进行调试, 但是机器码看着实在太难受了. 于是有了反汇编器, 它通过机器码反向生成其对应的汇编代码, 从而为我们调试程序提供了方便.
  • 直到如今, 反汇编还在发挥着巨大的作用, 因为它的价值不仅体现在程序的调试, 比如当我们期望解读一个 .o 目标文件中的机器码时, 可以调用反汇编器将其转换成方便阅读的汇编代码.
  • 反汇编器是个 "死脑筋", 它会把所有二进制数据都进行反汇编, 不管这些数据是否是机器码, 所以我们会看到反汇编窗口中所有未使用的 0 数据都被反汇编成了 MOV R0, R0 指令.

程序从哪里开始运行
刚进入调试界面时, 通过源代码窗口可以看到程序停留在 Reset_Handler 中, 并且每次按下复位按钮image.png时, 程序都会被复位到这个地方, 这是因为刚开始 CPU 会接收到一个复位中断, ROM 中内嵌的中断向量表会告知 CPU 复位中断服务程序 (代码中的Reset_Handler) 的入口, 本实验中中断服务程序中只有一条指令, 其作用是使程序跳转到 start 地址执行, 而 start 地址正是我们添加的循环计数程序的入口.

image.png
复位中断服务程序
这时按下image.png或者 F11 键启动单步调试, 随着程序的单步运行, 可以看到寄存器窗口中 R15(PC) 的值在不断变化, R0 的值在 0-4 之间循环计数. 这些现象表明, 你的第一个汇编程序已经成功运行起来啦!

END

文章来源:

推荐内容

更多内容请关注微处理器系统结构与嵌入式系统设计专栏
推荐阅读
关注数
117
内容数
20
电子科技大学示范性微电子学院开设的「微处理器系统结构与嵌入式系统设计」课程配套实验,原链接:[链接]
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息