嵌入式系统汇编指令教学探讨

2014-04-26 06:30张兰芳纪娟娟
中国校外教育(下旬) 2014年2期
关键词:程序代码断点寄存器

张兰芳 纪娟娟

具有强大功能的嵌入式系统,目前已作为电信、微电子等专业的专业课程,也是相关专业学生就业的一个良好方向。如何让学生快速掌握嵌入式系统汇编指令,能够进行简单的程序设计,为学生的就业打下良好基础,是本门课程亟待解决的问题。本文利用ADS开发环境对嵌入式汇编指令的学习进行了探讨,为《嵌入式系统》教学提供参考。

嵌入式系统ADS汇编指令具有系统内核小、专用性强、系统精简、实时性高等特性的嵌入式系统,目前已在许多领域中掀起了嵌入式系统应用的热潮。为了适应社会人才的需要以及解决本专业学生的就业工作问题,给本院电子信息科学与技术专业的学生课设了嵌入式课程。

嵌入式作为以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统,对硬件和软件的要求都相当高。学生可以通过开发板、实验箱等了解开发系统的处理器及相关设备,学生普遍反映汇编语言下的底层文件、初始化文件、控制命令都看不懂。因此,掌握汇编指令是嵌入式系统学习的难点,为了解决该问题,本文借助嵌入式开发集成环境ADS对如何快速掌握嵌入式汇编指令进行了探讨和尝试。

一、嵌入式系统开发过程

(一)ADS简介

ADS及ARM Developer Suite的缩写,是Metrowerks公司在1993年开发 ARM处理器下最主要的开发工具。ADS是全套的实时开发软件工具,编译器生成的代码密度和执行速度都较优异。

ADS对汇编、C/C++、java均有很好的支持,是目前最成熟的ARM开发工具。ADS有ARM扩展调试器(AXD,ARM Extended Debugger)、ARM 符号调试器(ARMSD,ARM Symbolic Debugger)、与老版本兼容的Windows或Unix下的ARM调试工具(ADW/ADU,Application Debugger Windows/Unix)等三种调试器。

AXD不仅拥有低版本ARM调试器的所有功能,还新添了图形用户界面,更方便的视窗管理数据显示,格式化和编辑以及全套的命令行界面。该产品还包括Real Monitor(可以在前台调试的同时断点续存并且在不中断应用的情况下读写内存跟踪调试工具)。

(二)ADS工程开发过程

ADS工程开发和前期课程学习的单片机开发环境KEIL有很多地方是类似的,但是它的位置又复杂了一些。ADS工程开发过程主要分为以下三个过程:

1.建立工程

(1)在建立工程时有7个选项,如图1所示。ARM处理器有32位ARM和16位Thumb两种工作状态,一般工作在32位状态下,因此一般选择第一项,ARM Executable Image是ARM的通用模板,选中它即可生成ARM的执行文件。

(2)对于Debug Setting的ARM linker是工程设置的重点, 在output栏中设定程序的代码段地址,以及数据使用的地址。图2中的RO Base栏中填写程序代码存放的起始地址,RW Base栏中填写程序数据存放的起始地址。在Layout栏中,如图3,在Place at beginning of image框内,需要填写项目的入口程序的目标文件名,如,整个工程项目的入口程序是44binit.s,那么应在Object/Symbol处填写其目标文件名44binit.o,在Section处填写程序入口的起始段标号。它的作用是通知编译器,整个项目的开始运行,是从该段开始的。

2.编译和链接工程

将编辑好的程序代码进行保存添加到工程中去,点击make即可实现整个工程的编译链接,若编译成功,会出现编译错误为0的报告,接下来就可对工程进行仿真调试。

3.仿真调试

点击debug,IDE环境就会启动AXD调试软件。如果没启动就要对其目标进行设定,如图4所示,在软件仿真时选择ARMULATOR。

二、如何快速掌握汇编指令

汇编语言是学生学习多门课程的难点,而对于一些I/O、底层文件等又必须要用汇编,实际中几乎每个工程都要用汇编的,因此汇编语言的掌握是嵌入式开发的关键。虽然学生在前期《微机原理》《单片机》《DSP》等课程中已学习了汇编语言,大家知道,每一种处理器它所用的汇编语言是不同的,也就是说,对于《嵌入式系统》课程又要重新学习汇编语言,嵌入式有100条指令,实际应用中又与条件码一起用,因此嵌入式汇编语言相比前几门课程难度更大。

(一)利用前期基础来学习指令

前期基础主要包括2个,一个是要把学生的英语调动起来,二是利用前期专业课程的指令。

1.利用英语单词熟记条件码

