尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ARM 汇编指令:PUSH 和 POP

ARM 汇编指令:PUSH 和 POP
📅 发布时间:2026/6/19 3:39:16

ARM 汇编指令:PUSH 和 POP

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS
7、ARM 汇编指令:BEQ
8、ARM 汇编指令:TST
9、ARM 汇编指令:B
10、ARM 汇编指令:BX
11、ARM 汇编指令:ERET

在 ARM 汇编中,PUSH和POP是用于栈操作(堆栈操作)的指令,主要用于保存和恢复寄存器的值。它们是STMDB和LDMIA的别名,与栈指针(通常是SP)一起使用。


1.栈的概念

  • ARM 中栈通常是满递减栈(Full Descending, FD),即栈向低地址方向生长,栈指针指向最后一个入栈的元素。
  • PUSH用于将寄存器值存入栈(压栈)。
  • POP用于从栈中取出值到寄存器(出栈)。

2.PUSH 指令

语法:

PUSH {reg_list}

功能:

  • 将reg_list中的寄存器依次存入栈(从高寄存器到低寄存器顺序存入内存,但内存地址递减)。

  • SP会先递减(因为是满栈),然后再存数据。

  • 等价于:

    STMDB SP!, {reg_list}

    STMDB表示先递减(Decrease Before)存储。

示例:

PUSH {R0, R1, R4-R7} ; 将 R0, R1, R4, R5, R6, R7 压栈

假设入栈前SP = 0x1000,入栈 6 个寄存器(每个 4 字节)后SP = 0x1000 - 0x18 = 0xFE8。


3.POP 指令

语法:

POP {reg_list}

功能:

  • 从栈中取出数据到reg_list中的寄存器(从低地址到高地址加载到寄存器,寄存器的编号顺序不影响加载的内存顺序,但通常按编号升序弹出到寄存器列表中的寄存器)。

  • SP会在加载后递增(因为是满栈)。

  • 等价于:

    LDMIA SP!, {reg_list}

    LDMIA表示先递增(Increase After)加载。

示例:

POP {R0, R1, R4-R7} ; 恢复 R0, R1, R4, R5, R6, R7 的值

4.使用场景

子程序调用时保存现场:

subroutine: PUSH {R0-R3, LR} ; 保存工作寄存器和返回地址 ... ; 子程序代码 POP {R0-R3, PC} ; 恢复寄存器并返回(将 LR 弹出到 PC)

注意:这里POP {..., PC}相当于同时恢复了寄存器并跳转回调用处。


5.注意事项

  • 寄存器顺序:在PUSH和POP的寄存器列表中,可以按任意顺序书写,但汇编器会按寄存器编号升序排序后再压栈(编号高的寄存器对应高内存地址)。出栈时,低内存地址的数据弹出到列表中编号最小的寄存器。
  • 栈对齐:在 ARMv7/AArch32 中,通常要求SP对齐到 8 字节(特别是在调用公共接口时)。在 AArch64 中,PUSH/POP指令形式不同,并且要求 16 字节对齐。
  • Thumb 模式:在 Thumb 指令集中,PUSH/POP的寄存器列表有限制(通常只能用于通用寄存器和LR/PC)。

6.示例:完整的函数调用与返回

main: ... BL foo ... foo: PUSH {R4-R7, LR} ; 保存调用者保存的寄存器和返回地址 ... ; 使用这些寄存器 POP {R4-R7, PC} ; 恢复寄存器并直接返回

7.与 x86 的区别

  • x86 的PUSH/POP一次只能操作一个寄存器或内存地址,而 ARM 可以一次操作多个寄存器。
  • ARM 的栈操作更加灵活,可以通过STM/LDM实现多种栈模式(但PUSH/POP固定为满递减)。

相关新闻

  • 排序|倒序遍历|set
  • 镜像的创建
  • 在Django中安装、配备、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的机制

最新新闻

  • 曹操出行All in AI:Robotaxi“增程“时代,行稳以致远
  • 大连瓷砖空鼓修复哪家靠谱?5 家本地正规门店推荐 | 厨卫 / 客厅专修(2026 最新) - 金修达家庭维修
  • 如何在30分钟内用Slint构建现代化物联网设备UI界面
  • YOLOv8骨干网络用于棉花病害图像分类实战
  • 东莞瓷砖空鼓松动怎么修?本地口碑好的 5 家正规靠谱门店推荐 | 厨卫客厅空鼓专修(2026 最新) - 金修达家庭维修
  • MQX RTOS任务同步与IPC通信机制深度解析

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号