每条arm指令都会操作寄存器,寄存器就类似于c语言中的变量,r0~12通用寄存器
1:mov指令
mov r0,#100 //r0=100 常量整数只有12位来存储
mov r0,r1 //r0=r1
mvn r0,#100 //r0=~100
mvn r0,r1 //r0=~r1
2:使用伪指令(编译器会预处理为CPU认识的指令)ldr , ldrb进行非法立即数赋值
ldr r0, =0x1234 //只有这条伪指令前面有个=,就类似于c语言的赋值=
ldrb r1 , [r0] //只读8位数据
3:地址访问指令ldr , str (ldrb , strb 只操作8位)
ldr r0 , [r1] //r0 = *r1
str r0 , [r1] //*r1 = r0
ldr r0 , [r1] , #4 //r0 = *r1 ,r1+=4
ldr r0 , [r1 , #4] //r0 = *(r1+=4)
ldr r0 , [r1 , #4]! //r0 = *(r1+=4) r1+=4 //加了!就会修改地址值,类似于c语言的i++
ldr r0 , [r1 , #-4] //r0 = *(r1-=4)
ldr r0 , [r1 , #-4]! //r0 = *(r1-4) r1-=4
strb r1 , [r0] //只修改[r0]中的8位数据
4:位操作,运算操作
and r0 , #0xff //r0 &= 0xff
and r0 , r1 //r0 &= r1
orr r0 , #0xff //r0 |= 0xff
orr r0 , r1 //r0 &= r1
eor r0 , r1 , #0xff //r0 = r1 ^ 0xff //异或注意立即数只能出现在最后一个操作数,且最多只能有一个
bic r0 , #0xff //r0 &= ~0xff
add r0 , r1 , r2 //r0 = r1 + r2
sub r0 , #4 //r0-=4
5:逻辑左右移位操作lsl lsr
mov r0 , r0 , lsr #4 //r0 >>= 4
程序实例:
//转载请注明原文地址:http://blog.csdn.net/oyhb_1992/article/details/77816324
#define GPM4CON 0X110002E0
#define GPM4DAT 0X110002E4
.global _start
_start:
//GPM4_0~3设为输出
//GPM4CON = (GPM4CON & ~0XFFFF) | 0X1111
ldr r0 , =GPM4CON
ldr r1 , [r0]
bic r1 , #0xff
bic r1 , #0xff00 //0xffff 0x1111都是非法立即数,两种方法,拆开立即数或用伪指令
ldr r2 , #0x1111
orr r1 , r2
str r1 , [r0]
//点亮led
//GPM4DAT = (GPM4DAT & ~0Xf) | (stat & 0xf)
ldr r0 , =GPM4DAT
ldrb r1 , [r0]
bic r1 , 0xf
orr r1 , #0b0101 //点灯
strb r1 , [r0]
loop
b loop