Linux 素数中的逻辑错误

Linux 素数中的逻辑错误,linux,assembly,x86,Linux,Assembly,X86,我不熟悉汇编语言。我已经编写了一个程序,用于获取输入,然后显示数字是否为素数 这是我的源代码 .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 pr

我不熟悉汇编语言。我已经编写了一个程序,用于获取输入,然后显示数字是否为素数

这是我的源代码

.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不是素数

我正在使用英特尔x86架构,并在Ubuntu上开发它

编辑1:根据,我已将ecx寄存器初始化为1,然后将ecx递增为1,以便它从2开始循环

但问题是当我输入9时,它显示9是素数。我不知道我的逻辑出了什么问题

编辑2:我将我的号码存储在eax中,然后将其除以ecx,最后检查edx寄存器中的reaminder是否为零


谢谢。

首先除以1。偶数素数可以被1整除。

你从除以1开始。即使是素数也可以被1整除。

我已经用

在我的逻辑中,我将数字除以给定的数字,例如,如果我输入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

我已经用计算机解决了我的问题

在我的逻辑中,我将数字除以给定的数字,例如,如果我输入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

在你的
Div ecx
之前,这个
mov ebx,eax有什么意义?如果你需要任何calarification,请告诉我。你的第一个分区不是被1除掉吗?在你的
Div ecx
之前,这个
mov ebx,eax有什么意义?如果你需要任何calarification,请告诉我。你的第一个分区不是被1除掉吗?哦,有时候我真的很笨。我将在明天的大学里尝试一下。我已经尝试了你的建议,并从2月2日开始使用ecx。但当我输入9或者说21时,它表明这个数字是素数。你能帮我解释一下逻辑吗?哦,我有时候真的很笨。我将在明天的大学里尝试一下。我已经尝试了你的建议,并从2月2日开始使用ecx。但当我输入9或者说21时,它表明这个数字是素数。你能帮我解释一下逻辑吗?你只需要检查小于等于
sqrt(n)
的除数。有关避免实际执行sqrt或乘法、在(n/c>c)
时循环
的好技巧,请参阅。i、 e.将商(与余数一起)与除数进行比较作为循环条件。您只需检查小于等于
sqrt(n)
的除数。有关避免实际执行sqrt或乘法、在(n/c>c)
时循环
的好技巧,请参阅。i、 将商(与余数一起)与除数进行比较,作为循环条件。