rendered paste bodysection .text
global _start
_start:
pop ecx ;argc
pop ebx ;a program neve
pop ebx ;az elso parameter
;Ha nincs parameter, kiirjuk a helpet
cmp ecx, 1
je help
jmp nincs_help
;------------------------------------
;Help kiiratasa
help:
mov edx,len
mov ecx,hlpstr
mov ebx,1
mov eax,4
int 80h
mov ebx,0
mov eax,1
int 80h
;-------------------------------------
nincs_help:
;A parameter konvertalasa ASCII-bol ketbajtos egesz szamma
call length
xor ecx, ecx
xor eax, eax
mov dl, 0Ah ; 10-el szorzunk mindig
ascii_loop:
sub byte [ebx+ecx], 30h
mul dl
add ax, [ebx+ecx]
inc cl
cmp cl, [parhossz]
je ascii_vege
jmp ascii_loop
ascii_vege:
mov [parameter], ax
call itoa
cmp word [parameter], 0h
je help
;-------------------------------------
;Feltolti a "szamok" cimkeju teruletet
;Az n. bajt az n. szamot reprezentalja, erteke 0h vagy 1h attol fuggoen, hogy a szam prim vagy nem
xor ecx, ecx
mov cx, [parameter]
feltolt:
mov byte [szamok+ecx],1h ;Feltetelezzuk minden szamrol, hogy prim
loop feltolt
;--------------------------------------
;Szita
mov byte [szamok], 0h ; 0 nem prim
mov byte [szamok+1], 0h ; 1 nem prim
mov ecx, 2 ; i=2
szita_loop:
mov edx, ecx
add edx, ecx ; j = i+i
szita_loop2:
mov byte [szamok+edx], 0h ; szamok[j]=0
add edx, ecx ; j+=i
cmp edx, [parameter]
jl szita_loop2
mov edx, ecx
inc edx ; j=i+1
szita_loop3:
cmp byte [szamok+edx], 1h
je szita_loop3_end
inc edx
cmp edx, [parameter]
jl szita_loop3
szita_loop3_end:
mov ecx, edx ; i=j
cmp ecx, [parameter] ;i<n
jl szita_loop
;kiirjuk a primet
xor ecx, ecx
print_loop:
cmp byte [szamok+ecx], 1h
jne next
xor eax, eax
mov ax, cx
call itoa
pusha
mov edx, 1
mov ecx, hlpstr
add ecx, len
sub ecx, 5
mov ebx, 1
mov eax, 4
int 80h
popa
next:
inc cx
cmp cx, [parameter]
jne print_loop
mov edx, 1
mov ecx, hlpstr
add ecx, len
dec ecx
mov ebx, 1
mov eax, 4
int 80h
mov ebx,0
mov eax,1
int 80h
;Megnezi a parameter hosszat, es beirja a parhossz cimkere
length:
push ebp
mov ebp,esp
xor ecx,ecx ;ecx kinullazasa
mov dl,0h
length_loop:
cmp dl,[ebx+ecx]
je rtrn
inc cl
jmp length_loop
rtrn:
mov [parhossz],cl
pop ebp
ret
;--------------------------------------
; eax->szam string
itoa:
pusha
mov ecx, 0h ;i=0
itoa_loop:
push eax
mov dl, 0Ah ; dl=10
div dl ; ax/=10
mov [szam+ecx], ah ;buffer[ecx]=n%10
pop eax
mov dl, 0Ah
div dl ; eax/=10
mov dl, al
mov eax, 0h
mov al, dl
inc ecx
cmp al, 0h
jne itoa_loop
dec ecx
itoa_loop2:
push ecx
add byte [szam+ecx], '0'
mov edx, 1
mov ebx, szam
add ebx, ecx
mov ecx, ebx
mov ebx, 1
mov eax, 4
int 80h
pop ecx
dec ecx
cmp ecx, 0h
jge itoa_loop2
popa
ret
section .data
hlpstr db "Hasznalat: ./erasztothenes <n>",0Ah
len equ $-hlpstr
section .bss
parhossz resb 1
parameter resd 1
szamok resb 65536
szam resb 7