嵌入式系统练习
嵌入式系统练习
一、ARM cortex M4的寄存器(R0-R15,xPSR)含代码测试
1、 针对通用寄存器的测试
①MOV R0,#666
②MOV R1,#0x666
③MOV R2,#1<<3
⑤ADD R8,R0,R1
⑥SUB R8,R0,R1
⑦SUB R8,R1,R0
① 
② 
③ 
④ 
⑤ 
⑥ 
⑦ 
2、写出以下指令执行后对应的标志位数值
MOVS R0,#-2 ①
MOVS R1,#2 ②
ADDS R2,R0,R1 ③
SUBS R3,R0,R1 ④
SUBS R4,R1,R0 ⑤
CMP R0,R1 ⑥
CMP R1,R0 ⑦
①N=1 Z=0 C=0 V=0 Q=0

②N=0 Z=0 C=0 V=0 Q=0

③N=0 Z=1 C=1 V=0 Q=0

④N=1 Z=0 C=1 V=0 Q=0

⑤N=0 Z=0 C=0 V=0 Q=0

⑥N=1 Z=0 C=1 V=0 Q=0

⑦N=0 Z=0 C=0 V=0 Q=0

二、完成一个简单的启动代码(详细注释)
;最小的启动代码应该包括堆栈、中断向量、代码
stack_size EQU 0x200 ;宏指令,定义堆栈大小
vector_size EQU 0x400 ;定义中断向量表大小,宏定义顶格写
AREA mystack, DATA, READWRITE ;定义堆栈段
;其中mystack为段名 DATA为段的类型属性 READWRITE为段的可读写属性
stack_start ;可以不要
SPACE stack_size
stack_end ;栈顶,一定要要
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY ;定义中断向量,段名最好不要自己取
vectors ;标号顶格写,表示一个地址,编译器可以读到
DCD stack_end ;stack-top ;第一项必须是栈顶指针
DCD code_start ;begin code ;第一句代码,即代码开始的地方
vectors_end
;PRESERVE8 相当于后面的ALIGN=3
;二者中选择一种作为定义属性的方式,表示8字节对齐
AREA mydata, DATA, READWRITE;定义数据段,存放全局数据
data_s
SPACE 4 ;数据区大小
AREA mycode, CODE, READONLY,ALIGN=3 ;定义代码段
code_start
;在这里写指令
B . ;原地循环
END
三、ARM指令
1、R0<--2 R0*12--->R2
code_start
MOV R0,#2
LSL R0,#2 ;R0=4R0
ADD R2,R0,R0,LSL #1 ;R2=4R0+8R0
B .
END
2、测试
char ch =0x80; //编译时刻或运行时刻,为ch分配一个存储器空间 0x2000 1000
int a; //编译时刻或运行时刻,为a分配一个存储器空间 0x2000 1004
a = ch;

