Невозможно переключить k-й бит на 1 - PullRequest
0 голосов
/ 26 сентября 2019

enter image description here

// assembly
    .globl _sqrt2
    _sqrt2:
        movl $0, %eax   # place your code for Q3 here
        movq $16, %rcx
        movq $0x10000, %rdx
    loop:
        cmpq $0, %rcx
        jle end
        xorl %eax, %edx
        movl %eax, %esi
        imull %esi, %esi
        cmpq %rdi, %rsi
        jle continue
        xor %eax, %edx
    continue:
        dec %rcx
        shrq $1, %rdx
        jmp loop

    end:
        ret
//main.c
#include <stdio.h>

unsigned int sqrt2(unsigned int);

void main () {
    unsigned int i;
    for (i = 0; i < 30; i++) {
        printf("The integer square root of %u is %u.\n", i, sqrt2(i));
    }
    return;
}

Результат:

The integer square root of 4 is 0.
The integer square root of 5 is 0.
The integer square root of 6 is 0.
The integer square root of 7 is 0.
The integer square root of 8 is 0.
The integer square root of 9 is 0.

Я пытаюсь перевести этот алгоритм в сборку, но я думаю, что немногопереключающая часть не работаетxorl %eax, %edx должен установить k-й бит на 1, но он не работает.

1 Ответ

0 голосов
/ 26 сентября 2019

Вы не устанавливаете k-й бит на 1, вы устанавливаете k + 1-й бит на 1. Измените movq $0x10000, %rdx на movq $0x8000, %rdx.

...