匯編語言實現(xiàn)n以內(nèi)所有素數(shù)之和
這里以求100以內(nèi)素數(shù)和為例,你想求多少以內(nèi)的,將代碼里相應(yīng)數(shù)字改一下就好
思路:把100以內(nèi)所有的質(zhì)數(shù),都保存在一個數(shù)組中。x是不是質(zhì)數(shù) 拿 < x的所有素數(shù)去整除x,即可。其他求素數(shù)方法比如窮舉,開根號之類的效率還是不夠高,打表法是最好的
過程部分:分為1個總過程和3個子過程,3個子過程分別為Is_Multi(求a是否為b的倍數(shù))、Is_Prime(求a是否為質(zhì)數(shù))、sum_prime(找出所有質(zhì)數(shù),存入表,并相加)、總過程即調(diào)用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 ;定義數(shù)據(jù)段,用于存質(zhì)數(shù),可讀寫
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 ?;先認定此數(shù)為質(zhì)數(shù),因此設(shè)為1
SUB R2,#4 ?;當前表地址實際是下一個質(zhì)數(shù)將要存的地址,但是現(xiàn)在要取 ? ? 目前表里面的質(zhì)數(shù),因此將地址減4
_loop_prime
CMP R3,R2 ?;比較當前表地址是否小于起始地址
BGT _loop_prime_end
LDR R4,[R2] ?;取出質(zhì)數(shù)
MOV R1,R4
MOV R0,R5
BL Is_Multi ?;比較現(xiàn)在要判斷的數(shù)是否是取出的質(zhì)數(shù)的倍數(shù),如果是,則 ? ? 這個數(shù)不是質(zhì)數(shù)
CMP R0,#0x1
MOVEQ R6,#0 ?;是倍數(shù),說明不是質(zhì)數(shù),則將R6設(shè)為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以內(nèi)的質(zhì)數(shù)
BGT _loop_sum_prime_end ?;超過100則結(jié)束循環(huán)
MOV R0,R3
MOV R1,R6
BL Is_Prime ?;判斷此時R3的值是否為質(zhì)數(shù)
CMP R0,#1
STREQ R3,[R6] ?;返回值R0為1,說明是質(zhì)數(shù),將R3入表
ADDEQ R6,R6,#4 ?;指向下個地址
ADDEQ R5,R5,R3 ?;將總和加上這個質(zhì)數(shù)
ADD R3,R3,#1
B _loop_sum_prime
_loop_sum_prime_end
MOV R0,R5
POP{R2-R12,PC}
ENDP
END

但是代碼直接復制粘貼過來那個格式無法保留,實際上有些地方要空格,有些地方要頂格寫,因此以下放出截圖給大家參照一下




最后,如果你想求n以內(nèi)的質(zhì)數(shù)之和,你得改一下代碼第2行的prime_size保證空間夠大,還有將代碼76行的CMP R3,#100 ,將100改成n即可
該文章本人原創(chuàng),轉(zhuǎn)載請標注出處