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异常处理
嵌入式系统对实时性要求比较高