section .text global _start _start: push ebp ;ebp elmentese mov ebp, esp ;esp a verem tetejere mutat mov ebx,[ebp+12] ;az elso argumentum cime ;A parameter atmasolasa a parameter cimkeju teruletre mov ecx,0 par_beolv: cmp ecx,4 je beolv_vege cmp byte [ebx+ecx],0 je beolv_vege mov al,[ebx+ecx] mov [parameter+ecx],al inc ecx jmp par_beolv beolv_vege: mov [parhossz], cl ;cl a string hossza lesz ;;;parameter kiiratasa mov edx,parhossz mov ecx,parameter mov ebx,1 mov eax,4 int 80h ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; A parameter konvertalasa ASCIIbol 2byteos egesz szamma xor edx,edx ;edx kinullazasa xor ecx,ecx ;ecx kinullazasa mov cl,[parhossz] ;ecx:=parameter hosszaval konv_loop: mov al,[parhossz] sub al,cl mul al,0Ah mov bl,al mov al,[parameter+ecx] sub al,16h mul al,bl add dl,al loop konv_loop xor eax,eax mov al,dl ;;;;; A parameter konvertalasa kesz, eax regiszterben van call sqrt pop ebp mov ebx,0 mov eax,1 int 80h ;;;;; Gyokvonas ;;;;; Bemeno adat: eax ;;;;; Kimeno adat: ecx:=[sqrt(eax)] sqrt: mov ecx,eax ;eax elmentese mov ebx,eax ;edx lesz az intervallum teteje shr eax,1 ;eax az intevallum kozepere mutat ciklus: push eax mul eax ;eax:=eax*eax cmp eax,ecx je megvan_a_gyok cmp eax,ecx ja nagyobb cmp eax,ecx jb kisebb ; Ha kisebb volt eax a szam gyokenel, akkor megnezzuk a ra kovtkezo szamot ; Ha az nagyobb vagy egyenlo, akkor megvan a gyok. ; Ha kisebb, akkor valtoztatunk az intervallumon kisebb: pop eax inc eax push eax mul eax cmp eax,ecx jae megvan_a_gyok pop eax add eax,ebx shr eax,1 jmp ciklus ; Ha eax nagyobb volt a szam gyokenel, akkor megnezzuk az egyel elotte levo szam ot ; Ha az kisebb vagy egyenlo a gyokenel, akkor megvan a gyok ; Ha nagyobb, akkor valtozattunk az intervallumon nagyobb: pop eax dec eax push eax mul eax cmp eax,ecx jbe megvan_a_gyok pop eax mov ebx,eax ; Beallitjuk az intervallum tetejere edx-et shr eax,1 ; eax:=eax/2 jmp ciklus megvan_a_gyok: mov eax,ecx pop ecx ;ecx=[sqrt(eax)] ret ;;;;; A gyokkereses vege section .bss kimenet resd 300 parameter resb 5