快捷搜索: 王者荣耀 脱发

arm汇编—str,mov等指令

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的取值范围:

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

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

nop:

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

cmp:

比较指令,格式如下:

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

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

bne 1b:

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

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

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

mov pc, lr

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

.align

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

.equ

赋值命令,格式如下:

.equ symbol, expression

设置symbol的值为expression。

.long

定义一个4Byte的数据。




经验分享 程序员 微信小程序 职场和发展