由于条件码较多,学生经常混淆,当与指令一起时更不知什么意思了。因此,在教学中经常引导学生用英语单词的方法来记条件码。如EQ和NE条件码,在教学中会问学生“相等,等于”的英语怎么译,即“equal”,那么EQ就是“equal”的缩写,即是“相等,等于”条件的判定,对应着程序状态寄存器CPSR中的“Z=1”的标志。同理,NE就是“not equal”,不相等,不等于条件的判定,对应着 “Z=1”的标志。

2.利用英语词汇熟记指令

指令与条件码有些近似,大部分都是某些词汇的缩写。把握住此规律,指令的掌握也就没那么难了。如ARM中用的比较多的存储器和寄存器之间传送数据的LDR和STR指令。LDR是“Load Register”的缩写,即加载寄存器,将某存储器单元中的内容装载到某寄存器中去。STR是“Store Register”的缩写,即存储寄存器,将某寄存器中的内容存储到某存储器单元中去。通过实际教学发现,把握此规律的学生指令明显掌握的较为牢靠。endprint

3.把前期课程学习的汇编指令搬出来

虽然嵌入式系统和前期课程学习的汇编指令不太相同,但有一部分指令是相通的。

如“MOV”传送指令,算术运算中的加、减“ADD、SUB”,逻辑运算中的与“AND”等功能基本相同,而且指令的书写是完全相同的,但是参加运算的数据、寄存器等是不一样的,它们基本对应着32位字的状态下的。

(二)从简单入手,激发学生兴趣

虽然跟学生说了多种熟记指令的方法,但是当多条指令放在一起,即使是一段很简单的程序代码,学生依然很难理解读出程序的功能。这时,就要充分利用实验来加强锻炼学生的程序读写能力。首先要让学生多抄、多读程序,然后在要求学生从简单的程序设计开始。即从抄程序中学汇编,从简单中写汇编。那么能否一开始就能读懂一些简单的程序代码,直接关系到学生对本门课程的兴趣,因此,如何引导学生快速入门很关键,而ADS的多种调试功能可以为快速入门提供便捷之道。

例1:请读出下面程序代码的功能

本程序只有8行代码,让学生第一感觉就很简单。但是本程序却包含了很多信息。首先给学生逐行分析每条指令,分给出一些提示。

(1)汇编程序的基本格式,以AREA声明某代码段的开始,以END结束;

(2)第②行ENTRY是程序入口标识,是所有汇编指令必须有的伪指令;

(3)第③行CODE声明32为指令,因此建立工程时选择第一项,如图1所示;

(4)第④行START是程序段的标号,书写时必须顶格,否则是编译不过去的,第四行和第五行的MOV指令在前期课程中已学过的;

(5)第六行中ADDS,ADD指令学生也已学过,加了S是带有条件码更新的意思,而此时和ADD功能是一样的;

(6)第⑥行B是跳转指令,即跳转到标号START处继续运行。

然后让学生建立工程和文件,并把该程序代码输入进去,进行编译调试,先让学生自己解决编译调试的问题。学生主要会出现以下问题:

(1)编译时出现错误很紧张,不知怎么办,上来就叫老师;

(2)学生运行时结果一直不出来或者结果不一样;

(3)具体功能不会表达。

可用以下方法来解决:

(1)对编译错误的同学进行引导,当出现错误时,光标会出现在源代码的对应行,到该行中去查看代码找出错误。

(2)提问结果为什么不一样,程序的运行过程是什么,关键是断点的设置,即要在本程序的第7行设置断点。本程序的运行是一个死循环。

(3)让学生们以单步运行的方式,运行程序,同时打开寄存器组,查看对应寄存器的值。

当以单步运行时,学生可看到,R0=0x0000000F,R1=0x00000008,之后R0变为0x00000017,如图5所示。

可以给学生一些提示,15+8=?这个答案对不对呢?0x是什么意思呢,是不是16进制数的表示,将0x00000017转换为10进制是不是23,而15+8=23。因此结果是对的,此程序的功能就是计算15+8=?

如果采用断点的方法,来全速运行该程序能否得到正确结果?这个断点应该设在哪里?让学生自己思考尝试。最后对于没掌握调试方法,依然不明白程序的同学逐个给予解答。

三、结论

汇编语言本身零碎的东西特别多,对于学生提出的问题必须耐心及时的引导,采用最简单的方法让学生快速掌握汇编指令以进行简单程序的设计是嵌入式系统教学的基本要求。在本课程实践教学中,通过多种方式的引导,虽然学生在本课程中花的时间较少,对于简单程序设计都感觉不难,对本门课程的兴趣也很高。有一部分同学自己买了开发板,自己在寝室进行深入学习,课堂上与大家一起探讨在学习调试中遇到的问题。

参考文献:

[1]何加铭.嵌入式32位微处理器系统设计与应用[M].北京:电子工业出版社,2006.

[2]张义磊,丁涛,安吉宇.三星S3C2410在嵌入式工业控制系统中的应用[J].长春理工大学学报,2004.

