目录
- 1、读内存和写内存ldr,str
- 2、算数运算指令mov,add,sub
- 3、跳转指令b、bl
- 4、比较和条件执行
- 5、cpsr读写指令mrs,msr
- 6、cp15协处理器读写mrc,mcr
- 6、连续赋值
- 7、^的作用
- 8、标志申明
1、读内存和写内存ldr,str
ldr r0, [r1] @读内存,r0等于r1所指向地址的值,相当于C语言r0 = *r1;
str r0, [r1] @写内存,把r0的值存放到r1所指向的地址中,相当于C语言*r1 = r0
ldr r1, [r2, #4] @基址变址寻址,相当于C语言r1=*(r2+4);
ldr r0, =0x12345678 @伪指令,编译最终拆分为几条真正的arm指令,最后结果是r0 = 0x12345678;
2、算数运算指令mov,add,sub
mov r0, r1 //赋值语句,相当于r0=r1;
mov r0, #0x100 //r0=0x100
add r0, r1, #4 //加法,相当于r0=r1+4
sub r0, r1, r2 //减法,相当于r0=r1-r2
3、跳转指令b、bl
b flag //跳转到flag标签出,相当于C语言的goto flag; 这个标签也可以是一个函数
b . //跳转到当前位置,相当于C语言的while(1);死循环
bl main //跳转到main函数执行,main函数结束后会返回到当前位置继续往下执行
4、比较和条件执行
cmp r1,r2 //比较r0和r1,比较结果直接影响标志位
beq flag //上面比较结果如果相等,则跳转到flag
moveq r3, r4 //上面比较结果相等就执行mov r3, r4 相当于C语言if(eq) { r3 = r4; }
movne r3, r4 //上面比较结果不相等就执行mov r3, r4 相当于C语言if(!eq) { r3 = r4; }
5、cpsr读写指令mrs,msr
msr cpsr, r0 @cpsr = r0,mrs用来读psr,msr用来写
msr cpsr_c, #0xd3 @只操作cpsr模式位
6、cp15协处理器读写mrc,mcr
mrc p15,0,r0,c1,c0,0 //读协处理器
mcr p15,0,r0,c1,c0,0 //写协处理器,设置CPU工作于异步模式
6、连续赋值
ldmia r0, {r2-r3} @r2到r3=*(r0++),r0的值不会改变
ldmia r0!, {r2-r3} @r2到r3=*(r0++),r0等于运算完 最后的地址
7、^的作用
ldmfd sp!, {r0 - r6, pc}^ @在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。
8、标志申明
.global _start //将_start申明为全局的,可以被其他文件调用
_start: