arm push/pop/b/bl汇编指令

本文详细介绍了ARM指令集中常用的push、pop、b、bl和bx指令。push用于将多个寄存器入栈,遵循低序列号寄存器先入栈的规则;pop则按相反顺序将栈中内容加载回寄存器;b指令实现简单的跳转;bl指令在跳转的同时保存返回地址到LR寄存器,适合调用子程序;bx指令则根据寄存器内容跳转并切换指令集。这些指令在程序控制流程中起到关键作用。

目录

1. push指令

2. pop指令

3. b指令

4. bl指令

5. bx指令



1. push指令

  • 功能描述:入栈

armv7 芯片手册:

Push Multiple Registers stores multiple registers to the stack, storing to consecutive memory locations ending just
below the address in SP, and updates SP to point to the start of the stored data.

  • 语法

 要点:

  • push支持同时将多个寄存器入栈,格式:{xx,xx},如:push {r0, r1,r2} 
  • 入栈顺序是先入栈序号低的寄存器到最低地址,比如push {fp, lr}效果图:

  •  push {r0, r1}和push{r1, r0}效果是一样的,因为按照arm规范是按照寄存器序列号顺序开始入栈,且从小序列号开始入栈。比如这种总是将r0入栈到低地址。

2. pop指令

  • 功能描述:出栈

Pop Multiple Registers loads multiple registers from the stack, loading from consecutive memory locations starting at the address in SP, and updates SP to point just above the loaded data.

  • 语法

要点:

  • 如同push一样,pop也支持同时pop出栈多个寄存器。
  • 出栈顺序和入栈顺序相反。pop {fp, lr},先从sp指向栈低地址处出栈内容到fp,再从高地址处出栈内容到lr中。

3. b指令

  • 功能描述:

Branch causes a branch to a target address.

  • 语法:只是简单的跳转到label处

B{<c>}{<q>} <label>

4. bl指令

  • 功能描述:

Branch with Link calls a subroutine at a PC-relative address.
Branch with Link and Exchange Instruction Sets (immediate) calls a subroutine at a PC-relative address, and changes instruction set from ARM to Thumb, or from Thumb to ARM.

  • 语法:

BL{X}{<c>}{<q>} <label>

The label of the instruction that is to be branched to.
For BL (encodings T1, A1), the assembler calculates the required value of the offset from the PC value of the BL instruction to this label, then selects an encoding that sets imm32 to that offset. Permitted offsets are even numbers in the range –16777216 to 16777214 (Thumb) or multiples of 4 in the range –33554432 to 33554428 (ARM).

BL指令于B指令区别:

        BL函数条跳转前执行:LR = PC - 4; (armv7为例)

Note: bl指令会计算label和当前pc位置的offset,所以这是相对跳转 

5. bx指令

  • 功能描述:跳转到寄存器中的地址

Branch and Exchange causes a branch to an address and instruction set specified by a register.

  • 语法

BX{<c>}{<q>} <Rm>

The register that contains the branch target address and instruction set selection bit. The PC can be used. This register can be the SP in both ARM and Thumb instructions, but ARM deprecates this use of the SP.

