嵌入式系统练习


嵌入式系统练习

一、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)测试

相关