集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 840|回复: 0

ARM嵌入式汇编语言程序设计重点

[复制链接]
羽蒙 发表于 2014-7-17 15:02:07 | 显示全部楼层 |阅读模式
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反修,植球及更换。
同样的业务我们比质量;同样的质量我们比价格;同样的价格我们比时间,同样的时间我们比服务;同样的服务我们比信誉,你值得信赖的样板贴片专家。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-26 01:53 , Processed in 0.055023 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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