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
程序实例:
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
相关文章推荐
- arm 汇编指令:内存访问方式 、STR 、LDR 指令
- 内存访问指令:ldr、str、ldm、stm
- 5. 位操作指令 AND,ORR, TST,BIC
- arm汇编:ldr,str,ldm,stm,伪指令ldr
- HCS12X–数据访问(如何在CodeWarrior中转换逻辑地址与全局地址)
- ldr与adr指令、相对地址与绝对地址的理解
- LDR/STR指令学习
- 逻辑指令BIC的用法
- ARM伪指令之地址读取:ADR/ADRL/LDR
- LDR,STR指令的用法
- Win32 汇编 - 逻辑运算指令: AND、OR、XOR、NOT、TEST
- ARM LDR/STR, LDM/STM 指令
- 3. 加载/存储指令,LDR,STR
- 两个进程访问同样的逻辑地址物理地址为何不同
- ldr与adr指令、相对地址与绝对地址的理解
- arm汇编编写countnum加1的实现(LDR STR ADD 指令)
- arm汇编ldr,str,b,bl指令
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
- LDR、STR指令
- 学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST