; TITLE prime number tester ; Version is purely 64-bit, so it uses 64-bit calling conventions ; and deals with all quantities as 64-bit SECTION .data max equ 10000000 cacheSize equ 1000 cache: TIMES cacheSize dq 0 count: dq 0 printStr: db "%d",10,0 SECTION .text extern printf global main asmCheckPrimes: push rbp mov r11, rdi mov rdx, rsi mov r10, 8*cacheSize add r10, rdx mov rdi, 1 mov r9, 1 mov QWORD [rdx], 2 add rdx, 8 TOP: add rdi, 2 cmp rdi, r11 jge DONE call asmIsPrime cmp eax, 1 jne TOP inc r9 cmp rdx, r10 jge TOP mov [rdx], rdi add rdx, 8 jmp TOP DONE: mov rax, r9 pop rbp ret asmIsPrime: mov r12, rdx push rdx mov r15, rdi TOPSQRT: mov rax, rdi mov rdx, 0 div r15 add rax, r15 shr rax, 1 mov r14, rax sub rax, r15 cqo xor rax, rdx sub rax, rdx mov r15, r14 cmp rax, 1 jg TOPSQRT mov r14, 1 mov r13, rsi TOPCACHELOOP: cmp r13, r12 jge TOPPRIMELOOP mov r14, [r13] cmp r14, r15 jg ISAPRIME mov rax, rdi mov rdx, 0 div r14 cmp rdx, 0 je ISNOTAPRIME add r13, 8 jmp TOPCACHELOOP TOPPRIMELOOP: add r14, 2 cmp r14, r15 jg ISAPRIME mov rax, rdi mov rdx, 0 div r14 cmp rdx, 0 je ISNOTAPRIME jmp TOPPRIMELOOP ISAPRIME: mov rax, 1 jmp DONEPRIME ISNOTAPRIME: mov rax, 0 DONEPRIME: pop rdx ret main: sub rsp, 8 mov rdi, max mov rsi, cache mov rdx, count call asmCheckPrimes mov rdi, printStr mov rsi, rax call printf add rsp, 8 ret