home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD2.mdf
/
c
/
tools
/
cmerge
/
sieve.asl
< prev
next >
Wrap
Text File
|
1987-06-08
|
3KB
|
189 lines
.186
name sieve
_text segment byte public 'code'
dgroup group _data,_bss
assume cs:_text,ds:dgroup,ss:dgroup
_text ends
_data segment word public 'data'
_d@ label byte
_data ends
_bss segment word public 'bss'
_b@ label byte
_bss ends
_data segment word public 'data'
public _flags
_flags label byte
db 0
db 8190 dup (?)
_data ends
_text segment byte public 'code'
;|***
;|*** /* Eratosthenes Sieve Prime Number Program in C, Byte January 1983.
;|*** * The code has been corrected to produce primes correctly.
;|*** */
;|*** #include <stdio.h>
;|***
;|*** #define TRUE 1
;|*** #define FALSE 0
;|*** #define NITER 150
;|*** #define SIZE 8190
;|***
;|*** char flags[SIZE+1]={0};
;|***
;|***
;|*** main ()
;|*** {
; Line 16
_main proc near
push si
push di
enter 4,0
;|*** register int i,k;
; Line 17
;|*** int iter, count;
; Line 18
;|***
; Line 19
;|*** printf ("%d iterations: ", NITER);
; Line 20
db 104 ; push immediate
dw 150
mov ax,offset _s@
push ax
call near ptr _printf
add sp,4
;|***
; Line 21
;|*** for( iter = 1; iter <= NITER; iter++ ) /* Do sieve 150 times */
; Line 22
mov word ptr [bp-4],1
jmp short @5
@4:
;|*** {
; Line 23
;|*** count = 0;
; Line 24
mov word ptr [bp-2],0
;|*** for( i = 0; i <= SIZE; i++) /* set all flags true */
; Line 25
xor si,si
jmp short @9
@8:
;|*** flags[i] = TRUE;
; Line 26
mov byte ptr dgroup:_flags[si],1
inc si
@9:
cmp si,8190
jle @8
;|***
; Line 27
;|*** for( i = 2; i <= SIZE; i++ )
; Line 28
mov si,2
jmp short @13
@12:
;|*** {
; Line 29
;|*** if ( flags[i] ) /* found a prime */
; Line 30
cmp byte ptr dgroup:_flags[si],0
je @11
;|*** {
; Line 31
;|*** for ( k = i + i; k <= SIZE; k += i )
; Line 32
mov di,si
add di,si
jmp short @18
@17:
;|*** flags[k] = FALSE; /* Cancel its multiples */
; Line 33
mov byte ptr dgroup:_flags[di],0
add di,si
@18:
cmp di,8190
jle @17
;|*** count++;
; Line 34
inc word ptr [bp-2]
;|*** }
; Line 35
;|*** }
; Line 36
@11:
inc si
@13:
cmp si,8190
jle @12
;|*** }
; Line 37
inc word ptr [bp-4]
@5:
cmp word ptr [bp-4],150
jle @4
;|***
; Line 38
;|*** printf ("%d primes\n", count);
; Line 39
push word ptr [bp-2]
mov ax,offset _s@+16
push ax
call near ptr _printf
add sp,4
;|***
; Line 40
;|*** exit(0);
; Line 41
db 106 ; push immediate
db 0
call near ptr _exit
inc sp
inc sp
;|***
; Line 42
;|*** }
; Line 43
leave
pop di
pop si
ret
_main endp
_text ends
_data segment word public 'data'
_s@ label byte
db 37
db 100
db 32
db 105
db 116
db 101
db 114
db 97
db 116
db 105
db 111
db 110
db 115
db 58
db 32
db 0
db 37
db 100
db 32
db 112
db 114
db 105
db 109
db 101
db 115
db 10
db 0
_data ends
_text segment byte public 'code'
extrn _exit:near
extrn _printf:near
public _main
_text ends
end