第四章编程语言及程序设计_第1页
第四章编程语言及程序设计_第2页
第四章编程语言及程序设计_第3页
第四章编程语言及程序设计_第4页
第四章编程语言及程序设计_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 编程语言及程序设计4.1 编程语言概述一台计算机只有硬件(称为裸机)是不能工作的,必须配备各种功能的软件,才能发挥其运算、测控等的功能,而软件是人使用编程语言编写出来的,是人赋予机器智能的载体。编程语言是人与计算机之间交流的语言,其种类非常多,总的来说可以分为机器语言、汇编语言、高级语言三大类。4.1.1机器语言计算机所使用的是由"0"和"1"组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由"0"和"1"组成的指令序列

2、交由计算机执行,这种计算机能够认识的语言,就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。对于机器语言,一条机器语言成为一条指令。指令是不可分割的最小功能单元。而且,由于每种计算机的指令系统往往各不相同,所以,在一类计算机上执行的程序,要想在另一类计算机上执行,必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言,是第一代计算机语言。4.1.2汇编语言为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用"ADD"代

3、表加法,"MOV"代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。汇编语言同样十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精炼而质量高,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时监控程序都需要汇编语言。4.1.3高级语言由于汇编语言依赖于硬

4、件体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。高级语言是较接近自然语言和数学公式的,其语法和结构更类似普通英文,且由于远离对硬件的直接操作,使得一般人经过学习之后都可以编程。高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。但高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。所以汇编语言适合编写一些对速度和代码长度要求高的程序和直接控制硬件的程序。高级语言程序“看不见”机器的硬件结构,不能用于编写直接访问机器硬件资源的系统软件或设备控制软件。为此,一些

5、高级语言提供了与汇编语言之间的调用接口。用汇编语言编写的程序,可作为高级语言的一个外部过程或函数,利用堆栈来传递参数或参数的地址。CPU 只能直接理解机器语言,不能直接理解汇编语言和高级语言,必须把汇编语言或高级语言编写的程序翻译为机器语言。把汇编语言或高级语言翻译成机器语言的过程称为编译(Compile), 其过程如图4-1所示。图4-1 编译过程4.2 CodeWarrior软件使用学习HCS08单片机的应用开发,掌握其常用的开发工具十分重要。本章重点对Freescale单片机的CodeWarrior系列集成开发环境进行介绍。 CodeWarrior 系列集成开发环境 IDE(Integr

6、ated Development Environment)是Metrowerks公司为开发嵌入式微处理器而设计的一套强大易用的开发工具,使用它可以有效地提高软件开发效率。Freescale公司的官方网站()免费提供下载多种版本,包括评估板、特别版、标准版和专业版等。 本章以CodeWarrior for Microcontrollers V6.2版本为例来讲解CodeWarrior的安装和使用方法。读者通过学习,将学会在CodeWarrior IDE中用汇编语言和C语言来实现对HCS08系列单片机的编程。 4.2.1 CodeWarrior for Microcontrollers V6.2的

7、安装1. 系统需求 基于Microsoft Windows操作系统平台的CodeWarrior IDE至少需要如下的计算机配置: l 200MHz Pentium II或AMD-K6处理器 l 128MB的RAMl 最小模式安装需要大约300MB的硬盘空间l 完全安装需要大约700MB的硬盘空间l 需要Microsoft Windows 98/ NT/ 2000/ XP等操作系统l 外设需有光盘驱动器CD-ROM(不是必需的)、串口、并口或USB接口2. CodeWarrior的安装与卸载 1) CodeWarrior的安装 CodeWarrior IDE 的安装需要有完整的安装文件,可以通过

8、光盘或硬盘来安装。下面以硬盘安装为例,简单地把安装过程介绍一下: 第一步,双击可执行文件“CW_V5_1.exe”运行安装程序。 第二步,单击【Next】按钮,选择读取安装程序后要放置的目录,单击【Next】按钮。 第三步,待读取自动完成后,单击【Next】按钮。 第四步,选择接受协议,连续两次单击【Next】按钮后,选择安装目录。 第五步,在两次单击【Next】按钮以后,单击【Install】按钮,CodeWarrior的安装就开始了。 第六步,自动安装完成,取消复选框,单击【Finish】按钮,则安装完成(也可以选中复选框来选择自己想要的更新)。 第七步,打开集成开发环境。依次选择计算机中

