arm汇编—str,mov等指令

本文深入探讨了ARM汇编语言中的STR和MOV指令的使用方法及特性,包括指令格式、参数作用、操作过程和实际示例。详细解释了如何通过这些指令在程序设计中实现数据的存储与移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STR指令的格式为:
STR{条件}  源寄存器,<存储器地址>
STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
用,寻址方式灵活多样,使用方式可参考指令LDR。

指令示例:
STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。”

str     r1, [r0]                       ;将r1寄存器的值,传送到地址值为r0的(存储器)内存中


MOV 指令的基本格式如下:
        movx source, destination
   source 和 destination 的值可以是内存地址,存储在内存中的数据值,指令语句中定义的数据值,或者寄存器。

ldr:
当第二个操作数前面没有“=”时,表示内存访问指令,从内存中读取4Byte数据到寄存器,语法格式如下:
ldr{条件} 目的寄存器, 存储器地址
如果第二个操作数前面有“=”,表示大范围地址读取伪指令,用于加载32位的立即数或一个地址到指定寄存器,语法格式如下:
ldr 目的寄存器, =32位立即数/地址

adrl r2, mem_cfg_val

adrl是中等范围地址读取伪指令,将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,在汇编编译器编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。这条代码会替换为:

30000050: e28f2018  add r2, pc, #24 ; 0x18

30000054: e1a00000  nop (mov r0,r0)

adrl伪指令格式:

adrl{cond}   register, expr

地址表达式expr的取值范围:

当地址值是字节对齐时,其取指范围为: -64K64K

当地址值是字对齐时,其取指范围为: -256K256K

nop

空操作伪指令,在汇编是替换成ARM中的空操作,例如mov r0, r0

cmp

比较指令,格式如下:

