我打算创建一个整数的sqrt,所以我认为我们必须考虑唯一的逗号前部分。我使用的是nasm 64bit。 所以我已经创建了一个看起来像这样的伪代码:
a := value
b := 0
while (a-b)>1
a := ((a+b)/2)
b := (value/a)
end_while
result := min{a,b}
在数学上看起来像:
x = max{x ϵ Z | x**2 <=z}
我创建这个伪代码来理解实现它的数学但现在停留
答案 0 :(得分:0)
我认为你想要的结果也是一个整数。 对于文件:
; uname -m -o: x86_64 GNU/Linux
; Calling convention: System V AMD64 ABI
; Name: isqrt.asm
; Assemble: nasm -felf64 isqrt.asm
; Link: gcc -m64 isqrt.o
; Run: ./a.out
; b := value
; a := 0
; while (b-a)>1 => while b > a (integer!)
; b := ((b+a)/2)
; a := (value/b)
; end_while
; result := b
extern printf
%MACRO PRINT 1
; extern printf
mov rdi, %1
mov rsi, rax
xor eax, eax
call printf
%ENDM
section .data
value: dq 1000
fmt1: db `isqrt32: rax=%u\n`,0
fmt2: db `isqrt64: rax=%u\n`,0
fmt3: db `isqrt_fpu: rax=%u\n`,0
section .text
global main:
main:
mov edi, [value]
call isqrt32
PRINT fmt1
mov rdi, [value]
call isqrt64
PRINT fmt2
mov rdi, [value]
call isqrt_fpu
PRINT fmt3
xor al,al ; Exitcode 0
ret
isqrt64:
mov rbx, rdi
xor rax, rax
.while:
cmp rax, rbx
jnb .endwhile
add rbx, rax
shr rbx, 1
mov rax, rdi
xor rdx, rdx
div rbx
jmp .while
.endwhile:
mov rax, rbx
ret
isqrt32:
mov ebx, edi
xor eax, eax
.while:
cmp eax, ebx
jnb .endwhile
add ebx, eax
shr ebx, 1
mov eax, edi
xor edx, edx
div ebx
jmp .while
.endwhile:
mov eax, ebx
ret
isqrt_fpu:
push rdi
fild qword [rsp]
fsqrt
fisttp qword [rsp]
pop rax
ret