POP
POP基本概念
POP指令用于从栈中恢复数据到寄存器,是PUSH的逆操作。
语法格式
POP {寄存器列表}
工作原理
执行过程
POP {R0, R1, PC}
执行步骤: 1. 从当前SP地址加载数据到第一个寄存器 2. SP = SP + 4 3. 从新SP地址加载数据到下一个寄存器 4. SP = SP + 4 5. 重复直到所有寄存器恢复
具体示例
基础用法
0x08002F44 BD03 .. POP {R0, R1, PC}
执行前:
SP = 0x20000FF4
栈内容:
0x20000FF4: R0的原始值
0x20000FF8: R1的原始值
0x20000FFC: LR的原始值
执行后:
SP = 0x20001000 (SP增加12字节)
R0, R1恢复原值
PC = LR的原始值(实现函数返回)
函数返回典型用法
POP {R4, R5, PC} ; 恢复寄存器并用PC替代LR实现返回
与PUSH的配对使用
正确的配对
; 函数开始
PUSH {R4, R5, LR} ; 保存寄存器
; 函数体...
; 函数结束
POP {R4, R5, PC} ; 恢复寄存器并返回
栈平衡
- PUSH和POP必须成对出现
- 操作寄存器数量必须匹配
- 否则会导致栈指针错乱
特殊用法
函数返回技巧
POP {PC} ; 直接返回到调用者
恢复部分寄存器
POP {R4-R6} ; 只恢复部分寄存器
ADD SP, SP, #4 ; 手动调整SP
注意事项
- 栈平衡:必须与PUSH配对使用
- 寄存器顺序:汇编器会自动排序
- 返回地址:通常用PC替代LR实现返回
- 栈对齐:必须保持栈指针对齐