// 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
.
Спасибо за помощь с пониманием этого!
Большое спасибо за примеры и объяснения – juice
На самом деле существует два разных кода операций для 'sal' и' shl', но до сих пор их поведение было идентичным, хотя похоже, что Intel хочет осудить одного из двух, если вы судите по их документация. –
@AlexeyFrunze Какие? В [Архитектурах Intel® 64 и IA-32 Руководство для разработчиков программного обеспечения] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software- developer-manual-325462.html) Я могу найти только те же самые кодировки для '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'. – nrz