简体   繁体   中英

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?

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.

当您在k = k + 1处增加k时,会忘记清除edx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM