汇编语言,ARM Cortex4, 求素数的和

要求素数(质数)的和,首先就是要找质数,然后将所有的质数循环相加即可。

如何高效地找质数?众所周知,质数的因子只有1和它本身,并且2是最小的质数。

假如现在要求0-100之间的所有质数,那么质数我们从2开始找起,因为已知2是最小的质数。那么如何判断是质数?

循环遍历比这个数小的数,然后看这个数是不是比它小的数的倍数?

这样当然是可以的,不过开销太大,太麻烦。

我们只需用质数来判断质数就可以了,将所有已知质数放在一个数组中,然后用2-100之间的数字来循环判断当前数字是否是数组中的数的倍数。

比如现在面临的数是11,那么质数数组中就有2,3,5,7四个数,只需要分别判断11是否是这四个数的倍数就可以了。如果不是,那么就将11加入到质数数组中,如果是,则进入下一个数。

当然,这要用到一个判断一个数是否是另一个数的倍数的函数,函数如下:

点击查看代码
is_Multi PROC ;判断a是否是b的倍数
	PUSH {R2-R12,LR}
	MOV R2,R0;R2-int a 
	MOV R3,R1;R3-int i=b
	MOV R0,#0; R0<--0, 默认情况下a不是b的倍数
loop_start
	CMP R1,R2;while(b<=a)
	BGT loop_end ;if(b>a) return 0
	MOVEQ R0,#1; if(b==a)return 1;
	BEQ loop_end ;相等,是倍数,则跳出循环
	ADD R1,R1,R3; else b=b+i;不相等,且b仍小于a,则让b继续相加
	B loop_start
loop_end
	POP{R2-R12,PC}
	ENDP

当然,在汇编语言中没有数组,有的是数据段,我们要找100以内的质数,就在数据段定义一个标号data_prime,大小设置为100即可,即400字节,最多存放100个整型变量。

将找到的质数STR 到数组
找质数时,LDR 数组中的数,然后进行比较,一直比较到数组末尾,即LDR的数为0为止。

根据上述思路,编写的求指数代码如下:

点击查看代码
find_Prime PROC
	PUSH{R0-R12,LR}
	LDR R2,=data_prime; 加载存放质数的数组首地址
	MOV R3,#2; int i=2;从最小的素数开始
	STR R3,[R2];先将最小的素数放入数组,以作比较
	LDR R4,=100; 终止循环的条件
loop_primeStart
	LDR R2,=data_prime;因为内循环要遍历数组,每次出内循环后数组索引要置0
	ADD R3,R3,#1;R3=R3+1
	CMP R3,R4; if(i>100)
	BGT loop_primeEnd ; return
inner_loop_prime
	MOV R0,R3
	LDR R1,[R2];引入函数is_Multi的参数
	BL is_Multi
	CMP R0,#1
	BEQ loop_primeStart ;R0为1,则a是某一素数b的倍数,a不是素数
	LDR R1,[R2,#4]!;地址+4,引入数组下一个元素
	CMP R1,#0
	BEQ inner_loop_primeEnd; 为0,说明数组此已经是数组最后一个元素
	BNE inner_loop_prime ; 不为0,说明数组仍未遍历完,此时R2的值即数组地址已经改变,再次循环
inner_loop_primeEnd
	STR R3,[R2];将素数放入数组;(R2此时地址内元素必定为0,不用+4)
	B loop_primeStart
	
loop_primeEnd
	POP{R0-R12,PC}
	ENDP
![image](https://img2022.cnblogs.com/blog/2687990/202203/2687990-20220304125930135-1370910749.png)

下面这个函数用来数据段中(相当于数组)求质数的和
点击查看代码
sum_Prime PROC
	PUSH {R1-R12,LR}
	LDR R3,=data_prime
	MOV R0,#0; sum
loop_sumPrime
	LDR R1,[R3]
	CMP R1,#0;看数组元素是否为0,在此即为空
	BEQ loop_sumPrimeEnd
	ADD R0,R0,R1
	ADD R3,R3,#4
	B loop_sumPrime
loop_sumPrimeEnd
	POP{R1-R12,PC}
	ENDP
![image](https://img2022.cnblogs.com/blog/2687990/202203/2687990-20220304125946488-788679504.png)

posted @ 2022-03-04 13:03  DanielTian  阅读(141)  评论(0)    收藏  举报