news 2026/4/15 8:47:00

ARM 汇编指令:STP\LDP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ARM 汇编指令:STP\LDP

ARM 汇编指令:STP\LDP

好的,STP 和 LDP 是 ARMv8-A 架构中非常核心且高效的一对指令,用于同时存储/加载两个寄存器。它们对栈操作、函数调用约定和内存数据块操作至关重要。

核心概念

  • STPStore Pair。将两个寄存器的值存储到相邻的内存地址中。
  • LDPLoad Pair。从相邻的内存地址中加载数据到两个寄存器中。
  • 本质:它们是单条指令,但完成两次内存访问,这比使用两条单独的STR/LDR指令更高效。
  • 主要用途
    1. 函数开场/收场(Prologue/Epilogue):保存和恢复被调用者保存的寄存器(如x29, x30即 FP, LR),以及分配/释放栈空间。
    2. 在内存和寄存器之间移动大数据块
    3. 高效的结构体/数组元素存取

基本语法

STP Rt1, Rt2, [Rn, #offset] // Store LDP Rt1, Rt2, [Rn, #offset] // Load
  • Rt1,Rt2:要存储或加载的源/目标寄存器。通常是通用寄存器(X0-X30)或浮点/向量寄存器(D0-D31,Q0-Q31)。
  • Rn:基址寄存器,存放内存地址。
  • [Rn, #offset]:寻址模式。offset是一个有符号的立即数,必须是8 的倍数(因为一次操作 2 * 64-bit = 16 字节,要求地址对齐;而立即数单位是字节,只要第一个数是8字节对齐的,第二个也是对齐的)。

寻址模式(关键!)

寻址模式决定了如何计算内存地址以及如何更新基址寄存器Rn。这是理解STP/LDP用法的核心。

1. 偏移模式 (Offset)

地址计算为Rn + offset不更新Rn

STP X0, X1, [SP, #16] // 将 X0, X1 存储到地址 SP+16 和 SP+24。SP 本身不变。 LDP X0, X1, [SP, #-16] // 从地址 SP-16 和 SP-8 加载到 X0, X1。SP 本身不变。
2. 前变基模式 (Pre-index)

地址计算为Rn + offset然后将计算后的地址写回RnRn = Rn + offset)。
语法:在偏移外加上!

STP X0, X1, [SP, #-16]! // 1. SP = SP - 16; 2. 将 X0, X1 存储到 [SP] 和 [SP+8]。 // 这是典型的【分配栈空间并保存寄存器】 。
3. 后变基模式 (Post-index)

使用Rn的原始值作为地址,然后更新RnRn = Rn + offset)。
语法:偏移放在]后面。

LDP X0, X1, [SP], #16 // 1. 从 [SP] 和 [SP+8] 加载到 X0, X1; 2. SP = SP + 16。 // 这是典型的【恢复寄存器并释放栈空间】。

典型用例示例

用例 1:函数开场与收场(最常见)
// 函数开场 (Prologue) my_function: STP X29, X30, [SP, #-16]! // 将帧指针(X29)和返回地址(X30)压栈,同时 SP -= 16 MOV X29, SP // 设置新的帧指针 // 函数体 ... // 函数收场 (Epilogue) LDP X29, X30, [SP], #16 // 从栈中恢复 X29, X30,同时 SP += 16 RET // 使用恢复的 X30 返回

解释

  • STP ... !在栈上分配了16字节空间,并保存了X29, X30
  • LDP ..., [SP], #恢复这两个寄存器,并回收栈空间。
  • 这对操作保证了栈的平衡。
用例 2:交换两个寄存器的值(无需临时寄存器)
// 假设我们要交换 X0 和 X1 的值 STP X0, X1, [SP, #-16]! // 将 X0, X1 的值临时压栈 LDP X1, X0, [SP], #16 // 以相反的顺序加载回来,实现交换
用例 3:加载/存储结构体成员
// 假设一个结构体: struct { long a; long b; } s;// 地址在 X0 中,我们想加载 a 和 b 到 X1, X2LDP X1,X2,[X0]// X1 = s.a, X2 = s.b// 或者想存储 X3, X4 到 s.a, s.bSTP X3,X4,[X0]
用例 4:批量内存拷贝(简化循环)
// 从 X1 指向的内存拷贝 32 字节到 X0 指向的内存 LDP X2, X3, [X1] // 加载前16字节 LDP X4, X5, [X1, #16] // 加载后16字节(偏移模式) STP X2, X3, [X0] // 存储前16字节 STP X4, X5, [X0, #16] // 存储后16字节

重要注意事项

  1. 寄存器顺序:在内存中,Rt1总是存储在较低地址,Rt2在较高地址(Rt1 -> [address],Rt2 -> [address+8])。

  2. 对齐offset必须是 8 的倍数。产生的内存地址通常也建议自然对齐(即地址是所传输数据总大小的倍数),非对齐访问可能降低性能或导致异常。

  3. 浮点/向量寄存器:同样适用于S,D,Q寄存器。

    STP D0, D1, [X0] // 存储两个双精度浮点数 LDP Q0, Q1, [X1, #32]! // 加载两个128位向量,并更新基址
  4. 栈指针 (SP):对 SP 的使用必须保持16 字节对齐,这是 ARMv8 的硬性规定。STP/LDP是维护这种对齐的首选指令。

  5. 符号扩展LDP有带符号扩展的变体,如LDPSW,用于加载两个 32 位字并将其符号扩展到 64 位寄存器。

总结

特性STPLDP
全称Store PairLoad Pair
作用寄存器的值 -> 内存内存的值 -> 寄存器
关键寻址偏移 ([Rn, #off])、前变基 ([Rn, #off]!)、后变基 ([Rn], #off)
主要用途保存寄存器、压栈、写数据块恢复寄存器、出栈、读数据块
栈操作核心STP X29, X30, [SP, #-16]!(分配空间并保存)LDP X29, X30, [SP], #16(恢复并释放空间)

掌握STP/LDP及其寻址模式,是理解 ARMv8 汇编中栈管理和高效内存访问的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 8:46:58

基于微信小程序的智能雨伞借取系统毕设源码+文档+讲解视频

前言 本课题聚焦公共出行场景下的应急借伞需求,针对传统共享雨伞借还流程繁琐、点位信息不透明、归还不便、管理效率低下等痛点,设计开发基于微信小程序的智能雨伞借取系统。系统以微信小程序为核心载体,结合前端原生开发技术与后端轻量化服务…

作者头像 李华
网站建设 2026/4/15 8:44:17

2025最强AI写论文神器:8款工具一键搞定降重润色!

别再为论文熬夜、为查重焦虑、为导师意见抓狂了。这篇终极清单,将彻底改变你的学术写作方式。 在学术写作的世界里,时间就是生命,质量就是尊严。从开题报告到文献综述,从数据处理到最终查重,每一步都充满挑战。但今天&…

作者头像 李华
网站建设 2026/4/15 8:43:19

PMP学习笔记--环境

01,组织运行环境包含事业环境因素和资质过程资产组织结构类型(1)职能型组织(2)矩阵型组织(3)项目型组织项目管理者在不同组织中的特征组织治理框架法约尔原则与治理要素企业文化与发展战略企业所…

作者头像 李华
网站建设 2026/4/13 18:53:14

@valid的坑

尝试1如果需要参数校验&#xff0c;我们就在controller的参数前添加valid&#xff0c;像下面一样RequestBody Valid List<PlatProjectItemAndVerionVo> itemAndVersionVoList参数属性上添加注解NotBlank(message "dataType参数不能为空") private String data…

作者头像 李华
网站建设 2026/4/10 7:44:43

4 倍扩容 + 700 + 流程图极速展示!ProDB×TDengine 赋能泰州石化

小T导读&#xff1a;中海油泰州石化原有 AspenTech InfoPlus.21 实时数据库系统建设至今已有十余年&#xff0c;随着企业的逐步发展&#xff0c;原有采集点数已达上限&#xff0c;相关应用取数效率下降&#xff0c;限制了企业新需求的增长&#xff0c;借助该国产化项目汉中诺 P…

作者头像 李华
网站建设 2026/4/11 12:19:12

【电动汽车响应率】考虑的是针对电动汽车充放电调度问题,由于放电奖励不同导致部分车主不愿参与放电,设计出响应率计算方法附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华