如何在不使用div的情况下计算x86-64中数字的整数平方根?

时间:2017-09-28 02:41:56

标签: x86 x86-64 square-root

我是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才能返回 但我不知道该怎么做

0 个答案:

没有答案