2013-02-16 3 views
1
// 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.

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

ответ

4

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 для подписанных подразделений.

+0

Большое спасибо за примеры и объяснения – juice

+2

На самом деле существует два разных кода операций для 'sal' и' shl', но до сих пор их поведение было идентичным, хотя похоже, что Intel хочет осудить одного из двух, если вы судите по их документация. –

+0

@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

0

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

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

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

+1

На самом деле существует два разных кода операций для 'sal' и' shl', но до сих пор их поведение было идентичным, хотя похоже, что Intel хочет осудить одного из двух, если вы судите по их документации. –