常用的 ARM 汇编子程序

1. 子程序 的调用   
     BL xxxx

......

xxxx   
......
     MOV PC , LR  
    或B LR
 
      BX LR 
      STMFD SP!, {R0-R7 ,PC}

 

2. 数据比较 跳转

CMP R1,R2

 

BEQ XXXXXX

......   


CMP R1,R2  
 
ADDHI R1,R2,R1 
  
ADDLS R1,R2,R2

 

........

 

ANDS R1,R1, #0x08   


BNE WAIT

 

3. 循环

       MOV R1,#10  
  
LOOP   

      ........


      SUB R1,R1,#1 

      CMP R1, 0 

      BEQ LOOP

 

4. 数据块的复制
rb  
     MOV R1,=DATA_DST 

     MOV R2,=DATA_SRC 

 


     MOV R3,#10


LOOP 

     LDMFD R2!,{R4-R8} 

     STMFD R1!,{R4-R8}   

     SUBS R3,R3,#1   
  
     BNE LOOP

 

5. 堆栈操作
OUTDATA  

     STMFD SP! {R0-R7,LR} 

     ......
  
     BL DELAY 

     .......

     LDMFD SP! {R0-R7,PC}

 

6. 特殊寄存器的使用

WDTC EQU 0x00320212

LDR R0, =WDTC   

MOV R1, #1O  

STR R1,[R0]  ; 实现对外设的访问

7. 散转功能 
  
CMP RO , #MAXINDEX  


ADDLO PC,PC,RO,#4 ; 如果没有超过范围,那么开始跳转


B ERROR           ;散转表所对应的标号 0,1,2,3 ....

B FUN1


B FUN2

 

........

 

8.查表功能
     LDR R1, =TABLE   

     LDR R2, [R1 ,R5, LSL #2] ;R5 是要查询的表的标号 

 

........


TABLE  DCD 0X11,OX22,OX33 


       DCD 0X23,...   

9.长跳转  
  
    ADD LR, PC , #4 


    LDR PC, [PC,#-4]   


    DCD LADDR_FUN 

 

    ........  

    RET_FUN....

    也可以用 LDR PC, =LADDR_FUN 实现跳转

 

10.信号量 
  
DISP_SEM EQU 0x40002A00  
 
DISP_WAIT  

      MOV R1 ,#0 

      LDR R0, =DISP_SEM  

      SWP R1,R1,[R0]  

      CMP R1,#0 

  
      BEQ DISP_WAIT

 

11.伪指令的使用

LDR R1,=0x00120021

LDR R0,=RR_TAB

 

.........


  
NOP   

 

B ; 死循环

 

12. 外围部件的控制
 
LDR R0, =GPIO_BASE

MOV R1,#0x00   

STR R1,[R0,#0x04]  ; IOSET 0x00

MOV R1,#0x10

 

STR R1,[R0,#OxC0] ; IOCLR 0x101
  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值