news 2026/3/27 16:29:16

ARM 汇编指令:STR

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ARM 汇编指令:STR

ARM 汇编指令:STR

1. 核心定义

STRStore Register的缩写,意思是将寄存器中的值存储(写入)到内存。它是 ARM 汇编中最基本、最常用的内存写入指令。

与它对应的是LDR指令,后者是从内存加载数据到寄存器。

2. 基本语法

STR{<size>} <Rt>, [<Rn>, <operand2>]
  • {<size>}:可选的后缀,指定操作的数据大小。默认为 32 位(字)。
    • B- 字节 (8位),如STRB
    • H- 半字 (16位),如STRH
    • 无后缀 - 字 (32位),如STR
    • 在 ARMv8 (AArch64) 中,还可以使用W(32位) 或X(64位) 寄存器来隐含大小。
  • <Rt>:源寄存器,其值将被存储到内存。
  • [<Rn>, <operand2>]: 内存地址表达式。
    • Rn: 基址寄存器,存放内存地址的基值。
    • operand2: 地址偏移量,可以是立即数或另一个寄存器,有时还可以带移位。

3. 寻址模式(关键部分)

寻址模式决定了如何计算最终的内存地址。

a) 偏移模式

地址是基址寄存器加上一个偏移量。原基址寄存器的值不变

STR R1, [R2, #12] ; 内存地址 = R2 + 12,将 R1 的值存入此地址。R2 本身的值不变。

b) 前变址模式

先计算新地址(基址+偏移),然后使用这个新地址进行存储。基址寄存器的值会被更新为这个新地址

STR R1, [R2, #12]! ; 注意感叹号 '!' ; 1. 计算新地址: R2_new = R2_old + 12 ; 2. 将 R1 的值存储到 [R2_new] 指向的内存 ; 3. 将 R2 寄存器的值更新为 R2_new

c) 后变址模式

先使用原基址寄存器的值作为地址进行存储,然后再更新基址寄存器(加上偏移量)。

STR R1, [R2], #12 ; 偏移量写在括号外 ; 1. 将 R1 的值存储到 [R2_old] 指向的内存 ; 2. 更新 R2: R2_new = R2_old + 12

这种模式非常适合在存储后移动指针,例如遍历数组。

d) 寄存器偏移

偏移量可以来自另一个寄存器,并可选择移位操作。

