汇编语言,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
将找到的质数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

点击查看代码
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


浙公网安备 33010602011771号