Now when either the 'prime marking' counter, or the print counter is an even number, we skip it and increment to the next value.
Should make the program a bit faster. I haven't timed it though. I don't have a reliable method just yet.
include \masm32\include64\masm64rt.inc
.data
pTbl dq 0
arrsize dq 100000h ; must be divisible by 8
curnumber dq 0
.code
start proc
invoke GlobalAlloc, GPTR, arrsize
cmp rax, 0
jz noarray
mov pTbl, rax
mov rsi, pTbl
xor rax, rax
mov rcx, 0100010001000100h ; 8 bytes at a time :)
@@:
mov qword ptr [rsi+rax], rcx
add rax, 8
cmp rax, arrsize
jl @b
xor rax, rax
mov byte ptr [rsi+rax+2], 1 ; mark '2' as prime
mov rcx, 3 ; skip multiples of 2
add rax, rcx
@@:
add rax, rcx
cmp rax, arrsize
jae done1
cmp byte ptr [rsi+rax], 0
jz @b
mov byte ptr [rsi+rax], 0
jmp @b
done1:
inc rcx
cmp rcx, arrsize
jae done2
mov dl, cl ; to check nibble for 0,2,4,6,8,A,C,E
and dl, 0Fh ; we will increment counter if even :)
cmp dl, 0 ; skipping iterating through even numbers
jz done1
cmp dl, 2 ; skipping iterating through even numbers
jz done1
cmp dl, 4 ; skipping iterating through even numbers
jz done1
cmp dl, 6 ; skipping iterating through even numbers
jz done1
cmp dl, 8 ; skipping iterating through even numbers
jz done1
cmp dl, 0Ah ; skipping iterating through even numbers
jz done1
cmp dl, 0Ch ; skipping iterating through even numbers
jz done1
cmp dl, 0Eh ; skipping iterating through even numbers
jz done1
xor rax, rax
add rax, rcx
jmp @b
done2:
mov rdi, 2
@@:
cmp byte ptr [rsi+rdi], 1
jnz noprint
mov rax, str$(rdi)
conout rax, lf
noprint:
inc rdi
cmp rdi, arrsize
jz outtahere
mov dl, byte ptr [rsi+rdi]
and dl, 0Fh ; we will increment counter if even :)
cmp dl, 0 ; skipping iterating through even numbers
jz noprint
cmp dl, 2 ; skipping iterating through even numbers
jz noprint
cmp dl, 4 ; skipping iterating through even numbers
jz noprint
cmp dl, 6 ; skipping iterating through even numbers
jz noprint
cmp dl, 8 ; skipping iterating through even numbers
jz noprint
cmp dl, 0Ah ; skipping iterating through even numbers
jz noprint
cmp dl, 0Ch ; skipping iterating through even numbers
jz noprint
cmp dl, 0Eh ; skipping iterating through even numbers
jz noprint
jmp @b
outtahere:
invoke GlobalFree, pTbl
noarray:
invoke ExitProcess, 0
start endp
end
edit = removed two unnecessary lines of code.