利用跳转表实现程序分支(精)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一利用跳转表实现程序分支
一、实验目的:
1、熟悉ADS1.2 开发环境,掌握基本的调试方法;
2、熟悉ARM9 汇编语言的程序设计方法;
3、熟悉ARM9 的基本语法。
二、实验内容
利用跳转表实现具有下述功能的汇编程序:
(1)当r0 为 1 时,调用子程序CASE1,完成r1 加r2 把结果放入r3 的计算;
(2)当r0 为 2 时,调用子程序CASE2,完成r1 减r2 把结果放入r3 的计算;
(3)当r0 为 3 时,调用子程序CASE3,完成r1 与r2 把结果放入r3 的计算;
(4)否则,完成r1 或r2 把结果放入r3 的计算。
三、实验步骤:
安装完ADS1.2 后在其安装目录下存在如下两个文件,即Codewarrior for ARM Developer Suit和AXD Debugger,这两个文件分别是代码编辑文件和调试文件,在实验中我们主要使用这两个文件。运行ARM Developer Suite v1.2 中的Codewarrior for ARM Developer Suit 文件
2、选择将打开新建文件窗口,如图2 所示。选择Project 标签新建一个ARM 可执行的映像文件(ARM Executable Image),并填入适当的项目名(Project name)及选择合适的存放项目的目录(Location),最后点击确定。
3、新建一个*.s 文件用于存放我们的实验程序,其建立步骤如下。点将打开新建文件窗口,在新打开的窗口中选择Flie 标签,输入文件名。也可以通过工具栏中的
按钮实现
上述功能。值得注意的是由于在这里我们使用汇编语言编制程序因此文件扩展名一定要存为*.s。
4、输入所设的汇编语言并保存,注意扩展名必须为*.s。在输入设计文件时需要注意以下几点:
(1)标号必须顶格书写,而指令、伪指令和指示符前必须至少空一格空格,为了使程序格式清晰,通常使用标号必须顶格书写,而指令、伪指令和指示符前必须至少空一格空格,为了使程序格式清晰,通常使用Tab 键;
(2)指令、伪指令和指示符大小写均可;
(3)注释为英文状态下的“;”。
5、接下来开始调试所设计的文件,调试文件主要在项目窗口中进行。
(1)添加文件到项目。将鼠标指在项目窗口的空白处,点击右键,选择Add Flie…将设计文件添加到项目中。
(2)指定调试环境。选择DebugRel Settings 打开调试环境设置窗口,在这里可以进行相应的设置,我们只需将Language Settings 中的ARM Assembler 中的Target 选为ARM920T 即可(系统默认为ARM7TDMI,若只为了实现软件仿真,也可以不改变微处理器,因为ARM920T 与ARM7TDMI 均使用同一套ARM 指令集)。
(3)汇编文件。点击Make 按钮汇编我们设计的文件,并修正错误。当没有错误时就可以进行调试了。
(4)调试文件。在这里我们使用ADS1.2 中的AXD Debugger 进行程序调试,可以通过选择Debug 按钮调用AXD Debugger,其界面如图4 所示(若AXD 未能打开所调试的程序,
可以选择AXD Debugger 中的Options|Target 配置处理器)。实验的源程序
;利用跳转表实现具有下述功能的程序
;if r0==1 then CALL CASE1 (r3=r1+r2)
;else if r0==2 then CALL CASE2 (r3=r1-r2)
;else if r0==3 then CALL CASE3 (r3=r1&r2)
;else DEFAULT (r3=r1|r2)
;
AREA JumpTest,CODE,READONL Y ; 定义代码段
CODE32 ; 设置为arm 指令集
ENTRY ; 程序入口
start
MOV r0, #1 ;初始化程序中使用的寄存器
MOV r1, #3
MOV r2, #2
ADR r4, JumpTable ; 将跳转表地址送给r4
CMP r0, #1 ; if r0==1 then CALL CASE1
MOVEQ r3, #0
LDREQ pc, [r4,r3,LSL #2]
CMP r0, #2 ; if r0==2 then CALL CASE2
- 5 -
MOVEQ r3, #1
LDREQ pc, [r4,r3,LSL #2]
CMP r0, #3 ; if r0==3 then CALL CASE3
MOVEQ r3, #2
LDREQ pc, [r4,r3,LSL #2]
DEFAULT ; otherwise CALL DEFSULT
ORR r0, r1, r2
SWITCHEND
MOV r0, #0x18 ; 调用软中断返回操作系统
LDR r1, =0x20026
SWI 0x123456
JumpTable ; 定义跳转表
DCD CASE1
DCD CASE2
DCD CASE3
CASE1 ; 子程序1
ADD r3, r1, r2
B SWITCHEND
CASE2 ; 子程序2
SUB r3, r1, r2
B SWITCHEND
CASE3 ; 子程序3
AND r3, r1, r2