%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