code_start
MOV R0,#0x80
LDR R1,=0x20001000
STRB R0,[R1]
LDRSB R2,[R1]
STR R2,[R1,#4]
B .
END
3、R0--2; R0*24-->data1(data1是一个数据段) //把R0×24 放到data1中并在存储器中查看
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start
MOV R0,#2 ;0000 0010 =0x0002
LSL R0,#3 ;8R0=0001 0000 =0x0010
ADD R0,R0,R0,LSL #1 ;8R0+16R0=24R0=0011 0000=0x30
LDR R1,=data_s
STR R0,[R1]
B .
END
四、ARM编程
1、判断a是否是b的倍数,输入:a,b 输出:1(是倍数) 0(不是倍数)
(1)代码(加法实现)
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#7
MOV R1,#3
BL is_Multi
B .
ENDP
is_Multi PROC
PUSH {R2-R12,LR}
MOV R2,R0 ;R2=a
MOV R3,R1 ;R3=t R1=b
MOV R0,#0
loop_s
CMP R2,R1 ;a>=b
BLT loop_end ;LT <,a<b
MOVEQ R0,#1
BEQ loop_end
ADD R1,R1,R3 ;b=b+t
B loop_s
loop_end
POP {R2-R12,PC}
ENDP
END
(2)、测试 (加法)
①a=7,b=3



②a=8,b=2

(3)代码(减法实现)
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#8
MOV R1,#2 ;R1=b
BL is_Multi
B .
ENDP
is_Multi PROC
PUSH {R2-R12,LR}
MOV R2,R0 ;R2=a ,replace R0,R0 will be return value
MOV R0,#0 ;initialize
loop_s
CMP R2,R1 ;a>=b
BLT loop_end ;a<b
MOVEQ R0,#1
BEQ loop_end ;return 1
SUB R2,R2,R1 ;a=a-b
B loop_s
loop_end
POP {R2-R12,PC}
ENDP
END
(4)测试(减法)
①a=7,b=3
②a=8,b=2
四、ARM编程
1、判断一个数x是否为质数
(1)、代码
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#9
BL Is_prime
B .
ENDP
Is_prime PROC
PUSH {R1-R12,LR}
MOV R1,#2;i
MOV R2,R0; R2 = x
loop_prime_s ;for(int i=2;i<x;++i)
CMP R1,R2 ;i x
MOVEQ R0,#1 ; i==x,R0=1
BGE loop_prime_end ;i>=x
;i<x
;if{
MOV R0,R2
BL is_Multi
CMP R0,#1
MOVEQ R0,#0 ;RO==1,x is multi of i,R0=0
BEQ loop_prime_end ;return 0
;}
ADD R1,R1,#1 ;i++
B loop_prime_s ;while
loop_prime_end
POP {R1-R12,PC}
ENDP
is_Multi PROC
PUSH {R1-R12,LR}
MOV R2,R0 ;R2=a ,replace R0,R0 will be return value
MOV R0,#0 ;initialize
loop_multi_s
CMP R2,R1 ;a>=b
BLT loop_multi_end ;a<b
MOVEQ R0,#1
BEQ loop_multi_end ;return 1
SUB R2,R2,R1 ;a=a-b
B loop_multi_s
loop_multi_end
POP {R1-R12,PC}
ENDP
END
(2)、测试
①x=9

②x=11

③x=19

④x=21

2、求100以内的素数和,并保存所有素数到数据段
(1)代码
```
stack_size EQU 0x200
vector_size EQU 0x400
data_size EQU 0X400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE data_size
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
BL sum_prime
B .
ENDP
sum_prime PROC
PUSH {R1-R12,LR}
MOV R5,#0 ;sum
MOV R4,#2 ;start from 2
LDR R6,=data_s
loop_sum_s
CMP R4,#100
BGT loop_sum_end
BL is_prime
CMP R0,#1
ADDEQ R6,R6,#4
STREQ R4,[R6]
ADDEQ R5,R5,R4
ADD R4,R4,#1
B loop_sum_s
loop_sum_end
MOV R0,R5
POP {R1-R12,PC}
ENDP
is_prime PROC
PUSH {R1-R12,LR}
MOV R1,#2;i
MOV R2,R4; R2 = x
loop_prime_s ;for(int i=2;i<x;++i)
CMP R1,R2 ;i x
MOVEQ R0,#1 ; i==x,R0=1
BGE loop_prime_end ;i>=x
;i<x
;if{
BL is_Multi
CMP R0,#1
MOVEQ R0,#0 ;RO==1,x is multi of i,R0=0
BEQ loop_prime_end ;return 0
;}
ADD R1,R1,#1 ;i++
B loop_prime_s ;while
loop_prime_end
POP {R1-R12,PC}
ENDP
is_Multi PROC
PUSH {R1-R12,LR}
MOV R3,R2
MOV R0,#0
loop_multi_s
CMP R3,R1 ;a>=b
BLT loop_multi_end ;a<b
MOVEQ R0,#1
BEQ loop_multi_end ;return 1
SUB R3,R3,R1 ;a=a-b
B loop_multi_s
loop_multi_end
POP {R1-R12,PC}
ENDP
END
(2)测试
3、求1000以内的完数,把个数保存到R0,R1-R12保存求出来的完数
(1)代码
```
stack_size EQU 0x200
vector_size EQU 0x400
data_size EQU 0X400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE data_size
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
BL pf_count
B .
ENDP
pf_count PROC
PUSH{LR}
MOV R4,#1 ;x start from 1
LDR R6,=data_s
MOV R7,#0 ;cnt
loop_cnt_s
CMP R4,#1000
BGT loop_cnt_end
BL is_perfect
CMP R0,#1
ADDEQ R7,R7,#1
STREQ R4,[R6]
ADDEQ R6,R6,#4
ADD R4,R4,#1
B loop_cnt_s
loop_cnt_end
MOV R0,R7
LDR R6,=data_s
LDMIA R6,{R1-R12}
POP{PC}
ENDP
is_perfect PROC
PUSH {R1-R12,LR}
MOV R3,#1 ;i--b
MOV R5,#0 ;sum
loop_perfect_s
CMP R3,R4 ;i:x
BGE loop_perfect_end
BL is_Multi
CMP R0,#1 ;whether x is multi of i
ADDEQ R5,R5,R3
ADD R3,R3,#1
B loop_perfect_s
loop_perfect_end
MOV R0,#0
CMP R5,R4 ;sum:x
MOVEQ R0,#1
POP {R1-R12,PC}
ENDP
is_Multi PROC
PUSH {R1-R12,LR}
MOV R0,#0
loop_multi_s
CMP R4,R3 ;a>=b
BLT loop_multi_end ;a<b
MOVEQ R0,#1 ;a=b,R0=1
BEQ loop_multi_end ;return 1
SUB R4,R4,R3 ;a=a-b
B loop_multi_s
loop_multi_end
POP {R1-R12,PC}
ENDP
END
```
(2)测试

4、判断闰年
输入:x 输出:R0=1,是闰年 R0=0,不是闰年
(1)代码
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#2020
BL is_Leapyear
B .
ENDP
is_Leapyear PROC
PUSH {R1-R12,LR}
MOV R1,#400
MOV R2,R0
MOV R0,#0
BL is_Multi
CMP R0,#1
BEQ leap_true
MOV R1,#4
BL is_Multi ;x%4
CMP R0,#1
BNE leap_false
MOV R1,#100
BL is_Multi ;x%100
CMP R0,#1
BEQ leap_false
leap_true
MOV R0,#1
POP {R1-R12,PC}
leap_false
MOV R0,#0
POP {R1-R12,PC}
ENDP
is_Multi PROC
PUSH {R1-R12,LR}
MOV R3,R2
MOV R0,#0
loop_multi_s
CMP R3,R1 ;a>=b
BLT loop_multi_end ;a<b
MOVEQ R0,#1
BEQ loop_multi_end ;return 1
SUB R3,R3,R1 ;a=a-b
B loop_multi_s
loop_multi_end
POP {R1-R12,PC}
ENDP
END
(2)测试
①2022

②2021

③1978
④2000

5、最近质数
输入:x
输出:如果x是质数,就输出x本身,如果有两个,输出较小的那个
(1)代码
stack_size EQU 0x200
vector_size EQU 0x400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE 4
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#8
BL near_prime
B .
ENDP
near_prime PROC
PUSH{R1-R12,LR}
MOV R2,R0 ;replace
MOV R4,R2
MOV R5,R2
MOV R6,#1 ;j
MOV R0,#0 ;initial
near_s
MOV R7,R2
BL is_prime
CMP R0,#1
MOVEQ R0,R7
BEQ near_end
SUB R4,R2,R6
MOV R7,R4
BL is_prime
CMP R0,#1
MOVEQ R0,R4
BEQ near_end
ADD R5,R2,R6
MOV R7,R5
BL is_prime
CMP R0,#1
MOVEQ R0,R5
BEQ near_end
ADD R6,R6,#1
B near_s
near_end
POP {R1-R12,PC}
ENDP
is_prime PROC
PUSH {R1-R12,LR}
MOV R1,#2 ;i
loop_prime_s ;for(int i=2;i<x;++i)
CMP R1,R7 ;i x
MOVEQ R0,#1 ; i==x,R0=1
BGE loop_prime_end ;i>=x
;i<x
;if{
BL is_Multi
CMP R0,#1
MOVEQ R0,#0 ;RO==1,x is multi of i,R0=0
BEQ loop_prime_end ;return 0
;}
ADD R1,R1,#1 ;i++
B loop_prime_s ;while
loop_prime_end
POP {R1-R12,PC}
ENDP
is_Multi PROC
PUSH {R1-R12,LR}
MOV R3,R7 ;R2=a ,replace R0,R0 will be return value
MOV R0,#0 ;initialize
loop_multi_s
CMP R3,R1 ;a>=b
BLT loop_multi_end ;a<b
MOVEQ R0,#1
BEQ loop_multi_end ;return 1
SUB R3,R3,R1 ;a=a-b
B loop_multi_s
loop_multi_end
POP {R1-R12,PC}
ENDP
END
(2)测试
①x=8
②x=9
③x=20

④x=23

6、水仙花数
(1)代码
①.s
stack_size EQU 0x200
vector_size EQU 0x400
data_size EQU 0X400
; define stack
AREA mystack, DATA, READWRITE
stack_start
SPACE stack_size
stack_end
PRESERVE8
;define vectors
AREA RESET, DATA, READONLY
vectors
DCD stack_end ;stack-top
DCD code_start ;begin code
SPACE vector_size
vectors_end
IMPORT flower
;define data
AREA mydata, DATA, READWRITE
data_s
SPACE data_size
;define code
AREA mycode, CODE, READONLY,ALIGN=3
code_start PROC
MOV R0,#0 ;initial
MOV R1,#100
LDR R2,=data_s
loop_s
CMP R1,#1000
BGE loop_end
BL flower
CMP R0,#0
STRNE R0,[R2]
ADDNE R2,R2,#4
ADD R1,R1,#1
B loop_s
loop_end
ENDP
B .
END
②.c
int flower(int x)
{
int a,b,c,sum=0;
a=x%10;
b=x/10%10;
c=x/100;
sum=a*a*a+b*b*b+c*c*c;
if(sum==x) return 1;
return 0;
}
(2)测试
浙公网安备 33010602011771号