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

注意事项

  1. 栈平衡:必须与PUSH配对使用
  2. 寄存器顺序:汇编器会自动排序
  3. 返回地址:通常用PC替代LR实现返回
  4. 栈对齐:必须保持栈指针对齐