%include "asm_io.inc"
segment .data
print_limit db 'Enter limit: ', 0
segment .bss
limit resd 1
guess resd 1
ecxstore resq 1
segment .text
global _asm_main
_asm_main:
enter 0,0
pusha
mov eax, print_limit ; set parameter to "Enter Limit"
call print_string ; print
call read_int ; read integer into EAX
mov [limit], eax ; put read integer into limit variable
mov dword [guess], 5 ; set guess to 5, first guess
mov ecx, [limit] ; set loop counter to limit
sub ecx, [guess] ; then subtract by guess to figure out how many cycles we need
for_guess:
mov dword ebx, 2 ; set first factor to test... 2
for_factors:
mov eax, [guess] ; set EAX to guess for numerator
mov edx, 0 ; set EDX to 0 to prepare to hold remainder
div ebx ; divide EAX by EBX, stores remainder in EDX
cmp edx, 0 ; is EDX 0?
je next_guess ; Yes? Jump to next_guess, its not prime
add dword ebx, 1 ; No? Add one to the factor
cmp ebx, [guess] ; Is the factor equal to the guess?
je no_factors ; Yes? PRIME!
jmp for_factors ; No? Not prime...
no_factors:
mov eax, [guess] ; Copy guess into EAX
call print_int ; Output, because its prime!
call print_nl ; Print new line
next_guess:
add dword [guess], 1 ; Add one to guess
loop for_guess ; Loop on, brother
popa
mov eax, 0
leave
ret