home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tasm / chapxmpl.arc / PRIMES.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-10-10  |  1.8 KB  |  71 lines

  1. ;
  2. ; Beispielfunktion in 80386-Code, um alle Primzahlen
  3. ; zwischen 0 und MAX_PRIMZAHL auszurechnen.
  4. ;
  5. ; Eingabewerte: Keine
  6. ;
  7. ; Ausgabewerte:
  8. ;    ES:EAX -    Zeiger auf PrimFlags, das im Offset eine 1 enthält,
  9. ;            wenn der Offset der Zahl eine Primzahl ist, ansonsten
  10. ;            eine 0.
  11. ;
  12. ; Veränderte Register: EAX, EBX
  13. ;
  14. ; Basiert auf dem Algorithmus in »Environments« von
  15. ; Charles Petzold, PC Magazine, Vol. 7, No. 2.
  16. ;
  17.         .386
  18. MAX_PRIMZAHL    EQU    1000000
  19.  
  20. DataSeg    SEGMENT USE32
  21. PrimFlags    DB    (MAX_PRIMZAHL + 1) DUP (?)
  22. DataSeg    ENDS
  23.  
  24.  
  25. CodeSeg    SEGMENT USE32
  26.         ASSUME    CS:CodeSeg
  27. Primzahl    PROC
  28.         push    ds        ; DS des aufrufenden Programms retten
  29.         mov    ax,DataSeg
  30.         mov    ds,ax
  31.         ASSUME    DS:DataSeg
  32.         mov    es,ax
  33.         ASSUME    ES:DataSeg
  34. ;
  35. ; Annehmen, daß alle Zahlen Primzahlen sind
  36. ;
  37.         mov    al,1
  38.         mov    edi,OFFSET PrimFlags
  39.         mov    ecx,MAX_PRIMZAHL + 1
  40.         cld
  41.         rep    stosb
  42. ;
  43. ; Nun werden alle Zahlen eliminiert, die keine Primzahlen sind, indem
  44. ; alle Vielfache der Zahlen (außer 1), die kleiner oder gleich
  45. ; MAX_PRIMZAHL sind, ausgeschlossen werden.
  46. ;
  47.         mov    eax,2    ; mit 2 anfangen, da 0 & 1 Primzahlen sind,
  48.                     ; die man nicht für die Eliminierung
  49.                     ; verwenden kann
  50. PrimSchleife:
  51.         mov    ebx,eax    ; Basiswert, um die Vielfachen auszurechnen
  52. MehrfachSchleife:
  53.         add    ebx,eax            ; nächstes Vielfaches berechnen
  54.         cmp    ebx,MAX_PRIMZAHL        ; alle überprüft?
  55.         ja    NaechstePrimzahlTesten    ; ja, die nächste Primzahl testen
  56.         mov    [PrimFlags+ebx],0    ; Keine Primzahl, also 0
  57.         jmp    MehrfachSchleife        ; weiter eliminieren
  58. NaechstePrimzahlTesten:
  59.         inc    eax        ; nächster Basiswert
  60.         cmp    eax,MAX_PRIMZAHL    ; wurden alle Vielfache eliminiert
  61.         jb    PrimSchleife    ; nein, nächste Vielfache überprüfen
  62. ;
  63. ; Zeiger auf Primzahlentabelle in ES:EAX zurückgeben
  64. ;
  65.         mov    eax,OFFSET PrimFlags
  66.         pop    ds    ; DS des aufrufenden Programms wiederherstellen
  67.         ret
  68. PrimZahl    ENDP
  69. CodeSeg    ENDS
  70.         END
  71.