DSP

ARM指令集 mov指令,ldr=伪指令,地址访问指令ldr,str,位运算指令and,or

2019-07-13 16:00发布

每条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