Как вычислить целочисленный квадратный корень из числа в x86-64, не используя div?
Я очень плохо знаком с x86 и пытаюсь написать программу, которая вычисляет целочисленный квадратный корень из числа, постепенно наращивая его от наиболее значимого до наименее значимого. Единственные чистые регистры, которые у меня есть, это%rax, %rcx, %rdx, %rdi, %rsi, %r8, %r9, %r10 и%r11. Мне не разрешено использовать любые другие. Я не совсем уверен, как скопировать значение из% edi в регистр r, а затем, как только все вычисления будут завершены, переписать это значение из регистра r обратно в% eax для возврата.
Переменные: %edi содержит аргумент x (32-разрядный без знака). %eax будет содержать возвращаемое значение
Это весь код, который у меня есть, я уверен, что он полон ошибок, я новичок в этом.
.globl sqrt
sqrt:
movl $0, %eax #initializing return to 0
movslq %edi, %rdi #moving edi into rdi, not sure if this works
movq $0, %rax #initializing scratch return to 0
movq $15, %rcx #initializing loop counter to 15(start at 15th bit)
movq $0x80000, %rbx #creating bit mask (1000 0000 0000 0000)
loop:
xorq %rax, %rcx #set specific bit to 1 in rcx
pushq %rax #temporarily store rax value in stack
mulq %rax #rax=rax*rac
cmpq %rax, %rdi #rax<=rdi
popq %rax #restore original rax value
jbe keep_bit #keep bit if rax<=rdi
xorq %rax, %rcx #unset bit in rax if rdi>rax
keep_bit:
shr $1, %rcx #shift to the next bit
jnz loop #continue to loop until all bits are tried
Я знаю, что мне нужна строка для загрузки значения% rax обратно в% eax, но я не уверен, как это сделать