Как вычислить целочисленный квадратный корень из числа в 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, но я не уверен, как это сделать

0 ответов

Другие вопросы по тегам