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