stp aarch64 指令必须与“非连续寄存器对”一起使用

2023-11-22

aarch64 架构没有多重存储和加载指令,即没有与 armv7 arch 中的 stm 和 ldm 等效的指令。相反,您必须使用 stp 和 ldp 指令来存储和加载寄存器对。

根据ARM参考手册:

http://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf

没有多寄存器 LDM、STM、PUSH 和 POP 指令,但可以使用非连续寄存器对的加载存储。

我的问题是,这里的不连续是什么意思或指的是什么?我的即时反应是,这意味着您不能在这些命令中使用连续编号的寄存器,例如

stp x0, x1, [sp, #-16]!

是非法的。但我不相信情况是这样。我已经看到示例代码正是这样做的,而且我还设法让(Apple 的)Clang 生成类似的代码,例如

stp x1, x0, [fp, #-16]!

我一生都无法思考连续性意味着什么。我认为这可能与使用重叠寄存器有关,例如

stp x0, x0, [sp, #-16]!
stp w0, x0, [sp, #-12]!

不过,我也见过示例代码执行此类操作(并不是说代码是正确的!)。如果是这种情况,我也会明确使用术语“重叠”而不是“连续”。

有任何想法吗?


主要是强调与A32(ARM)的对比LDRD/STRD指令*,只能加载一对连续的寄存器,其中最低的寄存器必须是偶数,即:

LDRD r0, r1, [sp]   @ OK
LDRD r0, r7, [sp]   @ <Rt> and <Rt2> are non-contiguous: invalid
LDRD r3, r4, [sp]   @ Contiguous but <Rt> odd-numbered: invalid

[这是因为指令中只有空间来编码一个目标寄存器,因此架构必须有一种定义的方式来推断第二个目标寄存器。]

相比之下,A64LDP/STP编码有空间对两个目标寄存器进行编码,这意味着它们可以是任何顺序的任意两个寄存器,即它们是allowed不连续 -这是许可,而不是限制.

请注意,该特定文档是obsolete自完整版发布以来ARMv8 ARM,其中有适当的详细说明页面,应该稍微不那么模糊。

* The T32 (Thumb) encodings don't have this restriction, since the lack of a condition predicate means there's space to encode the second target register, much like A64.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stp aarch64 指令必须与“非连续寄存器对”一起使用 的相关文章

  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • 将 C 代码转换为 x86-64 汇编

    我正在尝试将 C 代码转换为 x86 64 我的目标是反转链表 传入的两个参数是 head ptr 和 offset to 以获取指针字段的地址 即指向列表中下一个节点的指针 据我了解 head ptr是通过rdi寄存器传入的 offset
  • 一个地址有多少字节? [复制]

    这个问题在这里已经有答案了 在64位机器上 我们知道一个地址是8个字节 然而 我并不完全清楚一个地址中有多少字节的信息 虚拟内存中的每个字节都有一个地址吗 或者内存中的每 64 位都有一个地址 还是取决于架构 如果这取决于架构 那么我应该如
  • 学习 (N)ASM 的最佳资源是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习汇编已经有一段时间了 尽管我之前尝试过几次 但我还没有真正能够超越 Hello world 有
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • INT 13h 无法读取超出特定扇区的数据

    我正在为我的操作系统编写内核 在将磁盘扇区加载到内存时遇到问题 以下是从磁盘加载扇区的函数代码部分 mov ax 0x3000 mov es ax mov ax 0x0201 mov bx word ptr bp 6 bx 0x000 0x
  • 为什么 GCC 在堆栈上压入额外的返回地址?

    我目前正在学习汇编的基础知识 在查看 GCC 6 1 1 生成的指令时遇到了一些奇怪的情况 这是来源 include

随机推荐

  • 为什么我必须在所有响应中传递 RequestContext?

    我想在导航菜单中突出显示当前页面 显然 当您在菜单链接的页面上时 我需要为菜单链接提供一个类似 活动 的类 这是一个经典问题 我见过很多解决方案proposed 我的问题是我讨厌他们所有人 并且认为他们都不是很干 例如 register s
  • 将图像内容从相机加载到文件

    我正在使用phonegap API使用以下指令拍照 或从库中选择 MyApp directive Camera function return restrict A require ngModel link function scope e
  • 为什么具有委派域访问权限的服务帐户仍然需要模拟?

    我正在考虑使用 OAuth 2 0服务帐户 and 域范围内的授权将我们的服务与 Google Apps 集成 一个特定的用例是 当 Google Apps 客户注册我们的服务时 请利用客户现有的组织结构或资源 组织单位 群组 设备 用户
  • 将对象与左侧的常量相乘

    我有一个Matrix类并且它已经超载了 用于标量和矩阵乘法的运算符 template
  • 等待任何未来的异步

    我正在尝试使用 asyncio 来处理并发网络 I O 大量的功能将被安排在一个点上 而每个功能完成所需的时间差异很大 然后 接收到的数据将在每个输出的单独进程中进行处理 处理数据的顺序不相关 因此考虑到输出的等待时间可能很长 我想awai
  • 根据当前时区将 UTC 日期/时间显示为日期/时间

    我从网络上获取格式为 yyyy mm dd T HH MM SS Z 的日期 时间字符串 并且采用 UTC 格式 现在我必须确定设备的当前时区 然后将该时间转换为我的当地时间 我该怎么做 仅供参考 目前 UTC 时间为上午 10 25 印度
  • 如何从 Postgres 中的动态 SQL 获取结果?

    原始表 其规则存储在名为 md formula 的表中 用于映射到目标表 删除 创建 插入raw dbs transactiondetailscash DROP TABLE raw dbs transactiondetailscash CR
  • 如何从页面加载和鼠标移动跟踪鼠标位置?

    我使用以下 JavaScript 跟踪鼠标移动 var mouseX 0 var mouseY 0 document onmousemove function e mouseX e clientX mouseY e clientY 我的问题
  • AsyncTaskLoader.deliverResult() 实际上做了什么?

    我试图理解一些更细微的观点异步任务加载器 这对其他人来说可能是显而易见的 但我找不到明确的示例或定义来演示和解释当您覆盖时会发生什么deliverResult 方法 实际交付了什么 它如何与调用对象交互 我可以看到使用super deliv
  • 为什么 Javascript 在 iPhone 上运行这么慢?

    我一直在研究为 iPhone 编写应用程序 我真的很喜欢PhoneGap它基本上允许您在应用程序中包含网页 我的技能主要是 HTML Javascript 因此这个工具使我能够充分利用我的技能 而无需花费大量时间学习如何为 iPhone 编
  • 从堆栈项目生成 Nix 包

    我有一个可以构建和安装的软件应用程序stack 我还想提供适用于 Linux 和 Mac 的二进制包 为此我正在考虑nix 因为除其他外 它可以在 Linux 和 Mac 中使用 这将省去我维护两种包类型的麻烦 阅读完有关如何nix包已定义
  • Spring Boot 骆驼测试

    我需要在 Spring Boot 应用程序中测试 Camel 路由 我有 Spring boot 主类 其中声明了所有必需的 bean 我正在使用 CamelSpringJUnit4ClassRunner class 在 ContextCo
  • 为什么我的 jquery cookie 无法跨多个页面使用?

    本周我研究并组合了一些 jquery 这是我第一次使用 jquery 来控制自定义 WordPress sidebar php 文件中的可折叠菜单 菜单是动态生成的 使用 wp query 通过自定义分类法和自定义排序顺序等来选择和排序自定
  • 获取 iOS 控制中心当前播放的曲目

    我希望无论哪个应用程序正在播放该曲目 都能在 iOS 上播放当前曲目 我的意思是 例如 如果我在手机上使用 SoundCloud 或 Spotify 控制中心上的播放器是相同的 所以我认为可以获得当前的曲目名称 但我不知道该怎么做 也许有人
  • 将其传递给基本构造函数

    我正在尝试为我正在编写的程序实现良好的设计模式 我有一个这样的类结构 abstract class SomeBase public SomeObject obj get protected set protected SomeBase So
  • 如何将一个 C# 项目中的类与另一个 C# 项目一起使用

    在同一个解决方案中 我有两个项目 P1 和 P2 如何在 P2 中使用 P1 类 In the Solution Explorer tree expand the P2 project right click Shift F10 the D
  • WiX 卸载前关闭应用程序 - 关闭打开的应用程序消息

    我正处于一种痛苦之中 我有一个安装程序安装并启动托盘图标应用程序 通用 exe 这是正常工作的 但现在我想在这个 UI 告诉用户手动关闭应用程序出现之前停止该应用程序 因为在卸载例程期间 我的托盘图标被删除 但该进程仍在运行 我应用此自定义
  • 与 CoffeeScript JSX 开玩笑?

    如何使用 Jest 测试用 CoffeeScript React jsx 编写的 React 组件 Jest 提供的唯一 CoffeeScript 示例使用普通的 CoffeeScript 并且不适用于 CoffeeScript React
  • DataGridViewColumn.DataPropertyName 属性

    我有一个 DataGridView 控件 我想用数据填充它 我使用 DataSource 属性 dgvDealAsset is DataGridView private void DealAssetListControl Load obje
  • stp aarch64 指令必须与“非连续寄存器对”一起使用

    aarch64 架构没有多重存储和加载指令 即没有与 armv7 arch 中的 stm 和 ldm 等效的指令 相反 您必须使用 stp 和 ldp 指令来存储和加载寄存器对 根据ARM参考手册 http www element14 co