ARM基础

arm公司负责设计,下面这些授权厂商负责生产

控制器:

负责对指令译码,并发出为完成每条指令所要执行的各个操作的控制信号

寄存器:

暂存指令、数据和地址

运算器:

执行各种算数和逻辑运算操作的部件,基本操作包括:加减乘除,与或非异或,移位比较和传送等

计算机的组成包括cpu(控制器、寄存器、运算器)、存储器(内存)、总线。

CPU里面有RAM,作用是从flash读入数据。

计算机是数字电路,存储的信息都是二进制

1、数制转换 https://blog.csdn.net/LiuHuan303/article/details/119268460

2、整数的编码https://www.jianshu.com/p/36ec7a047f29

正数的原码、反码、补码

负数的补码为模-该数的绝对值

机器码:包括原码、反码、补码和移码

3、小数的编码

37个寄存器:31个通用寄存器(含pc (程序计数器)),6个状态寄存器,都是32位寄存器

有7种处理器模式:

1)USR10000): 正常用户模式

2)   FIQ(10001):快速中断模式,以处理快速情况,支持高速数据传输或通道处理

3).  IRQ(10010):外部(硬件)中断模式,普通中断处理

4)   SVC(10011):操作系统保护模式(管理模式),即操作系统使用的特权模式(内核),处理软件中断swi reset

5).  abt(101111):数据访问中止模式,用于虚拟存储器和存储器保护

6).  und(11011):未定义终止模式

7).  sys(11111):系统模式,用于运行特权级的操作系统任务(armv4以上版本才有)

N:  1-运算结果为负数, 0-正数或0

Z:  1表示运算结果为0,0:运算结果不为0 。对于cmp指令,1表示比较的两个数相等

C:  https://zhuanlan.zhihu.com/p/634696567.   

V:   

I: 1表示外部(硬件)中断 (IRQ)

F: 1表示快速中断(FIQ)  

T: 1代表thumb状态(16位), 0代表arm状态(32位)

M[4:0]:不同数字代表不同模式

SPSR 

除usr/sys外,SPSR保存异常情况下的CPSR值,方便恢复。

汇编常用指令

mov 赋值

mrs读取状态寄存器中的值复制给通用寄存器, msr 将通用寄存器的值写入状态寄存器

and 与 orr 或

mov r0,r1,LSL#1 r1左移1位赋值给r1

指令是怎么存储的:c语言——汇编语言——机器码存储在flash上

解析:如下图

21-24号位为操作码

28-31 条件位

0-11:源数据位, 0-7是数据位,8-11是移位的位数

void main(void)
{
    int ret=0;
    ret=func1(2);   
    while(1){}	
}	
int  func1(int a)
{
    if(a==2)
        return func2(a);
    else
        return func3(a);  
}
int  func2(int a) 
{    
    return a+3;
} 
int func3(int a)
{    
    return a-1;
} 

用汇编实现上面的c语言代码: 

.text
 b   main  @eset 
 nop
 NOP
 nop
 nop
 nop
 nop
 nop
main: 
  mov r2,#0  @r2 ~ ret
  mov  r0,#2
  bl   func1
main_end:
  b   main_end
		
		
func1:		
  mov  r12,lr
  cmp  r0,#2
  bleq func2
  blne func3
func1_end:
  mov  pc,r12 
	
func2:
  add  r0,#3
func2_end:
  mov  pc,lr 

func3:
  sub  r0,#1
func3_end:
  mov  pc,lr

  .end

用汇编实现延时1s:

.text
 b   main  @eset 
 nop
 NOP
 nop
 nop
 nop
 nop
 nop
main: 
  mov r0,#1
  bl  delay_1s
  mov r1,#2 
main_end:
  b   main_end
  
  
delay_1s:
  ldr  r4,=0x1fffff
delay_loop:  
  cmp  r4,#0
  beq  delay_1s_end
  subne r4,#1
  b   delay_loop
delay_1s_end:
  mov pc,lr
  
  
  .end	

用汇编实现下面的最大公约数代码:

int GCD(int a,int b)
{	 	  
	while(1)
	{
		if(a==b)
			break; 	
		if(a>b){
			a=a-b;
		}else{
		  b=b-a;  	
		}	
	} 		
	return a;	 	   
} 
b   main  @eset 
 nop
 NOP
 nop
 nop
 nop
 nop
 nop
main: 
  mov r0,#9
  mov r1,#15
  bl  gcd
main_end:
  b   main_end
  
gcd:
gcd_loop:
  cmp  r0,r1
  beq  gcd_end
  subgt  r0,r1
  sublt  r1,r0
  b   gcd_loop

gcd_end:
  mov pc,lr
  
  .end	

前索引:r0的内容存储到(r8地址加8  )这个地址

后索引:r0的内容存储到r8这个地址,然后r8的值加8(r8的值本身是一个地址)

//用汇编实现C内容
main()
{
	int i=0;
	const  char buf[]={1,2,3};
	char destBuf[8];
	for(i=0,i<3,i++)
	{
		destBuf[i] = buf[i];
	}
}
.text
	b   main  
	nop
	nop
	nop
	nop
	nop
	nop
	nop
main: 
    mov   r4,#0
    ldr   r7, =buf
	ldr   r8,=desbuf
loop:
	cmp   r4,#3
	beq   main_end
	ldrb  r0,[r7],#1
	strb  r0,[r8],#1
    
	add r4,#1
	b  loop
	
main_end:
    b   main_end
  

buf:
    .byte 1,2,3
		
	.data
		
desbuf:
    .space 8
	.end

 

ARM异常处理

嵌入式系统对实时性要求比较高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值