在学习汇编的时候,我们常常会被要去记忆各种各样的指令集所烦恼,其实在开发过程中,我们需要使用的指令就那么几条,下面是我们在使用中的积累:
一、常用汇编指令
1. b, bl (相对跳转指令)
2. mov (数据传输, ldr地址读取伪指令)
<span style="font-family:SimSun;">mov r1, r2 ;将r2里面的值复制到r1中
mov r1, #4096 ;常数必须用立即数表示</span>
当不知道数是否是"立即数"来表示时,可以使用ldr来赋值。ldr是伪指令, 由编译器会把它扩展成真正的指令。
如果是立即数用mov指令替换,否则 编译时将改常数保存在某个位置,使用内存读取指令把它读出来。
ldr 本意为大范围的地址读取伪指令
<span style="font-family:SimSun;"> ldr r1, =4096 ; 把常量赋给寄存器
ldr r2, =label ; 获取代码的绝对地址
label:
...</span>
movs : 数据传输,并且影响z条件标志位,如果目标寄存器为0,则z条件标志位为1,
接下来beq就成立,如下:
<span style="font-family:SimSun;"> movs r10, r5 ; invalid processor (r5=0)?
beq error_p ; yes, error 'p'
error_p:
...
</span>
3.ldr, str, stm, ldm
3.1 ldr, str
ldr的第二个参数前面是"="时,表示伪指令,否则为内存访问指令
<span style="font-family:SimSun;">ldr r0, [r1] //从r1中的存储器地址处读取一个字,然后放入到r0中
str r0, [r1] //把r0的值写入寄存器r1所指向的地址中。</span>
3.2 stm ldm(多寄存器加载/存储指令)
‘!’ : 表示指令执行后寄存器被更新。
stmia r0!, {r2-r7} //将r2-r7的数据存储到r0指向的地址,r0值更新
ldmia r0!, {r2-r7} //加载r0指向的地址上的多字数据,保存到r2-r7中,r0的值更新。
IA 执行后增加 (increase after), 这时对应的{r2-r7},赋值的顺序是r2~r7
IB 执行前增加 (increase before)
DA 执行后减少 (decrease after), 这时对应的{r2-r7}, 赋值的顺序是r7-r2
DB 执行前减少 (decrease before)
3.3 小结
ldm ldr 都是往寄存器里面load,ldm是内存往寄存器组,ldr是寄存器往寄存器。
stm str 都是