STR R1, [R2, R3] ; 地址 = R2 + R3 STR R1, [R2, R3, LSL #2] ; 地址 = R2 + (R3 * 4)

4. 数据大小示例 (ARMv7/AArch32)

STR R0, [R1] ; 将 R0 中的 32 位字(Word)存储到 R1 指向的地址 STRB R0, [R1] ; 只将 R0 的最低 8 位字节(Byte)存储到内存 STRH R0, [R1] ; 只将 R0 的最低 16 位半字(Halfword)存储到内存

5. AArch64 (ARMv8 64位) 中的变化

在 64 位架构下,语法和寄存器名称有更新:

  • 通用寄存器是X0-X30(64位) 或W0-W30(32位)。
  • STR的数据大小通常由寄存器宽度隐含,但也可用后缀指定。
  • 偏移量范围通常更大。
STR X0, [X1, #8] ; 将 64 位的 X0 存储到地址 X1+8 STR W0, [X1, #4] ; 将 32 位的 W0 存储到地址 X1+4 STRB W0, [X1] ; 将 W0 的低 8 位存储到地址 X1

6. 一个简单完整的示例

假设我们要将数组array的第一个元素(在内存中)设置为 100。

.data array: .word 0, 0, 0, 0 ; 定义一个包含4个字的数组,初始为0 .text .global main main: // 假设我们要将 array[0] 赋值为 100 LDR R0, =array ; R0 获得数组的首地址(加载地址) MOV R1, #100 ; R1 = 100,这是我们要存储的值 STR R1, [R0] ; 关键指令:将 R1 的值(100)存储到 R0 指向的内存地址 // 使用后变址模式存储 200 到 array[1] MOV R1, #200 STR R1, [R0], #4 ; 存储到 [R0],然后 R0 = R0 + 4(指向下一个字) // 此时 R0 指向 array[1] 的地址 BX LR ; 返回

7. 要点总结

特性说明
目的将寄存器数据写入内存
对应指令LDR(从内存读)
关键语法STR Rt, [Rn, #offset]
寻址模式偏移(基址不变)、前变址(先算地址并更新基址)、后变址(先存后更新基址)
数据大小STR(字,32位),STRH(半字,16位),STRB(字节,8位)
应用场景变量赋值、保存寄存器到栈(函数调用)、向内存填充数据、数据结构操作等

理解STR及其寻址模式是掌握 ARM 汇编内存操作的基础。它与LDR指令一起,构成了寄存器和内存之间数据交换的核心手段。

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

EmotiVoice语音合成引擎的热更新能力实现方式

EmotiVoice语音合成引擎的热更新能力实现方式 在智能语音应用日益普及的今天&#xff0c;用户对TTS&#xff08;文本转语音&#xff09;系统的要求早已超越“能说话”的基本功能。无论是虚拟主播的情绪起伏、客服机器人的语气亲和力&#xff0c;还是有声书中不同角色的音色切换…

作者头像 李华
网站建设 2026/3/18 21:51:59

EmotiVoice开源项目常见问题解答(FAQ)汇总

EmotiVoice开源项目常见问题解答&#xff08;FAQ&#xff09;汇总 在AI语音技术飞速发展的今天&#xff0c;我们不再满足于“能说话”的机器。用户期待的是有情绪、有个性、像真人一样的声音——这正是EmotiVoice诞生的初衷。 这款开源语音合成引擎自发布以来&#xff0c;因其强…

作者头像 李华
网站建设 2026/3/26 6:50:00

低成本实现产品语音提示功能的新路径

低成本实现产品语音提示功能的新路径 在智能硬件日益普及的今天&#xff0c;用户对交互体验的要求早已超越“能用”&#xff0c;转向“好用”和“有温度”。一个简单的语音提示&#xff0c;比如“门已锁好”或“电量即将耗尽”&#xff0c;如果只是机械朗读&#xff0c;很容易被…

作者头像 李华
网站建设 2026/3/18 11:43:05

EmotiVoice语音合成在动物园导览中的趣味动物声音模仿

EmotiVoice语音合成在动物园导览中的趣味动物声音模仿 在现代动物园中&#xff0c;游客不再满足于走马观花式的参观。尤其是儿童群体&#xff0c;他们期待的是一个能“说话”的大象、会“撒娇”的熊猫、以及带着威严嗓音出场的狮子讲解员。传统的预录语音导览早已显得单调乏味&…

作者头像 李华
网站建设 2026/3/28 1:20:18

ipv6网段咋写,一篇给你讲清楚

今天说个小细节&#xff0c;IPv6 网段的写法与 IPv4 有很大不同。详细解释 IPv6 网段的表示方法。&#x1f50d; IPv6 网段表示法基础基本格式&#xff1a;IPv6地址/前缀长度2001:db8:1234::/48• 2001:db8:1234:: - 网络地址• /48 - 前缀长度&#xff08;类似IPv4的掩码&…

作者头像 李华
网站建设 2026/3/19 8:06:02

Kotaemon支持繁体字与简体字自动转换

Kotaemon支持繁体字与简体字自动转换 在构建面向华语用户的智能对话系统时&#xff0c;一个看似基础却常被低估的挑战浮出水面&#xff1a;同一个语言&#xff0c;却因地区差异分裂为两种书写体系——简体中文与繁体中文。 中国大陆用户习惯“信息”、“软件”&#xff0c;而…

作者头像 李华