9、的“开始”“程序” “Freescale CodeWarrior”“CW for Microcontrollers V6.2” “CodeWarrior IDE”菜单。 2) CodeWarrior的卸载如果您不再需要 CodeWarrior IDE,可以把它从您的计算机上卸载。通过操作系统自带的控制面板中的“添加/删除程序”进入卸载程序,单击【Remove】按钮,然后再单击【Next】按钮就可以自动完成卸载过程。单击【Modify】按钮可以添加或者删除功能组件,选择【Repair】可以在CodeWarrior软件崩溃后来修复它。 4.2.2 CodeWarrior for Microcont

10、rollers V6.2的功能使用本节主要介绍CodeWarrior IDE的基本功能和使用方法。首先介绍如何进行功能设置。 1. 集成环境与功能设置 1) 工具栏 如图4-2所示,工具栏的每个图标都对应一个独立的功能,所有的功能都可以在对应的菜单栏里找到。 图4-2 CodeWarrior IDE的工具栏2) 菜单栏 如图4-3所示,CodeWarrior的菜单栏里基本包含了所有功能,在工具栏里有的,都能在菜单栏里面找到相应的命令。 图4-3 CodeWarrior IDE的菜单栏3) CodeWarrior IDE的设置 选择【Edit】【Preferences.】命令来设置CodeWar

11、rior IDE的有关参数,出现如图4-4所示的CodeWarrior IDE的参数设置对话框,用户可按照自己的要求来定制开发环境。 图4-4 CodeWarrior IDE的参数设置对话框图 4-4 里包括可以控制 CodeWarrior 的代码编辑器、调试工具和其他功能的界面和行为选项。4) 工程窗口介绍由 CodeWarrior 创建的工程包含多个文件,其中工程文件扩展名为mcp,它包含了所有文件的指针和工程的配置信息。这些配置信息包括编译和链接的设置、源文件、库文件及他们最终产生可执行程序的依赖关系。可以说这个 mcp 文件是生成可执行文件的核心。我们通过打开 mcp 文件就可以打开一

12、个工程,就可以管理工程内的所有文件和将要生成的目标文件。每个工程可以有很多编译目标 (Build Target),编译目标可以告诉 IDE 来产生怎样的输出文件。如图4-5所示,这里的编译目标就是P&E Multilink/Cyclone BDM (使用BDM下载程序到单片机);当然可以通过该下拉框,根据自己的需求来选择其他目标。如果需要通过模拟器(Simulator)进行全片仿真的话,就要选择相对应的编译目标。图4-5 CodeWarrior IDE的工程窗口5) CodeWarrior IDE 代码编辑器的使用CodeWarrior IDE 的代码编辑器可以完成两个任务:一是建立和

13、编辑程序源文件,这也是代码编辑器最主要的功能;二是建立和编辑文本文件。其实程序源文件的格式也是文本格式的,表面上看这两者似乎没有什么不同,但是作为两个独立的功能,他们还是有本质的差异的。程序源文件在编译时,是要参与编译并且生成目标文件的,而一般的文本文件,例如说明文件 readme.txt,是不参与编译的。在文件里也不包含任何程序代码和数据,我们可以轻松地利用代码编辑器来管理这些文本文件。我们可以在工程窗口里任意单击一个程序源文件来打开代码编辑器窗口,此外我们打开主程序文件 DEMOJM_Quick_Start.c,如图4-6所示。图4-6 代码编辑器代码编辑器的使用和常用的文本编辑器相似,这

14、里就不再介绍了。 6) 编译目标的设置 在编译和链接前,可以针对编译目标进行设置。启动编译目标设置对话框,如图 4-7所示,其中有很多种方法供用户选择,用户可以根据自己的需要灵活选择设置。 图4-7 编译目标的设置4.2.3 CodeWarrior开发HCS08单片机的过程 为了使用CodeWarrior IDE 来进行HC(S)08 系列单片机程序的开发,我们必须通过创建很多且不同类型的文件来构成一个工程。这些不同类型的文件信息及其相互的依赖关系都被存储到一个扩展名为mcp的工程文件中,所以,打开这个mcp文件就相当于打开了一个完整的工程。下面逐步讲解如何建立和打开工程;怎样快捷高效地编写程

15、序源代码;工程建立后,如何编译和链接;最后详细介绍调试方法。1. 建立和打开工程 1)建立一个新工程下面结合一个实例来介绍如何新建一个工程。建立的工程取名为 prog_test。 启动CodeWarrior IDE,即可打开CodeWarrior V6集成开发环境主界面,如图4-8所示。中间有一个Startup 对话篇,第1个是创建新工程,第2个是装载实例工程,第3个是装载最近几次用过的工程,第4个是运行入门教程,第5个是开始使用CodeWarrior。单击【Star Using CodeWarrior 】按钮,进入CodeWarrior 集成开发环境。 在CodeWarrior V6 集成开

