All pastes #766675 Raw Edit

Mine

public text v1 · immutable
·published 2007-11-09 01:25 UTC
rendered paste body
section .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