2010-08-18 34 views
1

我是新來的彙編語言。我編寫了一個程序,用於接受輸入,然後顯示數字是否爲素數。素數中的邏輯錯誤

這是我的源代碼。

.intel_syntax noprefix 

.include "console.i" 


.data 

     Num: .long 0 

.text 

     ask: .asciz "Enter a +ve number : " 
     ansp: .asciz " is prime." 
     ans: .asciz " is not prime." 

_entry: 

     Prompt ask 
     GetInt Num 

     mov eax,Num # store Number in eax 
     #mov ecx,0 # Reset ecx to 0 
     mov ecx,0 # Reset ecx t0 2 for dividing. 
     cdq 

1:  inc ecx  # increment ecx 
     mov ebx,eax #backup eax 
     Div ecx  #Divide eax by ecx 

     cmp edx,0  #if remainder is zero num is not prime 
     je 2f 
     mov edx,0  #reset edx to 0 
     mov eax,ebx #reset eax to Num 

     cmp eax,ecx if ecx is less than number. 
     jl 1b 


     #Prime 
     PutInt Num 
     Prompt ansp 
     jmp 3f 

2:  #Not Prime 
     PutInt Num 
     Prompt ans 

3:  PutEol 
     ret 

.global _entry 

.end 

當我運行程序時,它總是顯示它不是素數。

例如,如果我輸入7,它顯示7不是素數

我正在使用Intel x86架構,並在Ubuntu上進行devloping。

編輯1:根據Darron,我initalized ECX寄存器爲1,然後ECX遞增1,使其開始從2

環路但問題是,當我進入9它顯示我9是素數。我不知道我的邏輯有什麼問題。

編輯2:我將我的號碼存儲在eax中,然後我用ecx除它,然後最後檢查edx寄存器中的reaminder是否爲零。

謝謝。

+0

這個'mov ebx,eax'在你的'Div ecx'之前有什麼意義? – NullUserException 2010-08-18 11:59:37

+0

如果您需要任何calarification,請告訴我。 – Searock 2010-08-18 13:14:59

+2

是不是你的第一師除1? – abc 2010-08-18 13:18:36

回答

3

我已經使用gdb(GNU Project Debugger)解決了我的問題。例如,如果我輸入15,邏輯將數字除以15,但對於素數,我們必須除以數字-1即(15- 1)。

這是我更新的循環塊。

1:  inc ecx 
     mov eax,ebx 
     Div ecx 

     cmp edx,r 
     je 2f 

     mov edx,0 
     mov eax,ebx 
     Sub eax,1 
     cmp ecx,eax 
     jl 1b 
8

你開始除以1即使素數可以被1整除。

+0

哦,有時候我真的很愚蠢。大學明天我會試一試。 – Searock 2010-08-18 16:38:19

+0

我試過你的建議,並從2開始ecx。但是當我輸入9或說21它顯示數字是素數。你能幫我理解邏輯嗎? – Searock 2010-08-19 04:59:01