16、发环境的菜单栏 图4-8 CodeWarrior V6集成开发环境主界面中选择【File】-【New】命令或者按【Ctrl】+【Shift】 +【N】组合键,启动新建对话框,如图4-9所示。或者在上一步中选择【Create New Project】按钮,弹出如图4-9所示的新建工程对话框。可以选择所用芯片的系列和型号,以及仿真调试模式。例如选择 HCS08-HCS08JM Family -MC9S08JM60,出现如图4-10所示的对话框。图4-9 新建工程对话框图4-10 选择单片机的型号和仿真模式如图4-10所示,仿真模式有4种。 l Full Chip Simulation模式:允许单片

17、机及其外围设备进行在线调试,或者利用软件进行模拟。 l P&E Multilink/Cyclone Pro模式:当HCS08与外围设备硬件接口通过P&E提供时,要采用这种模式。l SofTec HCS08模式:当HCS08连接到基于SofTec微系统工具的任何一种USB时,要采用这种模式。l HCS08 Open Source BDM模式:当连接到基于Freescale的HCS08开源BDM电缆的USB时,要采用这种模式。 下一步,紧接着会弹出如图4-11所示的对话框,在左侧选择工程中使用的语言,该开发环境支持的语言有 C、C+和可重定位汇编,可以选择其中一个,也可以复选,这里

18、选择 C。在“Project name”文本框中输入工程名,在“Location”文本框中选择工程存放路径。 图4-11 设置工程名称及路径 进入下一步,紧接着会弹出如图4-12所示的对话框,这里我们可以添加已有的文件到工程下。这里没有文件,直接单击【下一步】按钮。图4-12 添加已有文件到工程 紧接着会弹出如图4-13所示的对话框,可选择“Device Initialization”(器件初始化)和“Processor Expert”(处理器专家)快速应用开发工具自动生成初始化代码。图4-13 处理器专家设置 进入下一步,紧接着会弹出如图4-14所示的对话框,这里有很多选项,如启动代码的类型

19、、存储器模式和所支持的浮点数格式等。图4-14 其他选项 下一步紧接着会弹出如图4-15所示的对话框,选择是否创建一个PC-lint(TM)工程。 图4-15 创建PC-Lint(TM)工程 单击【完成】按钮,工程创建完毕,若不需要一些附加功能,也可以在以上任一步骤中单击【完成】按钮结束工程创建。工程创建完成的窗口如图4-16所示。图4-16 工程创建完成的窗口2)打开一个工程以刚建立的 project 工程为例。打开该文件夹,然后双击 project.mcp 文件,这时CodeWarrior会自动打开,并且连project工程也一起打开了。这里可能会遇到一个问题,就是我们在安装 CodeWa

20、rrior 时,Windows也许没有自动把mcp文件与CodeWarrior关联,这样就不能通过双击某个mcp文件来打开一个工程。解决办法非常简单,用鼠标右键单击mcp文件,然后选择【打开方式.】命令,在弹出的对话框中选择“Integrated Development Environment”,或者通过浏览来找到安装后的CodeWarrior IDE程序,一般在CodeWarrior安装目录下的“binIDE.exe”,在单击【确定】按钮前选中“始终使用选择的程序打开这种文件”选项。当然也可以直接通过开始菜单中的快捷方式或者“binIDE.exe”打开CodeWarrior,然后再打开工程。

21、2. 编译和链接 下面仍以工程project为例。在CodeWarrior IDE中,我们可以直接用鼠标左键单击工程窗口中的【Make】按钮来完成编译和链接。这时,我们可以看到,在打了修改标记的文件前面会逐一出现动态的小齿轮,这表示正在编译这个文件。编译好后,会出现“Errors & Warnings”窗口,如图4-17所示。在这个窗口里显示的是错误和警告信息,其中,错误信息是必须消除的。在这些信息中包含的基本都是语法错误,而警告信息一般也需要排除,除非你能确认这个警告对于程序的结果没有影响。 图4-17 “Errors&Warnings”窗口界面3. 软件仿真调试方法 编译工

