.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\winmm.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\winmm.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
MAX_SIZE equ 1000000
NOT_PRIM equ 0
.data
format db"Summe: %s, Zeit:%d ms",0
.data?
summe dq ?
primarray dd ?
zeit dd ?
outbuffer db (256) dup (?)
summe_string db (256) dup (?)
.code
start:
;Speicher reservieren, os abhängig, 0-initialisierung wird vorausgesetzt
invoke VirtualAlloc,0,MAX_SIZE*sizeof DWORD,MEM_COMMIT,PAGE_EXECUTE_READWRITE
mov primarray,eax
;zeitmessung
invoke timeBeginPeriod,1 ;genauigkeit der Zeitmessung auf 1 ms setzten
invoke timeGetTime
mov zeit,eax
;array füllen
mov esi,primarray
mov ecx,MAX_SIZE-(1-MAX_SIZE MOD 2) ;Macroanweisungen, damit nicht ünnötig alle vielfachen von 2 gefüllt werden
fill_loop:
mov dword ptr [esi+ecx*4],ecx
sub ecx,2
jns fill_loop
;Summe wird in ebx,edx gezählt, wobei ebx=niederwertiges DWORD, edx=höherwertiges DWORD
;vorteil gegenüber FPU Nutzung: ca. 1/5 Perfomancegewinn
mov ebx,2 ;initialisiere mit 2
mov edx,0
mov ecx,3 ;index steht jetzt auf 3 (beginne mit der Primzahl 3)
;aussieben
sive_loop:
mov edi,[esi+ecx*4]
mov eax,edi
imul edi,edi
cmp edi,MAX_SIZE
jg nearly_finished
flag_loop:
mov dword ptr[esi+edi*4],NOT_PRIM
add edi,eax
cmp edi,MAX_SIZE
jb flag_loop
;jetzt nach der nächsten Primzahl scannen und gleich die Summe bilden
add ebx,[esi+ecx*4]
adc edx,0
scan_loop:
add ecx,2
cmp dword ptr [esi+ecx*4],NOT_PRIM
je scan_loop
jmp sive_loop
nearly_finished:
;rest zusammenzählen
cmp dword ptr [esi+ecx*4],NOT_PRIM
jz noadd
add ebx,[esi+ecx*4]
adc edx,0
noadd:
add ecx,2
cmp ecx,MAX_SIZE
jb nearly_finished
;ergebnis speichern
mov dword ptr [summe+4],edx
mov dword ptr [summe],ebx
;zeit messen,ausgeben und weitere OS abhängige Sachen:
invoke timeGetTime
sub eax,zeit
mov zeit,eax
fild qword ptr [summe]
fstp qword ptr [summe]
invoke FloatToStr2,qword ptr [summe],offset summe_string ;Funktion aus der MASM Lib
invoke wsprintf,offset outbuffer,offset format,offset summe_string,zeit
invoke MessageBox,0,offset outbuffer,0,0
retn
end start