All pastes #767157 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-11-09 14:30 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

ascii_loop:
    sub byte [ebx+ecx], 30h
    xor dx,dx
    mov dl,[ebx+ecx]
    add ax,dx
    inc cl
    cmp cl, [parhossz]
    je ascii_vege
    mov dx, 0Ah ; 10-el szorzunk mindig
    mul dx
    jmp ascii_loop
ascii_vege:
    mov [parameter], ax
    cmp word [parameter], 0h
    je help
    ;-------------------------------------

    call itoa
    jmp 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:
    ;pusha
    ;mov edx,len
    ;mov ecx,hlpstr
    ;mov ebx,1
    ;mov eax,4
    ;int 80h
    ;popa

    mov dx,0h
    mov bx, 0Ah
    div bx       ; ax/=10
    mov [szam+ecx], dl ;buffer[ecx]=n%10
    add byte [szam+ecx],30h

    ;pusha
    ;mov edx,len
    ;mov ecx,hlpstr
    ;mov ebx,1
    ;mov eax,4
    ;int 80h
    ;popa

    inc ecx

    cmp ax,0h
    jg itoa_loop

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

    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