22、程,排除语法错误后,就开始调试程序了。本节将介绍调试程序的一般方法和步骤。调试程序和编译、链接不同,它依赖于程序员的经验,经验丰富的程序员就可以在较短的时间内调试程序达到自己的要求。所以,一定要多练习和实践,才能提高自己的调试效率。 首先要在工程的目标窗口中选择“Full Chip Simulation”,如图 4-18所示。然后通过单击“Debug”快捷按钮,弹出如图4-19所示的仿真和实时调试窗口。 图4-18 编译目标的选择图4-19 仿真和实时调试窗口通过仿真和实时调试窗口可随时检查各寄存器、全局变量、局部变量和 RAM 中的内容。在图4-19中包括Source、Procedure、D

23、ata1、Data2、Assembly、Register、Memory和Command 8个子窗口。 Source窗口即用户源程序窗口,单击鼠标右键弹出快捷菜单,在其中有几个重要的命令,如图4-20所示,功能分别如下: l Set Breakpoint 设置断点 l Run To Cursor 运行到光标处 l Show Breakpoints 显示断点 l Show Location 显示地址 l Open Source File 打开源文件 l Go To Line 跳转行 无论是脱机仿真还是在线调试,均可利用快捷菜单任意设置一个或多个断点,方便地检查程序运行到断点处时各寄存器及状态变量的

24、内容。 在图4-19中,Data1数据窗口用于显示用户在源程序中定义的全局变量,还有牵涉到的相关寄存器设置。Data2 窗口显示的是源程序中的子函数变量(局部变量),单步运行时即可在这两个窗口中查看用户自定义变量的值是否正确。 Command 窗口显示程序运行过程中所走过的命令。 图4-20 Source窗口Assembly 反汇编窗口中,蓝条指示的位置就是程序下一条要执行的指令。Register窗口如图4-21所示。 在图 4-21 中,左上角显示 CPU 类型是 HCS08,紧接着“CPU Cycles:”代表 CPU运行的指令周期,执行程序时,可以看到“CPU Cycles”后面的数值不

25、断变化,从而可以精确计算CPU的执行时间。 图4-21 Register窗口因此,通过CodeWarrior V6可以很方便地实现程序下载、单步调试等,为系统程序的开发提供了非常好的仿真平台。4. BDM调试方法 当程序在“Full Chip Simulation”下调试通过后,就可以把程序下载到单片机内部进行在线调试了。 在线调试所需的仿真器有“P&E Multilink/Cyclone Pro” 和“HCS08 Open Source BDM”。前者目标板(实验电路板)电源由BDM提供;后者目标板可以由外部单独供电,也可以由BDM供电。在线调试的步骤如下: 第一步,建立工程。 第二

26、步,编写程序。用户代码的位置和如何定位程序见前文介绍。 第三步,调试。 程序修改或编写完成后,选用“P&E Multilink/Cyclone Pro”或“HCS08 Open Source BDM”模式。在此我们选用后者,单击【Make】按钮进行编译链接。若编译链接无错误,则选择【Project】【Debug】命令或工具栏内的【Debug】按钮,出现了如图 4-22 所示的对话框,进行程序下载连接。 图4-22 程序下载连接在图4-22中单击【Connect】按钮,弹出如图4-23所示的对话框,最后单击【Yes】按钮,程序就下载到目标板了,并进入到如图4-24所示的调试窗口。图4-2

27、3 FLASH擦除对话框图图4-24调试窗口图4-16 “Errors&Warnings”窗口界面4.3 S08汇编语言程序基础HCS08 CPU与HC08 CPU的目标代码和源代码完全兼容,并且由于其增加了几种寻址方式,提高了 C 语言的编译效率。本章对 HCS08 单片机的指令系统作一个具体介绍。首先介绍HCS08寻址方式,然后给出HCS08的指令集。4.3.1 S08寻址方式寻址方式定义为CPU访问操作数和数据的方法。在 HCS08中,所有的存储器、状态和控制寄存器、I/O端口共享一个64Kbyte的线性地址空间,因此一个16位的二进制地址能够唯一确定任何存储器地址,这种排列意味

28、着能够访问RAM中变量的指令同样能够用来访问I/O和控制寄存器或非易失程序空间。 一些指令用到不止一种寻址方式,如 MOVE 指令用一种寻址方式确定源操作数,用另一种寻址方式确定目的操作数。对于BRCLR、BRSET、CBEQ 和 DBNZ这样的指令用一种寻址方式确定测试操作数的位置,然后当测试条件为真时,用另一种寻址方式确定分支目的地址。 HCS08的寻址方式主要有以下几种:1. 固定寻址方式(INH) 固定寻址为单字节指令。在这种寻址模式中,完成指令的操作数位于CPU寄存器中,所以CPU不需要为获得操作数访问存储器。 例如:INCA: 累加器A自加指令。 2. 立即寻址方式(IMM) 立即

