組合語言,ARM Cortex4, 求素數的和
阿新 • • 發佈:2022-03-04
要求素數(質數)的和,首先就是要找質數,然後將所有的質數迴圈相加即可。
如何高效地找質數?眾所周知,質數的因子只有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 ![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)