找回密码
 注册
搜索
查看: 712|回复: 0

[资料] ARM嵌入式汇编语言程序设计重点

[复制链接]
发表于 2014-7-14 14:59:51 | 显示全部楼层 |阅读模式


ARM嵌入式汇编语言程序设计重点 
实验目的 
 熟悉ARM微处理器指令系统; 
 
学习ARM嵌入式汇编程序设计的编程重点。 
实验设备 
 硬件:PC机。 
 
软件:ADS1.2集成开发环境,Windows 2000/XP/2003。 
实验内容 
 了解多分支程序的编写方法;  
掌握ARM程序的运行和调试。 
实验原理 
(1)Arm 体系结构3种执行流程 1 顺序执行:在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器 (PC)加2个字节。整个过程按顺序执行。 2 跳转执行:程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。 3 异常中断执行:在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断
处理程序退出时,要恢复被中断程序的执行现场。  
(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&#160;&#160;MOVS&#160;R0,R0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;&#160;R0&#160;<=&#160;R0,并影响条件码标志&#160;&#160;&#160;
BNE&#160;&#160;DOWHILE_L1&#160;&#160;&#160;;&#160;若R0不为0(即x不为0),则继续循环&#160;
DOWHILE_END&#160;&#160;NOP&#160;&#160;&#160;
2.&#160;编写一简单ARM汇编程序段,实现1+2+…+100的运算。&#160;&#160;&#160;AREA&#160;EXAMPLE1,&#160;CODE,READONLY&#160;&#160;;定义一个代码段,名称为EXAMPLE1&#160;&#160;&#160;ENTRY&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;入口&#160;
&#160;&#160;MOV&#160;&#160;&#160;&#160;&#160;R0,#0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;给R0赋值为0&#160;
&#160;&#160;
MOV&#160;&#160;&#160;R1,#0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;用R1来存放1~100的总和,初始化为0&#160;
START&#160;&#160;ADD&#160;&#160;R0,R0,#1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;用来判断终止的,每次加1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ADD&#160;&#160;R1,R1,R0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;从1加到100&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;CMP&#160;&#160;R0,#100&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;执行R0-100的操作,但不保存,只影响CPSR的值&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BLT&#160;&#160;START&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;带符号数小于时跳转到START处执行&#160;STOP&#160;&#160;&#160;B&#160;&#160;&#160;&#160;&#160;STOP&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;死循环&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;END&#160;

全面承快速样板及小批量贴片,后焊加工业务,样板2-3天完成,加快24小时, BGA反修,植球及更换。
同样的业务我们比质量;同样的质量我们比价格;同样的价格我们比时间,同样的时间我们比服务;同样的服务我们比信誉,麦斯艾姆,你值得信赖的样板贴片专家。
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-24 04:34 , Processed in 0.043903 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表