Сборка АТТ (арифметические и логические операции)

// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
    x <<= 2;
    x >>= n;
    return x;
}

Вопрос 1. Сдвиг влево = SAL и SHL. Моя книга говорит, что они имеют тот же эффект. Тогда почему две смены?

Например:

movl    8(%ebp), %eax    //Get x
_______                  //x <<= 2 

Моя книга дает ответ на

sall    $2, %eax

было бы

shll    $2, %eax 

также был правильный ответ?

Вопрос 2:

С точки зрения непрофессионала, в чем разница между SHR и SAR? В моей книге говорится, что один — это логический сдвиг (заполняется нулями), а другой — арифметический сдвиг (заполняется копиями знакового бита).

Что заполняет битами 0/знака?

Например:

Как я узнаю, какой из них использовать со следующими инструкциями по сборке?

movl   12(%ebp), %ecx   //Get n
______                  //x >>=n

В конце книги есть ответ

sarl   %cl, %eax 

Пожалуйста, объясните мне, что произойдет, если мы используем shrl.

Спасибо за вашу помощь в понимании этого!!


person ShadyBears    schedule 16.02.2013    source источник


Ответы (2)


sal и shl синонимы, у них одинаковые опкоды.

Поскольку sar выполняет деление со знаком на 2 числа с округлением до отрицательной бесконечности (-Inf), а shr выполняет беззнаковое деление на 2, вероятно, инженеры Intel решили также включить как sal, так и shl, даже если они являются синонимами.

Вот пример того, что делают shr и sar:

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)

shr al,1          ; 0b01000100 =  68d =   68d (2's complement)

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)

sar al,1          ; 0b11000100 = 196d =  -60d (2's complement)

Таким образом, shr заполняет нулями, а sar заполняет знаковым битом.

shr для беззнаковых делений или битовых сдвигов в целом, а sar для знаковых делений.

person nrz    schedule 16.02.2013
comment
Большое спасибо за примеры и объяснение - person ShadyBears; 17.02.2013
comment
На самом деле есть два разных кода операции для sal и shl, но до сих пор их поведение было идентичным, хотя похоже, что Intel хочет объявить устаревшим один из двух, если судить по их документации. - person Alexey Frunze; 17.02.2013
comment
@AlexeyFrunze Какие? В Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 Я могу найти только одинаковые кодировки для sal и shl: (с/без REX) DO /4, D2 /4, C0 /4 ib, D1 /4, D3 /4 , C1 /4 ib. Кроме того, если я соберу, например. sal al,1 с помощью NASM, в результате чего получается D0 E0, ndisasm дизассемблирует его как shl al,1. - person nrz; 17.02.2013
comment
/6 — другой из двух. - person Alexey Frunze; 17.02.2013

На самом деле нет двух разных операций, просто два названия одной и той же инструкции.

Если вы сдвинетесь вправо, появится разница между знаковыми (SAR) и беззнаковыми значениями (SHR), поэтому один знак операции расширяется, а другой нет.

При сдвиге влево разницы нет, но он по-прежнему имеет два названия (SAL и SHL) только из-за симметрии со сдвигами вправо. Оба они соответствуют одному и тому же машинному коду.

person Bo Persson    schedule 16.02.2013
comment
На самом деле есть два разных кода операции для sal и shl, но до сих пор их поведение было идентичным, хотя похоже, что Intel хочет объявить устаревшим один из двух, если судить по их документации. - person Alexey Frunze; 17.02.2013