Skip to content
ShenYj edited this page Apr 18, 2022 · 1 revision

b指令

无条件跳转,一般是什么函数内部的 ifswitch 条件判断

B 指令是最简单的跳转指令,一旦遇到一个 B 指令, ARM处理器将立即跳转到给定的目标地址,从那继续执行。

注意存储在跳转指令中的实际值是相对当前 PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。

它是 24 位有符号数,左移两位后有符号扩展为32 位,标识的有效偏移为 26 位(前后 32MB 的地址控件)

8086汇编下等同于 jmp 指令,类似于 C语言中的 goto

格式:B{条件} 目标地址 (B与条件间无空格)

  • B Label ;程序无条件跳转到标号 Label 处执行
  • 带条件时,一般配合 CMP 使用

示例

  • 基本跳转

    .text
    .global _test
    
    _test:
        b label
        mov x0, #0x5
    label:
        mov x1, #0x6
    ret

    在执行这段汇编代码的 _test 函数时,会跳过 mov x0, #0x5 这句代码,直接执行 mov x1, #0x6

  • 配合指令的条件域使用

    .text
    .global _test
    
    _test:
        mov x0, #0x1
        mov x1, #0x6
        cmp x0, x1      ; x0 减去 x1,并将结果影响到 cpsr 的标志位 
        beq label       ; 再去 cpsr 中标志位检查是否满足 EQ (找Z位, Z=1, Z=1 代表cmp操作相减为零,等价于判断 x0和x1的值是否相等)
        mov 0x, #0x5
    label:
        mov 0x1, #ox7

    在 Xcode 汇编断点中常见的写法是 b.eq

Getting Started

Social

Clone this wiki locally