ARM嵌入式汇编语言程序设计重点
实验目的
l 熟悉ARM微处理器指令系统;
l
学习ARM嵌入式汇编程序设计的编程重点。
实验设备
l 硬件:PC机。
l
软件:ADS1.2集成开发环境,Windows 2000/XP/2003。
实验内容
l 了解多分支程序的编写方法; l
掌握ARM程序的运行和调试。
实验原理
(1)Arm 体系结构3种执行流程 1 顺序执行:在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器 (PC)加2个字节。整个过程按顺序执行。 2 跳转执行:程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。 3 异常中断执行:在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断
处理程序退出时,要恢复被中断程序的执行现场。 麦|斯|艾|姆|P|CB|样板|贴片|麦|斯|艾|姆|科|技|全国|首家P|CB样板打板。
(2)跳转表
多分支结构是程序中常见的结构,若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。注意:读跳转表时不要超过表的末端,检查超限是必需的。例如:
BL JUMPTABLE …
JUMPTABLE ADR R1,SUBTABLE
CMP R0,#SUBMAX ;检查超限
BHI stop ;若超限,则程序结束 LDR PC,[R1,R0,LSL #2];否则跳转到表中 stop MOV R0,#0X18
LDR R1,=0X20026
SWI 0x123456
SUBTABLE DCD SUB0 ;子程序表入口 DCD SUB1 DCD SUB2
实验参考程序
利用跳转表实现多分支转移。
AREA JUMP,CODE,READONLY;设置本段程序的名称(JUMP)及属性
num EQU 2 ;跳转表中的子程序个数 ENTRY ;程序执行的入口点
START ;设置3个参数,然后调用子程序arithfunc,进行算术运算 MOV R0,#0
MOV R1,#3 MOV R2,#2
BL arithfunc ;调用子程序arithfunc
STOP ;调用angel_SWIreason_ReportException,从应用程序中退出 MOV R0,#0X18
LDR R1,=0X20026 SWI 0x123456
arithfunc ;子程序arithfunc入口点
CMP R0,#num;判断选择子程序的参数是否在有效范围之内 MOVHS PC,LR
ADR R3,JumpTable;读取跳转表的基地址
LDR PC,[R3,R0,LSL #2];根据参数R0的值跳转到相应的子程序
;跳转表JumpTable中保存了各个子程序的地址, 在这里有两个子程序DoAdd和DoSub ;当参数R0为0时上面的代码将选择DoAdd ;当参数R0为1时上面的代码将选择DoSub JumpTable
DCD DoAdd DCD DoSub
DoAdd 子程序DoAdd执行加法操作 ADD R0,R1,R2
MOV PC,LR
DoSub 子程序DoSub执行减法操作 SUB R0,R1,R2 MOV PC,LR END;结束汇编
实验思考题
1. 修改下列C程序段代码为ARM汇编程序段代码。
do { x--; } while(x>0); 这里设x存放在R0 中(x为无符号整数) DOWHILE_L1 ADD R0,R0,#-1 ; 循环体,x--
DOWHILE_L2 MOVS R0,R0 ; R0 <= R0,并影响条件码标志
BNE DOWHILE_L1 ; 若R0不为0(即x不为0),则继续循环
DOWHILE_END NOP
2. 编写一简单ARM汇编程序段,实现1+2+…+100的运算。 AREA EXAMPLE1, CODE,READONLY ;定义一个代码段,名称为EXAMPLE1 ENTRY ;入口
MOV R0,#0 ;给R0赋值为0
MOV R1,#0 ;用R1来存放1~100的总和,初始化为0
START ADD R0,R0,#1 ;用来判断终止的,每次加1 ADD R1,R1,R0 ;从1加到100
CMP R0,#100 ;执行R0-100的操作,但不保存,只影响CPSR的值 BLT START ;带符号数小于时跳转到START处执行 STOP B STOP ;死循环 END
全面承快速样板及小批量贴片,后焊加工业务,样板2-3天完成,加快24小时, BGA反修,植球及更换。
同样的业务我们比质量;同样的质量我们比价格;同样的价格我们比时间,同样的时间我们比服务;同样的服务我们比信誉,你值得信赖的样板贴片专家。
|