<think>我们正在讨论ARM汇编指令BL(Branch withLink)的功能和使用方法。根据用户需求,我们需要清晰解释BL指令,并可能涉及相关背景知识。首先,BL指令在ARM汇编中用于实现子程序调用。它的主要功能是:1.将返回地址(下一条指令的地址)存储到链接寄存器(LR,即R14)中。2.然后跳转到指定的目标地址(即子程序的入口地址)执行。 这样,当子程序执行完毕后,可以通过将LR寄存器的值复制到程序计数器(PC)来返回到调用点继续执行。在ARM架构中,子程序返回通常使用以下指令之一: -BX LR:跳转到LR寄存器中的地址,并切换指令集状态(如果需要)。 -MOVPC,LR:将LR的值复制到PC(在ARMv4及之前常用,但在ARMv5及以后推荐使用BX)。 值得注意的是,BL指令是带链接的分支指令,而B指令则是普通的分支指令(不保存返回地址)。 由于子程序可能会调用其他子程序,因此通常需要在进入子程序时将LR寄存器的值保存到堆栈中,以防止返回地址被覆盖。典型的做法是在子程序开头使用PUSH {LR}(或STMFDSP!,{LR})保存LR,并在返回前使用POP{PC}(或LDMFDSP!,{PC})恢复。 示例代码片段:```assemblymain:BL subroutine;调用子程序,LR被设置为下一条指令的地址...;子程序返回后继续执行subroutine:PUSH{LR};保存返回地址到堆栈...;子程序主体POP{PC};从堆栈恢复返回地址到PC,实现返回``` 在Thumb模式下,由于指令长度的限制,可能需要使用其他方式(如BX)返回,但原理相同。 此外,BL指令的跳转范围是有限的(在ARM模式下为±32MB,在Thumb模式下为±16MB)。对于超出范围的跳转,可能需要使用其他方法(如通过寄存器间接跳转)。 关于条件执行:BL指令在ARM状态下是无条件的,但在Thumb-2中提供了条件分支指令(如BLT等)。引用说明: -根据ARM文档[^1],BL指令的行为符合ARM过程调用标准(AAPCS),它规定了子程序调用的寄存器使用约定。-关于条件标志[^2],虽然BL指令本身不设置条件标志,但子程序中的指令可能会影响条件标志。§§相关问题§§1. BL指令和B指令有什么区别?2.在ARM汇编中如何实现嵌套子程序调用? 3. BL指令的跳转范围限制如何解决?4.为什么在子程序中需要保存LR寄存器? 5. ARM和Thumb模式下的BL指令有何不同?</think>### ARM汇编指令BL的功能和使用方法 BL(Branch with Link)是ARM汇编中的核心指令,用于实现**子程序调用**。其主要功能和使用要点如下: #### 1. **核心功能** - **跳转并链接**:将下一条指令的地址(返回地址)存入链接寄存器(LR/R14),同时跳转到目标地址执行子程序。 - **保存返回地址**:执行 `BL target` 时,处理器自动完成: $$ \text{LR} \leftarrow \text{PC} + 4 \quad \text{(返回地址存储)} $$ $$ \text{PC} \leftarrow \text{target} \quad \text{(跳转执行)} $$ 其中PC是程序计数器,存储当前指令地址+8(ARM三级流水线特性)[^1]。 #### 2. **典型使用场景** ```assembly main: MOV R0, #5 ; 设置参数 BL factorial ; 调用阶乘子程序 B halt ; 主程序结束 factorial: ; 子程序入口 PUSH {LR} ; 保存LR到栈(防止嵌套调用覆盖) CMP R0, #1 ; 检查边界条件 ... ; 子程序主体 POP {PC} ; 返回:PC ← 栈中保存的LR ``` #### 3. **关键注意事项** - **LR寄存器保护**: - 子程序内部若需调用其他函数(嵌套调用),必须先将LR压栈(如 `PUSH {LR}`),否则返回地址会被覆盖。 - 返回时常用 `POP {PC}` 或 `BX LR` 将LR加载到PC实现返回[^2]。 - **跳转范围限制**: - ARM模式:支持 ±32MB 的相对跳转(24位有符号偏移量)。 - Thumb模式:范围缩小为 ±16MB。 - **与B指令的区别**: | 指令 | 功能 | 是否保存返回地址 | |------|------------------------|------------------| | `B` | 单纯跳转 | ❌ | | `BL` | 跳转并保存返回地址到LR | ✅ | #### 4. **条件执行(Thumb-2扩展)** 在Thumb-2指令集中,BL可结合条件码实现条件调用(如 `BLT target`),仅当条件满足时跳转并保存LR[^2]。 #### 5. **应用场景** - 函数调用(需返回的场景) - 中断服务程序(ISR)的跳转 - 动态链接库调用 > **重要提示**:ARM过程调用标准(AAPCS)要求子程序调用时保留R0-R3、R12、LR寄存器,BL是遵循此标准的关键指令[^1]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值