zoukankan      html  css  js  c++  java
  • ARM 汇编指 跳转指令 b , bl

    1. 跳转指令 【 b 】 【 bl 】

        指令格式:<opcode><cond> <address>

       不带返回的跳转指令:b 

    mov r0, #0x12
    mov r1, #0x34
    b fun_add     @一条指令 , 有地址
    mov r2, #0x56   @通过上面的跳转此处将不会得到执行
    mov r3, #0x78
    
    
    fun_add: @伪操作 标号类似 C语言中的一个函数体 , 此处只是一个局部 的标号
          mov r4, #0x1
          mov r5, #0x1
          add r6, r4, r5
          b  loop    @ b指令本质改变寄存器 PC 值   
    
    loop:
          b loop   @此处是实现 死循环

       带返回值的跳转指令:bl

    mov r0, #0x12
    mov r1, #0x34
    
    bl fun_add  @由CPU 自动保存返回地址 到 lr 寄存器(r14)
    mov r2, #0x56  @ 跳转到fun_add 函数 执行完后再跳转此处执行
    mov r3, #0x78
    b loop
    
    fun_add:
        mov r4, #0x1
        mov r5, #0x1
        add r6, r4, r5   @需要手动把 lr 值 赋给 PC 
        mov pc, lr   @此时这个fun_add 函数执行完 , 会跳转到,跳转次函数的下条指令
    
    loop:
        b loop

    条件码 <cond >的功能使用介绍

    例子 : 求出 0 ~ 10 以内的奇数和

    mov r0, #1
    add_fun:
        add r2, r2, r0
        add r0, r0, #2
        cmp r0,#11     @ 到达11 可以结束了
        beq loop       @ 此处受 cmp 执行的 结果影响; 如果相等则跳转到 loop ; 其中 eq 是条件码
        bne add_fun    @ 受 cmp 执行结果影响; 不相等 跳转到 add_fun 处  ; 其中 ne 是条件码
    
    loop:
        b loop

     对于比较指令 cmp 会CPSR 中的 NZC 状态位,下面的跳转指令 , beq 表示cmp 比较指令成了 将要执行,否则执行bne指令

    与C 语言对比:

       if( r0 == 11)   cmp r0, #111
      {
        beq loop     beq loop
      }
      else 
      {
        bne add_fun   bne add_fun
      } 
  • 相关阅读:
    js基础
    装饰模式,代理模式,继承
    Retrofit源码解析
    Android Studio自定义Plugin
    EMV笔记:持卡人认证(CVM)
    阿里代码规范笔记
    文章博客网址收集
    MultiDex解析
    EMV随记(1)
    RSA笔记
  • 原文地址:https://www.cnblogs.com/electronic/p/11019442.html
Copyright © 2011-2022 走看看