29、寻址方式在指令中直接给出操作数。这种指令是双字节指令,第1个字节是操作码,第2个字节是参与操作的立即数。立即寻址指令通常是对立即数和累加器中的数据或变址寄存器中的数据进行操作。下述指令属于IMM寻址方式: LDA #$DE;把十六进制数立即数$DE放入累加器A中。 CPX #$3A;比较 $3A与变址寄存器X中的数据。3. 直接寻址方式(DIR) 直接寻址指令,字长两字节。指令的第1个字节是操作码,第2个字节是操作地址的低8位。在直接寻址方式中,CPU将$00作为操作数高位字节,与指令的低字节地址直接连接,以得到期望操作数的位置的16位地址。其寻址范围为$0000 $00FF。 例如: BSE

30、T 3, $80;将存储单元$0080中的第3位置为14. 扩展寻址方式(EXT) 扩展寻址指令是3字节,可以访问存储器中的任何地址。指令的第1个字节是操第2个字节是操作数的高字节地址,第3个字节是操作数的低字节地址。扩展寻址方寻址范围为$0000 $FFFF。下述指令属于扩展寻址方式: LDA $0100;将存储单元$0100中的数值取至累加器A。 LDHX $0100;将存储单元$0100中的数值取至H,将$0101的数值取至X。与HC08指令系统相比,HCS08的扩展方式中还增加了一条CALL指令,用于分口所映射的存储器地址空间的调用,可以在64KB寻址空间或其他扩展页内寻址。5. 相对

31、寻址方式(REL) 相对寻址模式用于确定分支指令的目的地址。当分支条件满足时,CPU将指令中的偏移量和程序计数器 PC 中的数据相加,得出转移的目标地址。如果分支条件不满足,则CPU不执行下一条指令。分支指令中的8 位偏移量是有符号的,因此分支指令的偏移量为-127+128。偏移量用二进制补码表示。相对寻址方式的指令有: BCC aaa; 如果进位标志位为零,则转移到标号aaa处执行。 BRA bbb; 无条件转移到标号bbb处。6. 变址寻址方式(IX) 1)无偏移量变址寻址方式(IX) 无偏移量变址寻址是单字节指令。变址寄存器 HX 中的 16 位数据是操作数的地址,所以其寻址范围为$00

32、00$FFFF。 例如: LDA ,X;从变址寄存器HX指向的存储单元中读取数据到累加器A中。 2)无偏移量、后递增的变址寻址方式(IX+) 这种寻址方式与无偏移量变址寻址方式的区别在于:在本寻址方式中,操作数取出之后,多了(HX = HX + $0001)的操作。无偏移量、后递增的变址寻址方式仅用于MOV和CBEQ指令。 3)8位偏移量变址寻址方式(IX1) 8位偏移量变址寻址指令是双字节指令。CPU 把变址寄存器 HX 中的 16 位数据与指令第2个字节的无符号8位偏移量相加,和即为操作数的地址。 例如: STA $80,X;将A中的数据存储至地址为(HX)+ $80 的存储单元中。4)8

33、位偏移量、后递增的变址寻址方式(IX1+) 这种寻址方式与8位偏移量变址寻址方式的区别在于:在本寻址方式中,在操作数取出之后,多了(HX = HX + $0001)的操作。8位偏移量、后递增的变址寻址方式仅用于CBEQ指令。 例如: CBEQ addr8,X+,rel;若A=(HX)+ addr8),则转移,(HX)+1HX。 5)16位偏移量变址寻址方式(IX2) 16 位偏移量变址寻址指令是 3 字节指令,可以访问存储器中的任何地址。CPU 把变址寄存器HX中的 16位数据和指令第2、3个字节的无符号16位偏移量相加,和即为操作数的地址。指令的第2个字节是高位地址,第3个字节是低位地址。例

34、如: STA $200,X;将A中的数据写入地址为(HX)+$ 200 的存储单元中。7. 堆栈寻址方式(SP) 1)8位偏移量堆栈寻址方式(SP1) 8 位偏移量堆栈寻址方式将指令给出的 8 位直接地址与堆栈指针 SP 相加形成操作数的地址。 例如: LDA 2,SP;(SP)+2A 2)16位偏移量堆栈寻址方式(SP2) 16 位偏移量堆栈寻址方式将指令给出的 16 位直接地址与堆栈指针 SP 相加形成操作数的地址。 例如: LDA $130,SP;(SP)+$130A4.3.2 S08指令系统CPU 所能执行的各种指令的集合称为该微处理器的指令系统。HCS08 CPU 共有 121个保留

