ldr
读内存,ldr r0,[r1] 读取地址r1上的数据(4字节),保存到r0中。
str
写内存指令,str r0,[r1] 把r0的值写到地址r1(4字节)。
b
跳转指令,b指令无法实现子程序的返回,只能实现单纯的跳转。
bl(branch and link)
bl xxx 就是跳到xxx去执行,并且把返回地址(下一条指令的地址)保存到lr寄存器中。通常用于调用子程序,可在子程序的尾部添加mov pc,lr 返回。而在跳转到C函数中则不需要把lr赋给pc(是不是可以认为跳转执行C函数完成之后lr的值就自动赋给pc了)。
mov
mov r0,r1 把r1的值赋给r0,r0=r1
mov r0,#0x01 即r0=0x01
mov r0,#0x123456789是一条错误指令,因为对于32位指令,某些位代表mov这条指令,某些位代表r0,剩下不足32位去表示数值,所以需要使用其他指令ldr r0,=0x123456789,它是一条伪指令,会被拆分为几条真正的指令。
add
add r0,r1,#4 即r0=r1+4
add r0,r1,r2 即r0=r1+r2
sub
sub r0,r1,#4 即r0=r1-4
sub r0,r1,r2 即r0=r1-r2
ldm
m是many的简写,意为读内存,写入多个寄存器
stm
把多个寄存器的值写入内存
stmdb
stmdb sp! {fp,ip,lr,pc} 指令含义:db(Decrement Before)表示先减后存。存放位置遵循高编号寄存器存放到高地址,fp、ip等都是寄存器的别名。原本设置了pc值为4096,那么先减4等于4092,4092~ 4095存pc的值,再减4等于4088(这里是以十进制),4088~4091存的是lr,以此类推。sp!的意思是使用最终的sp值,经过上面先减后存之后sp存的值为4080。
ldmia
ldmia sp,{fp,sp,pc} 指令含义:ia(Increment After)表示先存后增,上面stmdb指令执行之后sp的值为4080,把4080~4083的值存到fp,以此类推恢复原本的值。所以,sp的值必须与原来的值一样才能正确恢复原来的值。
mrs
mrs r0 cpsr 含义:r表示寄存器register,s表示状态state,把cpsr读到r0里面。
msr
与mrs作用类比,只不过是对象相反过来。
orr
orr r0,r0,#(1<<12) 表示r0 = r0 | (1<<12)
结合以上几条指令简单看下S3C2440点亮led灯的例子: