嵌入式系统练习
嵌入式系统练习
一、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
? (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
(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=b
BLT loop_multi_end ;a
(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=b
BLT loop_multi_end ;a
? (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
? (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
(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=b
BLT loop_multi_end ;a
(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)测试
