您的位置:首页 > 其它

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

2017-09-03 10:40 369 查看
每条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


 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: