Логическая ошибка в простых числах - PullRequest
1 голос
/ 18 августа 2010

Я новичок в ассемблере. Я написал программу для ввода и отображения, является ли число простым или нет.

Вот мой исходный код.

.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.

Редактировать 1: Согласно Даррон , я инициализировал регистр ecx до 1, а затем увеличил ecx до 1, чтобы запустить цикл с 2.

Но проблема в том, что когда я ввожу 9, это показывает, что 9 простое число. Я не знаю, что не так с моей логикой.

Редактировать 2: Я сохраняю свой номер в eax, а затем делю его на ecx и, наконец, проверяю, равен ли ноль в регистре edx.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 18 августа 2010

Вы начинаете с деления на 1. Даже простые числа делятся на один.

3 голосов
/ 20 августа 2010

Я решил свою проблему, используя gdb (GNU Project Debugger) .

В моей логике я делил число до заданного числа, например, если я ввел 15, логика делит число до 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
...