欢迎光临散文网 会员登陆 & 注册

汇编语言实现n以内所有素数之和

2023-03-21 01:33 作者:甜甜圈烤火  | 我要投稿

这里以求100以内素数和为例,你想求多少以内的,将代码里相应数字改一下就好

思路:把100以内所有的质数,都保存在一个数组中。x是不是质数 拿 < x的所有素数去整除x,即可。其他求素数方法比如穷举,开根号之类的效率还是不够高,打表法是最好的

过程部分:分为1个总过程和3个子过程,3个子过程分别为Is_Multi(求a是否为b的倍数)、Is_Prime(求a是否为质数)、sum_prime(找出所有质数,存入表,并相加)、总过程即调用sum_prime

代码部分:

stack_size EQU 0x200 ;定义宏

prime_size EQU 0x400

AREA mystack, NOINIT, READWRITE ;定义自己的栈,不用初始化,可读写

stack_start

SPACE stack_size

stack_end

 

AREA myprime,DATA,READWRITE ;定义数据段用于存质数,可读写

prime_start

SPACE prime_size

prime_end

 

AREA RESET, DATA, READONLY  ;定义中断向量表

vectors

DCD  stack_end  ;stack-top

DCD  text_code ;begin code

vectors_end  

AREA mycode, CODE, READONLY,ALIGN=3  ;定义代码段

text_code PROC

BL sum_prime

B .

ENDP


Is_Multi PROC

PUSH{R2-R12,LR}

MOV R4,R0

MOV R3,R1

MOV R0,#0

_loop

CMP R4,R1

BLT _loop_end ;a<b

MOVEQ R0,#1  ;a==b

BEQ _loop_end

ADD R1,R3  

B _loop

_loop_end

POP {R2-R12,PC}

ENDP

 

Is_Prime PROC

PUSH {R2-R6,LR}

MOV R5,R0

MOV R2,R1  ;将当前表的地址存到R2

LDR R3,=prime_start  ;将表的起始地址存到R3

MOV R6,#1  ;先认定此数为质数,因此设为1

SUB R2,#4  ;当前表地址实际是下一个质数将要存的地址,但是现在要取     目前表里面的质数,因此将地址减4

_loop_prime

CMP R3,R2  ;比较当前表地址是否小于起始地址

BGT _loop_prime_end

LDR R4,[R2]  ;取出质数

MOV R1,R4

MOV R0,R5

BL Is_Multi  ;比较现在要判断的数是否是取出的质数的倍数,如果是,则     这个数不是质数

CMP R0,#0x1

MOVEQ R6,#0  ;是倍数,说明不是质数,则将R6设为0并返回

BEQ _loop_prime_end

SUB R2,#4

B _loop_prime

_loop_prime_end

MOV R0,R6

POP{R2-R6,PC}

ENDP


sum_prime PROC

PUSH{R2-R12,LR}

MOV R0,#0

MOV R1,#2

MOV R4,#3

MOV R5,#2

MOV R3,R4

MOV R7,#0

LDR R6,=prime_start

STR R1,[R6]  ;先将2存进去

ADD R6,#4  ;指向下一个地址

_loop_sum_prime

CMP R3,#100  ;求100以内的质数

BGT _loop_sum_prime_end  ;超过100则结束循环

MOV R0,R3

MOV R1,R6

BL Is_Prime  ;判断此时R3的值是否为质数

CMP R0,#1

STREQ R3,[R6]  ;返回值R0为1,说明是质数,将R3入表

ADDEQ R6,R6,#4  ;指向下个地址

ADDEQ R5,R5,R3  ;将总和加上这个质数

ADD R3,R3,#1

B _loop_sum_prime


_loop_sum_prime_end

MOV R0,R5

POP{R2-R12,PC}

ENDP

END


但是代码直接复制粘贴过来那个格式无法保留,实际上有些地方要空格,有些地方要顶格写,因此以下放出截图给大家参照一下

最终结果

最后,如果你想求n以内的质数之和,你得改一下代码第2行的prime_size保证空间够大,还有将代码76行的CMP R3,#100 ,将100改成n即可


该文章本人原创,转载请标注出处


汇编语言实现n以内所有素数之和的评论 (共 条)

分享到微博请遵守国家法律