section .data
n1 dd 81 ;
n2 dd 100 ;
a_t dq 1 ;
enl db 10 ;
digit db 0 ;
buf resb 20 ;
section .text
global _start
_start:
;
mov eax, [n1]
push rax
call calc_sqrt
add rsp, 8
call print_sqrt
call print_newline
;
mov eax, [n2]
push rax
call calc_sqrt
add rsp, 8
call print_sqrt
call print_newline
; Exit program
mov rax, 60
xor rdi, rdi
syscall
calc_sqrt:
sub rsp, 32
mov [rsp+24], rax
shr rax, 1
add rax, 1
mov [rsp+8], rax
xor rcx, rcx
calc_loop:
mov rax, [rsp+24]
cqo
idiv qword [rsp+8]
add rax, [rsp+8]
shr rax, 1
mov [rsp+16], rax
mov rax, [rsp+8]
sub rax, [rsp+16]
test rax, rax
js nega
jmp test
nega:
neg rax
test:
cmp rax, [a_t]
jl jump_out
mov rax, [rsp+16]
mov [rsp+8], rax
inc rcx
cmp rcx, 1000
jge jump_out
jmp calc_loop
jump_out:
mov eax, [rsp+8]
add rsp, 32
ret
print_sqrt:
sub rsp, 8
mov [rsp], rax
xor r14, r14
mov rbx, 10
test rax, rax
conv_loop_start:
cqo
idiv rbx
add dl, '0'
mov [buf + r14], dl
inc r14
cmp rax, 0
jnz conv_loop_start
print_loop_start:
dec r14
mov al, [buf + r14]
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
cmp r14, 0
jnz print_loop_start
mov rax, [rsp]
add rsp, 8
ret
print_newline:
mov rax, 1
mov rdi, 1
mov rsi, enl
mov rdx, 1
syscall
ret