home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Beispielfunktion in 80386-Code, um alle Primzahlen
- ; zwischen 0 und MAX_PRIMZAHL auszurechnen.
- ;
- ; Eingabewerte: Keine
- ;
- ; Ausgabewerte:
- ; ES:EAX - Zeiger auf PrimFlags, das im Offset eine 1 enthält,
- ; wenn der Offset der Zahl eine Primzahl ist, ansonsten
- ; eine 0.
- ;
- ; Veränderte Register: EAX, EBX
- ;
- ; Basiert auf dem Algorithmus in »Environments« von
- ; Charles Petzold, PC Magazine, Vol. 7, No. 2.
- ;
- .386
- MAX_PRIMZAHL EQU 1000000
-
- DataSeg SEGMENT USE32
- PrimFlags DB (MAX_PRIMZAHL + 1) DUP (?)
- DataSeg ENDS
-
-
- CodeSeg SEGMENT USE32
- ASSUME CS:CodeSeg
- Primzahl PROC
- push ds ; DS des aufrufenden Programms retten
- mov ax,DataSeg
- mov ds,ax
- ASSUME DS:DataSeg
- mov es,ax
- ASSUME ES:DataSeg
- ;
- ; Annehmen, daß alle Zahlen Primzahlen sind
- ;
- mov al,1
- mov edi,OFFSET PrimFlags
- mov ecx,MAX_PRIMZAHL + 1
- cld
- rep stosb
- ;
- ; Nun werden alle Zahlen eliminiert, die keine Primzahlen sind, indem
- ; alle Vielfache der Zahlen (außer 1), die kleiner oder gleich
- ; MAX_PRIMZAHL sind, ausgeschlossen werden.
- ;
- mov eax,2 ; mit 2 anfangen, da 0 & 1 Primzahlen sind,
- ; die man nicht für die Eliminierung
- ; verwenden kann
- PrimSchleife:
- mov ebx,eax ; Basiswert, um die Vielfachen auszurechnen
- MehrfachSchleife:
- add ebx,eax ; nächstes Vielfaches berechnen
- cmp ebx,MAX_PRIMZAHL ; alle überprüft?
- ja NaechstePrimzahlTesten ; ja, die nächste Primzahl testen
- mov [PrimFlags+ebx],0 ; Keine Primzahl, also 0
- jmp MehrfachSchleife ; weiter eliminieren
- NaechstePrimzahlTesten:
- inc eax ; nächster Basiswert
- cmp eax,MAX_PRIMZAHL ; wurden alle Vielfache eliminiert
- jb PrimSchleife ; nein, nächste Vielfache überprüfen
- ;
- ; Zeiger auf Primzahlentabelle in ES:EAX zurückgeben
- ;
- mov eax,OFFSET PrimFlags
- pop ds ; DS des aufrufenden Programms wiederherstellen
- ret
- PrimZahl ENDP
- CodeSeg ENDS
- END
-