Разница между SHL и SAL в 80x86 - PullRequest
25 голосов
/ 04 декабря 2011

Я научился работать с ассемблером 80x86, поэтому при битовой смене я столкнулся с проблемой использования SAL и SHL.Я имею в виду разницу между строками кода следующим образом:

MOV X, 0AAH
SAL X, 4

MOV X, 0AAH
SHL X, 4

Когда мы должны использовать SHL, а когда использовать SAL?В чем их разница?

Ответы [ 8 ]

30 голосов
/ 04 декабря 2011

Согласно это , они одинаковы:

Арифметическое смещение влево (SAL) и логическое смещение влево (SHL) инструкции выполняют ту же операцию; они сдвигают биты в целевой операнд слева (в направлении более значимого бита места). Для каждой смены наиболее значимый бит целевой операнд смещен в флаг CF, и наименее значимый бит сбрасывается (см. Рисунок 7-7 в Intel®64 и IA-32 Руководство разработчика программного обеспечения для архитектуры, том 1).

Оба, вероятно, были включены только для полноты, поскольку является различием для сдвига вправо.

4 голосов
/ 14 июня 2017

ЗЫ и соли одинаковы. У них одинаковый машинный код.
shr и sar НЕ одинаковы. У них почти один и тот же машинный код (но не)
Проверьте это .

4 голосов
/ 04 декабря 2011

Нет никакой разницы, если Intel и AMD не хотят использовать дубликат SAL.

1 голос

Я бы также взглянул на таблицу в Руководствах разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 2"SAL / SAR / SHL / SHR — Shift", в котором содержится таблица с:

D0 /4             SHL r/m8, 1
REX + D0 /4       SHL r/m8**, 1
D2 /4             SHL r/m8, CL
REX + D2 /4       SHL r/m8**, CL
C0 /4 ib          SHL r/m8, imm8
REX + C0 /4 ib    SHL r/m8**, imm8
D1 /4             SHL r/m16,1
D3 /4             SHL r/m16, CL
C1 /4 ib          SHL r/m16, imm8
D1 /4             SHL r/m32,1
REX.W + D1 /4     SHL r/m64,1
D3 /4             SHL r/m32, CL
REX.W + D3 /4     SHL r/m64, CL
C1 /4 ib          SHL r/m32, imm8
REX.W + C1 /4 ib  SHL r/m64, imm8

D0 /4             SAL r/m8, 1
REX + D0 /4       SAL r/m8**, 1
D2 /4             SAL r/m8, CL
REX + D2 /4       SAL r/m8**, CL
C0 /4 ib          SAL r/m8, imm8
REX + C0 /4 ib    SAL r/m8**, imm8
D1 /4             SAL r/m16, 1
D3 /4             SAL r/m16, CL
C1 /4 ib          SAL r/m16, imm8
D1 /4             SAL r/m32, 1
REX.W + D1 /4     SAL r/m64, 1
D3 /4             SAL r/m32, CL
REX.W + D3 /4     SAL r/m64, CL
C1 /4 ib          SAL r/m32, imm8
REX.W + C1 /4 ib  SAL r/m64, imm8

Сравнивая обе части, мы видим, что каждый выбор операнда имеет одинаковую кодировку для SHL и SAL, поэтому они идентичны.

Мистическая цитата следует в том же разделе, подтверждая это.

1 голос
/ 04 декабря 2011

Они одинаковы, если вы используете левое направление.

1 голос
/ 04 декабря 2011

они работают одинаково, так как арифметический сдвиг такой же, как и побитовый сдвиг, когда он влево (увеличивается).sar, с другой стороны, будет отличаться от shr, если бит знака установлен.

0 голосов
/ 07 июня 2017

на самом деле оба одинаковы ..! но SAL Используется, когда предполагается умножение чисел ПРИМЕР ПРОДАЖИ:

Multiply AX by 8
MOV CL, 3
SAL AX, CL

ОБА ЧАСТИЧНО РАБОТАЮТ ОДНОВРЕМЕННО И ТО ЖЕ КОДЕКС МАШИНЫ

0 голосов
/ 04 марта 2014

Пожалуйста, посмотрите на это:

http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate

Пока SHL / SHR совершают вращение без знака, SAL / SAR выполняют вращение со знаком.

...