Сборка дивизиона ИА-32 - PullRequest
       14

Сборка дивизиона ИА-32

0 голосов
/ 11 сентября 2011

Может кто-нибудь объяснить мне следующий фрагмент сборки:

mydiv:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx  ; get x
        movl    %edx, %eax
        sarl    $31, %edx      ; divide by y
        idivl   12(%ebp)       ; return %eax
        popl    %ebp
        ret

Это эквивалентно следующей функции C:

int mydiv( int x, int y )
{
    return x / y;
}

Часть, с которой у меня возникают проблемыпонимание - это инструкция sarl: зачем вам сдвиг edx?

1 Ответ

3 голосов
/ 11 сентября 2011

Это расширение знака .

idivl имеет 64-битный аргумент (edx:eax), поэтому необходимо убедиться, что MSB содержитправильные знаковые биты, основанные на значении msb eax.

Так что если eax положительно, его значение будет равно 0, например, 5 -> 0000 ... 0101.Если оно отрицательное, его значение будет равно 1, например, -5 -> 1111 ... 1011.sarl выполняет арифметическое смещение вправо, поэтому edx будет 0000 ... 0000 или 1111 ... 1111.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...