汇编语言实现n以内所有素数之和
这里以求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即可
该文章本人原创,转载请标注出处