cmp{条件操作数1, 操作数2

用与将一个寄存器的内容和另一寄存器的内容或立即数进行比较,然后更新CPSR中条件标志位的值,标志位表示操作数1和操作数2的关系(大于、小于、相等)。

bne 1b

b(跳转指令)+ne(条件:不相等),如果CPSRZ位为0(不相等),就跳转到后面的1标号处。

b表示向后搜索,已经执行过的代码为‘后’;

f表示向前搜索,还未执行的代码为‘前’。

mov  pc, lr

从子程序返回。lr为子程序链接寄存器(r14),当执行bl子程序调用指令时,lr会备份pc(程序计数器r15)。

.align

指定对齐方式,gnu汇编命令都以一个点开头。

.equ

赋值命令,格式如下:

.equ symbol, expression

设置symbol的值为expression

.long

定义一个4Byte的数据。




<think>我们正在讨论ARM汇编中的STR指令STR指令用于将数据从寄存器存储到内存中。根据引用[3],我们有一些关于ARM指令格式的通用知识,但引用中没有直接给出STR指令的示例。因此,我将根据ARM汇编的一般知识来回答。STR指令的基本格式为: STR{条件}源寄存器,[基址寄存器,偏移量] 其中: -{条件}:可选的条件码,如EQ、NE等。 -源寄存器:要存储到内存中的数据的寄存器。- [基址寄存器,偏移量]:内存地址,由基址寄存器加上偏移量构成。偏移量可以是一个立即数,也可以是另一个寄存器(可选的移位操作)。 STR指令有多种寻址模式,例如: 1.立即数偏移:STR R1, [R0, #4];将R1的值存储到R0+4的内存地址2.寄存器偏移:STR R1,[R0,R2];将R1的值存储到R0+R2的内存地址3.带移位的寄存器偏移:STR R1,[R0,R2, LSL #2];将R1的值存储到R0+(R2<<2)的内存地址4.前变址:STR R1,[R0,#4]!;将R1的值存储到R0+4的内存地址,然后R0=R0+45.后变址:STRR1, [R0], #4;将R1的值存储到R0指向的内存地址,然后R0=R0+4此外,STR指令还可以存储不同大小的数据: -STR:存储32位字(Word) -STRB:存储8位字节(Byte)- STRH:存储16位半字(Halfword) 现在,我们来看一些具体的示例。 示例1:将寄存器R1的值存储到R0指向的内存地址(无偏移)STR R1,[R0]示例2:将寄存器R1的值存储到R0+0x10的内存地址STR R1,[R0,#0x10] 示例3:使用前变址模式,将R1存储到R0+0x10,然后更新R0为R0+0x10STR R1,[R0,#0x10]!示例4:使用后变址模式,将R1存储到R0指向的地址,然后更新R0为R0+0x10STRR1, [R0], #0x10示例5:存储字节(使用STRB)STRB R1,[R0];将R1的最低8位存储到R0指向的地址示例6:存储半字(使用STRH)STRH R1,[R0];将R1的最低16位存储到R0指向的地址注意:在存储字节和半字时,要注意内存地址的对齐问题(半字地址通常需要2字节对齐,字地址需要4字节对齐),但ARM通常支持非对齐访问,具体取决于架构版本和配置。 另外,STR指令还可以与条件执行结合使用。例如,只有在相等条件(EQ)下才执行存储:STREQR1, [R0] 引用[2]提到ARM有通用寄存器R0-R15,其中R0-R14是通用寄存器,R15是程序计数器(PC)。在存储数据时,我们通常不会直接使用PC作为基址寄存器,除非有特殊需求。 引用[1]提到ARM架构支持32位及64位地址空间,因此STR指令在32位ARM和64位ARM(AArch64)中有所不同。这里我们主要讨论32位ARM(AArch32)中的STR指令。 在AArch64中,STR指令的语法有所不同,例如:STR W1, [X0];将32位寄存器W1的值存储到X0指向的地址STR X1,[X0];将64位寄存器X1的值存储到X0指向的地址但根据用户的问题,我假设用户询问的是32位ARM汇编。最后,请注意,STR指令不会改变源寄存器的值,只会改变内存内容。 相关问题: 1. STR指令和LDR指令有什么区别? 2. ARM汇编中,如何实现数组的存储操作? 3. STR指令在堆栈操作中如何使用? 4.在ARM汇编中,如何存储双字(64位)数据? 5. STR指令支持的条件码有哪些?</think>### ARM汇编STR指令详解 STR(Store Register)指令用于将寄存器中的数据存储到内存中,是ARM汇编中最基础的内存写入指令。其核心功能是将**寄存器值写入内存地址**,支持多种寻址模式和数据类型。 #### 指令基本格式 ```armasm STR{条件}{类型} 源寄存器, [基址寄存器, 偏移量] ``` - **条件**:可选条件码(如EQ/NE/GT等) - **类型**:数据类型标识(缺省为32位字,B表示字节,H表示半字) - **源寄存器**:提供数据的寄存器(如R0-R12) - **基址寄存器**:内存地址基址(如SP/R11) - **偏移量**:立即数或寄存器(可带移位操作) #### 寻址模式与示例 1. **立即数偏移** ```armasm STR R1, [R0, #4] @ 存储R1到地址(R0+4) ``` 2. **寄存器偏移** ```armasm STR R2, [R3, R4] @ 存储R2到地址(R3+R4) ``` 3. **带移位的寄存器偏移** ```armasm STR R5, [R6, R7, LSL #2] @ 存储R5到地址(R6 + R7<<2) ``` 4. **前变址(先更新地址后存储)** ```armasm STR R8, [R9, #8]! @ R9=R9+8后存储R8到[R9] ``` 5. **后变址(先存储后更新地址)** ```armasm STR R10, [R11], #-4 @ 存储R10到[R11],然后R11=R11-4 ``` #### 数据类型扩展 | 指令 | 数据类型 | 示例 | |--------|----------|--------------------------| | STR | 32位字 | `STR R0, [SP]` | | STRB | 8位字节 | `STRB R1, [R2]` | | STRH | 16位半字 | `STRH R3, [R4, #2]` | | STRD | 64位双字 | `STRD R6, R7, [R8]` | #### 实际应用场景 1. **函数栈帧保存** ```armasm PUSH {R4-R6} @ 等效于: STR R6, [SP, #-4]! @ 先SP=SP-4 STR R5, [SP, #-4]! @ 再存储R5 STR R4, [SP, #-4]! @ 最后存储R4 ``` 2. **数组元素写入** ```armasm MOV R0, #0x1000 @ 数组基址 MOV R1, #10 @ 数据 STR R1, [R0, #4] @ 写入array[1](地址偏移4字节) ``` 3. **结构体成员赋值** ```armasm LDR R2, =person @ 结构体基址 MOV R3, #25 @ 年龄值 STRB R3, [R2, #1] @ 存储到age成员(偏移1字节) ``` #### 关键注意事项 1. **地址对齐**:字操作需4字节对齐(否则触发alignment fault),半字需2字节对齐 2. **字节序**:ARM默认小端序(Little-Endian),低位字节存低地址 3. **特权访问**:用户模式不可访问系统内存区域(需切换模式) 4. **互斥访问**:多核场景需配合`STREX`指令实现原子存储 > 引用说明:ARM的通用寄存器结构[^2]和指令格式规范[^3]是理解STR指令的基础,其精简指令集设计[^1]使内存操作具有高度灵活性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值