section .text
global _start
_start:
push ebp ;ebp elmentese
mov ebp, esp ;esp a verem tetejere mutat
xor eax, eax ;eax:=0
mov ax, [ebp+8] ;ax:=parameter
pop ebp
mov ebx,0
mov eax,1
int 80h
ret
;;;;; Gyok vonas
;;;;; Bemeno adat: eax
;;;;; Kimeno adat: ecx:=[sqrt(eax)]
sqrt:
push ebp
mov ebp,esp ;ebp elmentese
mov ecx,eax ;eax elmentese
mov edx,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,edx
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 edx,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)]
pop ebp
ret
;;;;; A gyok kereses vege