35、字,加上寻址方式形成了282条具体指令。按指令功能将这些指令分为数据传送、算术运算、逻辑运算、位操作、移位、程序转移和控制类指令几类。1. 数据传送指令 数据传送指令实现CPU寄存器、I/O寄存器、RAM和 FLASH之间的数据传送,一般情况下指令执行结果只影响CCR的“N”和“Z”标志位。若所传送的数据为0,置 Z=1,否则置Z=0;数据最高位为1,置N=1,否则置N=0。 1) 取数指令 取数指令的功能是取出存储单元的数据存入累加器A、X、HX中,如表4-1所示。表4-1 取数指令功能描述2) 存储指令 存储命令的功能是将寄存器A、X、HX中的数据存储到存储单元中,如表4-2所示。 表4-

36、2 存储指令的功能描述3) 堆栈操作指令 堆栈操作指令的功能是使 A、H、X 中的数据进栈、出栈,不改变标志位。具体描述如表4-3所示。 表4-3 堆栈操作指令的功能描述4) 寄存器间数据传送指令 寄存器间数据传送指令的功能是在寄存器A、H、HX、SP、CCR之间进行数据传送。具体描述如表4-4所示。 表4-4 寄存器间数据传送指令描述5) 存储单元间数据传送指令 这组指令的功能是在存储单元间进行数据传送。具体描述如表4-5所示。 表4-5 存储单元间数据传送指令功能描述2. 算术运算指令 算术运算类指令有加/减、加1/减1、乘/除、取反/求补、比较、测试、清零等。 1) 加/减指令 加/减指

37、令的第一操作数均在A中,第二操作数在存储单元中,运算结果均放在A中。运算结果影响V、H、N、Z、C,运算结果满足下列条件时置“1”相应的标志位,否则清零。 V 若溢出,则置位,否则清零。 H 加法,若相加结果低3位向高4位有进位,则置位,否则清零。 N 若结果的最高位为1,相当于有符号运算中的结果为负,则置位,否则清零。 Z 若结果为0时,则置位,否则清零。 C 若有最高位的进位(减法为借位),则置位,否则清零。 加法有不带进位加法(ADD)和带进位加法(ADC)两种,减法有不带借位减法(SUB)和带借位减法(SBC)两种。具体描述分别如表4-6 和表4-7 所示。 表4-6 加法指令描述表4

38、-7 减法指令描述2) 加1/减1指令 加 1指令中的INCA、INCX是把寄存器中的数据加1后放回寄存器中,其他指令是把存储单元中的数据加1后放回原存储单元中,对标志位V、N、Z产生影响。减1指令与加 1 指令类似,只是将上述指令中的“加 1”改为“减 1”,其他一致。具体如表4-8所示。 表4-8 加 1/减1指令描述3) 乘/除指令 乘法指令MUL将X与A中两个无符号数相乘,结果是两个字节的无符号数,其高字节放入X中,低字节放入A中,同时清零H和C标志位,不影响其他标志位。除法指令DIV 将H、A中无符号16位数除以X中的8位无符号数,商放入A中,余数放入H中。若商大于 $FF,则将标志

39、位C置1,否则清零;若商为0,则将标志位Z置1,否则清零。不影响其他标志位。具体如表4-9描述。表4-9 乘/除指令描述4) 比较指令 比较指令的实质是减法操作,如表4-10描述。与减法不同的是,它不需要减法的结果,不改变任何操作数,只按运算结果改变V、N、Z、C标志位,改变的方式与减法指令相同。 表4-10 比较指令功能描述5) 取反/求补指令 取反指令中的COMA、COMX是把寄存器中的数据取反后放回到寄存器中,如表4-11所示;其他指令是把存储单元中的数据取反后放回到原存储单元中。求补指令中的NEGA、NEGX是把寄存器中的数据求补后放回到寄存器中,其他指令是把存储单元中的数据求补后放回

40、到原存储单元中。表4-11 取反/求补指令6) 测试指令 测试指令中的 TSTA、TSTX 是将寄存器中的数据与零比较(实际上是执行减 0 的操作),其他指令是把存储单元中的数据与零比较。测试指令执行后并不改变操作数本身,清零C标志位,根据结果改变N、Z标志位。具体如表4-12描述。 表4-12 测试指令功能描述7) 清零指令 清零指令中的CLRA、CLRX、CLRH是将寄存器清零,其他指令是将存储单元清零,同时清零V、N标志位,置Z标志位,不改变H、I、C标志位。具体如表4-13所示。 表4-13 清零指令描述3. 逻辑运算指令 逻辑运算指令完成逻辑与、或、异或操作,如表4-14所示。这些指

