如果加上!,表明先根据寻址规则修改寄存器,然后根据寄存器中的值访问内存;如果不加!,表示直接根据寻址规则访问内存。

看个例子

ldmia r0, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值不变。
ldmia r0!, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值变化(为r3内容的地址)。

感叹号的作用就是r0的值在ldm过程中发生的增加或者减小最后写会到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}  (操作了八个寄存器)
ldmfd sp!, {r0-r6, pc}^ (此项操作实际操作了9个寄存器,spsr->cpsr)
^:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用在异常返回的时候。

转载请注明转自: 听风 , 本文固定链接: Arm汇编中!和^的作用