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