include 'irvine 32'

org 100h ; set location counter to 100h

jmp CodeStart

DataStart:

max dw " "

space db " ", 0

CodeStart:

mov bx, 1

call IsPrime

cmp dx, 0

LoopStart:

; must be a prime

mov ax, bx

call print_num

; print a space

mov si, offset space

call print_string

add bx, 1

cmp bx, max

jle LoopStart

ret

IsPrime PROC

; uses a loop to determine if number in bx is prime

; upon return if bx not prime dx will be 0, otherwise dx > 0

; we only have to test divisors from 2 to bx/2

; prepare to divide dx:ax / 2

mov ax, bx

mov dx, 0

mov cx, 2

div cx

; move result into si for loop

mov si, ax

; assume the value is prime

mov dx, 1

; start loop at 2

mov cx, 2

PrimeLoop:

; compare loop count(in cx) and max loop value (in si)

cmp cx, si

; jump out of loop if count(cx) > si

ja StopLabel

; divide test value (in bx) by loop count (in cx)

mov ax, bx

mov dx, 0

div cx

; check remainder (in dx), if zero then we found a divisor

; and the number cannot be prime

cmp dx, 0

; if dx = 0 then we found a divisor and can stop looking

je StopLabel

; increment count

add cx, 1

jmp PrimeLoop

StopLabel:

ret

IsPrime ENDP