[3]魏洪兴,胡亮,曲学楼.嵌入式系统设计与实例开发实验教材Ⅱ——基于ARM9处理器与Lmux操作系统[M].北京:清华大学出版社,2005.

[4]刘全金,江建生.谈《通信原理》课程的“口诀式”教学[J].安庆师范学院学报(自然科学版),2011,17(3):103-105.endprint

3.把前期课程学习的汇编指令搬出来

虽然嵌入式系统和前期课程学习的汇编指令不太相同,但有一部分指令是相通的。

如“MOV”传送指令,算术运算中的加、减“ADD、SUB”,逻辑运算中的与“AND”等功能基本相同,而且指令的书写是完全相同的,但是参加运算的数据、寄存器等是不一样的,它们基本对应着32位字的状态下的。

(二)从简单入手,激发学生兴趣

虽然跟学生说了多种熟记指令的方法,但是当多条指令放在一起,即使是一段很简单的程序代码,学生依然很难理解读出程序的功能。这时,就要充分利用实验来加强锻炼学生的程序读写能力。首先要让学生多抄、多读程序,然后在要求学生从简单的程序设计开始。即从抄程序中学汇编,从简单中写汇编。那么能否一开始就能读懂一些简单的程序代码,直接关系到学生对本门课程的兴趣,因此,如何引导学生快速入门很关键,而ADS的多种调试功能可以为快速入门提供便捷之道。

例1:请读出下面程序代码的功能

本程序只有8行代码,让学生第一感觉就很简单。但是本程序却包含了很多信息。首先给学生逐行分析每条指令,分给出一些提示。

(1)汇编程序的基本格式,以AREA声明某代码段的开始,以END结束;

(2)第②行ENTRY是程序入口标识,是所有汇编指令必须有的伪指令;

(3)第③行CODE声明32为指令,因此建立工程时选择第一项,如图1所示;

(4)第④行START是程序段的标号,书写时必须顶格,否则是编译不过去的,第四行和第五行的MOV指令在前期课程中已学过的;

(5)第六行中ADDS,ADD指令学生也已学过,加了S是带有条件码更新的意思,而此时和ADD功能是一样的;

(6)第⑥行B是跳转指令,即跳转到标号START处继续运行。

然后让学生建立工程和文件,并把该程序代码输入进去,进行编译调试,先让学生自己解决编译调试的问题。学生主要会出现以下问题:

(1)编译时出现错误很紧张,不知怎么办,上来就叫老师;

(2)学生运行时结果一直不出来或者结果不一样;

(3)具体功能不会表达。

可用以下方法来解决:

(1)对编译错误的同学进行引导,当出现错误时,光标会出现在源代码的对应行,到该行中去查看代码找出错误。

(2)提问结果为什么不一样,程序的运行过程是什么,关键是断点的设置,即要在本程序的第7行设置断点。本程序的运行是一个死循环。

(3)让学生们以单步运行的方式,运行程序,同时打开寄存器组,查看对应寄存器的值。

当以单步运行时,学生可看到,R0=0x0000000F,R1=0x00000008,之后R0变为0x00000017,如图5所示。

可以给学生一些提示,15+8=?这个答案对不对呢?0x是什么意思呢,是不是16进制数的表示,将0x00000017转换为10进制是不是23,而15+8=23。因此结果是对的,此程序的功能就是计算15+8=?

如果采用断点的方法,来全速运行该程序能否得到正确结果?这个断点应该设在哪里?让学生自己思考尝试。最后对于没掌握调试方法,依然不明白程序的同学逐个给予解答。

三、结论

汇编语言本身零碎的东西特别多,对于学生提出的问题必须耐心及时的引导,采用最简单的方法让学生快速掌握汇编指令以进行简单程序的设计是嵌入式系统教学的基本要求。在本课程实践教学中,通过多种方式的引导,虽然学生在本课程中花的时间较少,对于简单程序设计都感觉不难,对本门课程的兴趣也很高。有一部分同学自己买了开发板,自己在寝室进行深入学习,课堂上与大家一起探讨在学习调试中遇到的问题。

参考文献:

[1]何加铭.嵌入式32位微处理器系统设计与应用[M].北京:电子工业出版社,2006.

[2]张义磊,丁涛,安吉宇.三星S3C2410在嵌入式工业控制系统中的应用[J].长春理工大学学报,2004.

[3]魏洪兴,胡亮,曲学楼.嵌入式系统设计与实例开发实验教材Ⅱ——基于ARM9处理器与Lmux操作系统[M].北京:清华大学出版社,2005.

[4]刘全金,江建生.谈《通信原理》课程的“口诀式”教学[J].安庆师范学院学报(自然科学版),2011,17(3):103-105.endprint

3.把前期课程学习的汇编指令搬出来

虽然嵌入式系统和前期课程学习的汇编指令不太相同,但有一部分指令是相通的。

如“MOV”传送指令,算术运算中的加、减“ADD、SUB”,逻辑运算中的与“AND”等功能基本相同,而且指令的书写是完全相同的,但是参加运算的数据、寄存器等是不一样的,它们基本对应着32位字的状态下的。

(二)从简单入手,激发学生兴趣

虽然跟学生说了多种熟记指令的方法,但是当多条指令放在一起,即使是一段很简单的程序代码,学生依然很难理解读出程序的功能。这时,就要充分利用实验来加强锻炼学生的程序读写能力。首先要让学生多抄、多读程序,然后在要求学生从简单的程序设计开始。即从抄程序中学汇编,从简单中写汇编。那么能否一开始就能读懂一些简单的程序代码,直接关系到学生对本门课程的兴趣,因此,如何引导学生快速入门很关键,而ADS的多种调试功能可以为快速入门提供便捷之道。

例1:请读出下面程序代码的功能

本程序只有8行代码,让学生第一感觉就很简单。但是本程序却包含了很多信息。首先给学生逐行分析每条指令,分给出一些提示。

(1)汇编程序的基本格式,以AREA声明某代码段的开始,以END结束;

(2)第②行ENTRY是程序入口标识,是所有汇编指令必须有的伪指令;

(3)第③行CODE声明32为指令,因此建立工程时选择第一项,如图1所示;

(4)第④行START是程序段的标号,书写时必须顶格,否则是编译不过去的,第四行和第五行的MOV指令在前期课程中已学过的;

(5)第六行中ADDS,ADD指令学生也已学过,加了S是带有条件码更新的意思,而此时和ADD功能是一样的;

(6)第⑥行B是跳转指令,即跳转到标号START处继续运行。

然后让学生建立工程和文件,并把该程序代码输入进去,进行编译调试,先让学生自己解决编译调试的问题。学生主要会出现以下问题:

(1)编译时出现错误很紧张,不知怎么办,上来就叫老师;

(2)学生运行时结果一直不出来或者结果不一样;

(3)具体功能不会表达。

可用以下方法来解决:

(1)对编译错误的同学进行引导,当出现错误时,光标会出现在源代码的对应行,到该行中去查看代码找出错误。

(2)提问结果为什么不一样,程序的运行过程是什么,关键是断点的设置,即要在本程序的第7行设置断点。本程序的运行是一个死循环。

(3)让学生们以单步运行的方式,运行程序,同时打开寄存器组,查看对应寄存器的值。

当以单步运行时,学生可看到,R0=0x0000000F,R1=0x00000008,之后R0变为0x00000017,如图5所示。

可以给学生一些提示,15+8=?这个答案对不对呢?0x是什么意思呢,是不是16进制数的表示,将0x00000017转换为10进制是不是23,而15+8=23。因此结果是对的,此程序的功能就是计算15+8=?

如果采用断点的方法,来全速运行该程序能否得到正确结果?这个断点应该设在哪里?让学生自己思考尝试。最后对于没掌握调试方法,依然不明白程序的同学逐个给予解答。

三、结论

汇编语言本身零碎的东西特别多,对于学生提出的问题必须耐心及时的引导,采用最简单的方法让学生快速掌握汇编指令以进行简单程序的设计是嵌入式系统教学的基本要求。在本课程实践教学中,通过多种方式的引导,虽然学生在本课程中花的时间较少,对于简单程序设计都感觉不难,对本门课程的兴趣也很高。有一部分同学自己买了开发板,自己在寝室进行深入学习,课堂上与大家一起探讨在学习调试中遇到的问题。

参考文献:

[1]何加铭.嵌入式32位微处理器系统设计与应用[M].北京:电子工业出版社,2006.

[2]张义磊,丁涛,安吉宇.三星S3C2410在嵌入式工业控制系统中的应用[J].长春理工大学学报,2004.

[3]魏洪兴,胡亮,曲学楼.嵌入式系统设计与实例开发实验教材Ⅱ——基于ARM9处理器与Lmux操作系统[M].北京:清华大学出版社,2005.

[4]刘全金,江建生.谈《通信原理》课程的“口诀式”教学[J].安庆师范学院学报(自然科学版),2011,17(3):103-105.endprint

猜你喜欢
程序代码断点寄存器
新工科背景下Matlab对高等数学课堂教学辅助作用的探讨
Lite寄存器模型的设计与实现
一类无限可能问题的解法
计算机网络信息安全未来发展趋势
分簇结构向量寄存器分配策略研究*
主导电回路发生断点故障判断方法探讨
高速数模转换器AD9779/AD9788的应用
TKScope仿真调试Cortex-M3内核的高级手段
基于属性重要性的贪心算法的改进算法
一种可重构线性反馈移位寄存器设计