CPU可以直接访问R0~R15寄存器,但是对于类似GPFCON、GPFDAT等寄存器需以地址访问。
常用汇编代码:
1、LDR(load)
:读内存;
如:LDR R0,[R1];
假设R1的值是x,读取地址x上的数据(4字节),保存到R0中。
2、STR(store)
:写内存命令;
如:STR R0,[R1];
假设R1的值是x,把R0的值写到地址x(4字节)。
3、B
:跳转;
4、MOV(move)
:赋值;
如:MOV R0,R1 ;
把R1的值赋给R0,R0=R1。
若MOV R0,#0x100,即R0=0x100。
5、LDR R0,=0x12345678
伪指令,它会被拆分为几条真正的RAM指令。
6、
add
r0,r1,#4;表示:r0=r1+4。
sub
r0,r1,#4;表示:r0=r1+4。
sub r0,r1,r2;表示:r0=r1-r2;
7、BL(branch and Link)
:
bl xxx —>a、跳到xxx; b、把返回地址(下一条指令的地址)保存在lr寄存器中。
8、ldm(m:many)
:读内存,写入多个寄存器。
stm(m:many)
:把多个寄存器的值写入内存。
其中,ldmia(先读后增),stmdb(先减后存)
分别表示:
ia:过后增加(Increment After);
db:预先减少(Decrement Before)。【常用】
例1:stmdb sp!,(fp,ip,lr,pc)【规则:高编号寄存器存在高地址】
注:stmdb(先减后存)
其中,fp(r11),ip(r12),lr(r14),pc(r15)。
sp!表示sp=最终的被修改的sp值=4080.
解释:假设sp=4096,即最高位。
I、先减:sp’=sp-4=4092;
后存:4092~4095存放pc(program counter)的值。
II、先减:sp’=sp-4=4092-4=4088;
后存:4088~4091存放lr的值。
~~
最终为4080开始。
如图:
例2、ldmia sp,(fp,sp,pc)
【规则:高编号寄存器存在高地址】
注:ldmia(先读后增)
I、先读:fp=4080~4083的值=原来的fp
后增:sp’=sp+4=4084。
II、先读:sp=4084~4087的值=原来保存的ip。
后增:sp’=sp+4=4088。
III、先读:pc=4088~4091的值=原来保存的lr。
后增:sp’=4088+4=4092。
其中,sp不加!表示sp修改的值/地址不存入sp中。