All pastes #766491 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-11-08 22:18 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
    add al,[ebx+ecx]

    inc cl
    cmp cl,[parhossz]
    je ascii_vege

    mul dl

    jmp ascii_loop
ascii_vege:
    mov [parameter],ax
    ;-------------------------------------

    ;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]
    sub cx,1h
feltolt:
    mov byte [szamok+ecx],1h ;Feltetelezzuk minden szamrol, hogy prim
    loop feltolt
    ;--------------------------------------


    ;Szita
    mov byte [szamok], 0h ; 0 nem prim
    mov byte [szamok], 0h ; 1 nem prim

    mov ecx, [parameter] ; ecx = n

szita_loop:

    mov edx, ecx
    add edx, ecx ; edx = 2*ecx

szita_loop2:
    mov byte [szamok+edx], 0h
    add edx, ecx  ; edx+=ecx
    cmp edx, [parameter]
    jl szita_loop2

    mov edx, ecx
    inc edx  ; edx=ecx+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

    cmp ecx, [parameter]
    jl  szita_loop


    ;kiirjuk a primet
    mov eax, 20
    call itoa


    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:
    mov ebx, eax ; ebx=eax
    mov dl, 0Ah  ; dx=10
    div dl       ; ax/=10
    mov [szam+ecx], ah ;buffer[ecx]=n%10
    mov eax, ebx ; eax=ebx

    mov dx, 0Ah
    div dx

    inc ecx
    cmp eax, 0h
    jne itoa_loop

    dec ecx
itoa_loop2:
    push ecx

    mov edx, 1
    mov ecx, [szam+ecx]
    mov ebx, 1
    mov eax, 4
    int 80h

    pop ecx
    dec ecx
    cmp ecx, 0h
    jg 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 6