1. 程式人生 > 其它 >組合語言,ARM Cortex4, 求素數的和

組合語言,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)