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 dx, 0Ah ; 10-el szorzunk mindig
add ax,[ebx+ecx]
ascii_loop:
sub byte [ebx+ecx], 30h
mul dx
inc cl
add ax, [ebx+ecx]
cmp cl, [parhossz]
jnl ascii_vege
jmp ascii_loop
ascii_vege:
mov [parameter], ax
cmp word [parameter], 0h
je help
;-------------------------------------
call itoa
;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
mov ebx, 0h
itoa_loop:
push eax
mov bx, 0Ah ; dl=10
div bx ; ax/=10
mov [szam+ecx], dl ;buffer[ecx]=n%10
pop eax
mov bx, 0Ah
div bx ; eax/=10
mov bx, ax
mov eax, 0h
mov ax, bx
inc ecx
cmp ax, 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