user2877117
user2877117

Reputation:

Printing Prime Numbers in Assembly

I'm trying to print prime numbers from 1-100 in assembly, but not only is my code printing out extra numbers, but also excluding some prime numbers.

Here is my main procedure:

mov min, 1

loopStart:
  inc min                    ; min++
  mov eax, min
  cmp eax, max               ; compare 2 and 100
  je  next                   ; jump unless 2 < 100

  call isPrime               ; check if prime
  cmp ecx, 0
  jne loopStart 
push eax
  call printPrime            ; print the prime numbers
pop eax
  jmp loopStart

  next:                      ; once max is 100

  push 0                          
  call ExitProcess

And my isPrime is:

mov prime, 0                 ; set as true
mov ecx, prime                  
mov k, 2                     ; reset k 

mov edx, 0                   ; clear edx
div num                      ; n/2
mov edx, 0                   ; clear edx again

start:
cmp ecx, 0                   ; while prime
jne E                        ; if prime isnt true

cmp eax, k                   ; k<=n/2
jl E

mov eax, min
div k
cmp edx, 0                   ; check for remainder
jne kAdd

mov prime, 1                 ; set as false
jmp E

kAdd:
inc k
jmp start

E:
mov ecx, prime
mov eax, min

ret
isPrime endp

It prints out: 2 3 5 7 13 15 19 21 25 31 33 37 39 43 49 51 55 57 61 63 67 73 75 79 81 85 91 93 97 99

Is the fact that most of the extra numbers are divisible by 3, 5, and 7 (which are all prime numbers) have to do with something?

Upvotes: 0

Views: 12932

Answers (2)

Gilchrist
Gilchrist

Reputation: 87

You forget to clear edx when you increment k at k = k + 1

Upvotes: 0

Michael
Michael

Reputation: 58467

You're not properly resetting EDX inside the loop in isPrime. That is, before div k you need to put a mov edx,0 or xor edx,edx.

Also, I'm not sure where num comes from in div num at the beginning of the function(?). The comment says that you're dividing by 2, so did you mean div k?

And there's some unnecessary code in your program. Like this check:

cmp ecx, 0                   ; while prime
jne E                        ; if prime isnt true

If you look at the rest of the code it should become clear that ECX never will have any other value than zero at that point.

Upvotes: 1

Related Questions