41、令把累加器A中的数据与存储单元中的数据进行运算后,结果再送到累加器中,同时清零V标志位。 表4-14 逻辑运算指令描述4. 位操作指令 位操作类指令主要完成位测试、位置1、位清零等操作。如表4-15所示,位测试指令BIT 与 AND 的区别是把累加器中的数据与存储单元中的数据进行与运算后,结果不再送到累加器中,即它不改变参与运算的操作数。BCLR和BSET两条指令可对存储空间起始的256个单元的任一可读写位执行清零或置位操作。指令中n=70,指明一个字节的第几位,不影响任何标志位。表4-15 位操作指令描述5. 移位类指令 移位类指令包括算术左移、算术右移、逻辑左移、逻辑右移、循环移位等,如4

42、-16、表4-17所示。 表4-16 移位类指令描述1表4-17 移位类指令描述26. 程序转移和控制类指令 程序转移和控制类指令包括无条件转移指令、条件转移指令、调用子程序指令、返回指令和控制指令。 1) 无条件转移指令 无条件转移指令又分为相对转移指令和绝对转移指令。绝对转移指令将所寻址的两个单元内容作为地址送到PC,使CPU转到该地址开始执行程序,不影响标志位。具体如表4-18所示。表4-18 无条件转移指令描述2) 条件转移指令 条件转移指令又可分为:测试状态标志条件转移指令、测试IRQ条件转移指令、位测试转移指令、减1不为零转移和比较相等转移指令。 测试状态条件转移指令 这类指令根据

43、上一条指令的执行结果测试CCR的标志位状态。若条件满足,执行相对转移指令;若条件不满足,则顺序执行下一条指令,不影响标志位。具体如表4-19所示。 表4-19 测试状态条件转移指令描述 测试IRQ条件转移指令 具体如表4-20所示,测试IRQ条件转移指令负责电平的高低转移操作。 表4-20测试IRQ条件转移指令描述 位测试转移指令 测试所寻址单元相应位状态,若满足条件则发生转移,否则顺序执行下一条指令。只能对零页的RAM或 I/O寄存器的位测试转移,不影响标志位。具体如表4-21所示。 表4-21 位测试转移指令描述 减1不为零转移指令 这是兼有减1指令和不等于0转移指令功能的条件转移指令,不

44、影响标志位。具体如表4-22所示。 表4-22 减1不为零转移指令描述 比较相等转移指令 累加器A或X和所寻址单元内容相比较,若相等,则执行相对转移指令;若不相等,顺序执行下一条指令。不影响标志位。具体如表4-23所示。表4-23 比较相等转移指令描述3) 调用子程序指令 相对调用子程序指令 该调用子程序指令功能和相对转移指令类似,只是增加了PC进栈操作,也不影响标志位。具体如表4-24所示。 表4-24 相对调用子程序指令描述 绝对调用子程序指令 该调用子程序指令功能和绝对转移指令类似,只是增加了PC进栈操作,也不影响标志位。具体如表4-25所示。表4-25 绝对调用子程序指令描述4) 返回

45、指令 从子程序返回指令 该条指令的功能是PC退栈返回主程序。一般子程序必须以RIS结束。具体如表4-26所示。表4-26 从子程序返回指令描述 从中断返回指令 该条指令的功能和RTS相似,只是多了CPU寄存器CCR、A、X的退栈操作,使CPU从原来被中断的地方继续执行程序。中断服务程序必须以RTI 指令结束。具体如表4-27所示。 表4-27 从中断返回指令描述5) 控制指令 软件中断指令 CPU 执行软件中断 SWI 指令,产生不可屏蔽的软件中断,主要用于设计开发工具的监控程序。具体如表4-28所示。 表4-28 软件中断指令描述 堆栈指针复位指令 堆栈指针复位 RSP 指令使 SPL 值为

46、$FF,而SPH值保持不变,不影响标志。具体如表4-29所示。表4-29 堆栈指针复位指令描述 节电方式指令 节电方式指令具体如表4-30。 表4-30 节电方式指令描述 空操作指令 空操作指令本身不执行任何操作,用在延时等程序中,以调节程序执行的时间。具体如表 4-31所示。 表4-31 空操作指令描述7. 伪指令 汇编语言在源程序中使用助记符和符号给编程带来了极大的方便,却给汇编带来了困难,因为汇编程序无法区分源程序中的符号是数据还是地址,无法识别数据的类型,也不知道程序的定位、分段等情况。汇编语言为了解决这些问题,专门设置了伪指令。1) 赋值伪指令EQU格式:Label EQU nn可以

