1
Example Code / Re: A little program to seek and write primes, with hardcoded maximum
« Last post by andyz74 on February 02, 2026, 10:31:52 AM »Also for this topic, there's one variant to seek primes by the "Sieve of Eratosthenes".
Seems to be faster as the other ones, but here, we have huge max-values until 2.100.000.000 hardcoded. You may make this smaller for testing.
Seems to be faster as the other ones, but here, we have huge max-values until 2.100.000.000 hardcoded. You may make this smaller for testing.
Code: [Select]
; 64-bit ... gibt Primzahlen aus, Sieb des Eratosthenes
; by myself
; nasm -f elf64 primzahlen_sieve_buf_opt.asm
; ld -s -o primzahlen_sieve_buf_opt primzahlen_sieve_buf_opt.o
; time : sec
[bits 64]
; here just variables ---------------------------------------
SECTION .data
ziffer db 0
zahl db '0000000000'
crlf db 13,10
msg1 db 'Bitte Geduld! Suche Primzahlen zwischen '
msgl1 db 40
msg2 db 'und '
msgl2 db 4
max dq 2100000000 ; 2,1 Milliarden (Max-Value, we seek primes to)
wmin dq 2099990000 ; This is, where we start to print primes)
; printing all primes will take long time, therefor the above
section .bss
p_array : resb 5400000000 ; 5,4 Milliarden
global _start ; global entry point export for ld
SECTION .text
_start:
jmp start2
all_be_primes:
xor r8, r8
weiter:
mov byte [p_array+r8], 1 ; wenn 1, dann prim
inc r8
cmp r8, [max]
jne weiter
ret
make_sieve: ; reminder r8 bis r15 als Register
mov r8, 1 ; das zum durchmultiplizieren.
weiter3:
inc r8
cmp byte [p_array+r8], 1 ; nur Primzahlen weiter multiplizieren! Opt!
jne weiter3
mov r9, r8
weiter2:
add r9, r8
mov byte [p_array+r9], 0 ; wenn 0, dann NICHT prim
cmp r9, [max]
jb weiter2 ; unsigned <
inc r8
cmp r8, [max]
jb weiter3 ; unsigned <
ret
print_dez: ; zahl muss in rax sein.
push rax
push rbx
push rcx
push rdx
xor rcx,rcx
mov rbx,10
schl1:
xor rdx,rdx
div rbx
push rdx
inc rcx
cmp rax,0
jnz schl1
xor r8,r8
schl2:
pop rdx
add dl,30h
mov [zahl+r8],dl
inc r8
loop schl2
mov rax, 1 ; Funktionsnummer : schreiben
mov rdi, 1 ; auf STDOUT
mov rsi, zahl ; was schreiben wir
mov rdx, r8 ; wieviel Zeichen
syscall
mov rax, 1 ; Funktionsnummer : schreiben
mov rdi, 1 ; auf STDOUT
mov rsi, crlf ; was schreiben wir
mov rdx, 2 ; wieviele Zeichen
syscall
pop rdx
pop rcx
pop rbx
pop rax
ret
print_info:
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg1 ; message address
mov rdx, 40 ; msgl1 ; message string length
syscall
mov rax, 1 ; Funktionsnummer : schreiben
mov rdi, 1 ; auf STDOUT
mov rsi, crlf ; was schreiben wir
mov rdx, 2 ; wieviele Zeichen
syscall
mov rax, [wmin]
call print_dez
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg2 ; message address
mov rdx, 4 ;msgl2 ; message string length
syscall
mov rax, 1 ; Funktionsnummer : schreiben
mov rdi, 1 ; auf STDOUT
mov rsi, crlf ; was schreiben wir
mov rdx, 2 ; wieviele Zeichen
syscall
mov rax, [max]
call print_dez
ret
start2: ; here starts the proggi
call print_info
call all_be_primes
call make_sieve
; mov byte [p_array+27], 1 ; nur zum testen
mov rax, 0
weiter4:
inc rax
cmp rax, [wmin]
jb weiter4
cmp rax, [max]
ja weiter5
cmp byte [p_array+rax], 1
jne weiter4
call print_dez
cmp rax, [max]
jb weiter4 ; unsigned <
weiter5:
mov rax,60
syscall
Recent Posts
