ARM指令集 mov指令,ldr=伪指令,地址访问指令ldr,str,位运算指令and,orr,eor,bic,逻辑位移指令lsl,lsr

每条arm指令都会操作寄存器,寄存器就类似于c语言中的变量,r0~12通用寄存器

1mov指令

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





 

 

 

 

 

 

 

 

你可能感兴趣的:(裸机)