47、是一个数值,也可以是一个标号。作用:表示标号Label和后面的n等值。标号Label一定要从一行的第一列开始书写。例如:PTAD EQU 0000HPTA EQU PTADPTAD1 EQU 1ROMStart EQU 1860H使用伪指令EQU把一个数值定义为一个符号常量后,在源程序中就可以该符号常量来表示该数值,使程序非常清晰、直观。2) 定位伪指令ORG格式:ORG n作用:把此语句后面的数据或程序连续存放在以n为起始地址的存储空间中。ORG不能从一行的第一列开始书写,之前需要一个或多个空格或Tab键分隔,否则编译程序会把ORG当成标号而编译出错。例如:ORG $0070 ;用户程序变量

48、依次往后存放ORG $1860 ;代码和表格常数依次往后存放对于M9S08AW60,用于存放程序的Flash存储空间地址$0870$17FF或者$1860$FFAF,应该将程序定位在此范围内;用于存放数据的RAM空间地址为$0070$086F,应该将用户程序中的变量数据定位在此范围内。3) 存储区域定义伪指令RAM或Flash存储区域定义伪指令包括下列三种伪指令:l 空间定义伪指令(DS,Define Space)l 常量定义伪指令(DC,Define Constant)l 常量块定义伪指令(DCB,Define Constant Block)其中,DS用于RAM空间变量的定义,DC和DCB用

49、于Flash空间常量的定义。注意,S08系列MCU的数据存放格式都是顺序存放的,即字符串、机器码、多字节数据时都是按照从小地址到大地址的顺序先存放数据高位,后存放数据低位。 空间定义伪指令DS格式:<label>: DS.<size> <count>这里,<size> = B(default),W,or L,其中B表示字节类型,W表示字类型,L表示双字类型;<count>范围14096;若.<size>部分不写,单独为DS则默认表示为DS.B;label一定要从一行的第一列开始书写。作用:在以标号为首地址的存储单元中,定义

50、<count>个按<size>定义类型的连续存储空间,该存储空间不进行初始化,存储区大小为:<size>*<count>。例如:* 地址 存储区内容 存储区定义* ORG $0070 0070 XXXX ounter: DS.B 2 ;在存储区定义2个字节连续空间 0072 XXXX XXXX DS.W 5 ;继续在存储区定义5个字连续空间 0076 XXXX XXXX 007A XXXX*因为存储区未赋初值,所以用xx表示。按照上面定义,标号Counter代表定义好的12B空间的首地址。此外,有些编译器还使用和DS.B、DS.W、DS.L等价的

51、下列伪指令:DS.B=RMB DS.W=RMD DS.L=RMQ 常量定义伪指令DC格式:<label>: DC.<size> <expression1> ,<expression2> . . .这里,<size> = B(default),W,or L,其中B表示字节类型,W表示字类型,L表示双字类型;若.<size>部分不写,单独为DC则默认表示为DC.B;label一定要从一行的第一列开始书写。作用:用于把后面的数据<expression1>,.<expression2>按<size&g

52、t;定义的类型依次连续存放在以标号为首地址的存储单元中。可以有一个或多个数值表达式<expression>,表达式之间用逗号隔开;表达式可以是数值(二进制、八进制、十进制、十六进制或ASCII码),也可以是以符号或数值表达式。DC伪指令具有以下使用规则:l DC.B:为数值表达式分配1B的存储空间,若为字符串分配则每个ASCII码占用一个字节空间;l DC.W:为数值表达式分配一个字(2B)的存储空间,若为字符串分配则每个ASCII码占用两个字节空间,并且采用左对齐方式(高位字节存放在低地址,低位字节存放在高地址的顺序存放方式);l DC.L:为数值表达式分配一个双字(4B)的存储

53、空间,若为字符串分配则每个ASCII码占用4B空间,并且采用左对齐方式(高位字节存放在低地址,低位字节存放在高地址的顺序存放方式);例如:* 地址 存储区内容 存储区定义* Example for DC.B : ORG $80008000 4142 4344 Labe1: DC.B “ABCDE”8004 458005 0A0A 010A DC.B %1010, 12, 1, $A* * 地址 存储区内容 存储区定义* Example for DC.W : ORG $81008100 0041 4243 Labe2: DC.W “ABCDE”8104 44458106 000A 000A DC.W %1010, 12,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论