Подтвердить что ты не робот

Разница между SHL и SAL в 80x86

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

MOV X, 0AAH
SAL X, 4

MOV X, 0AAH
SHL X, 4

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

4b9b3361

Ответ 1

Согласно this, они совпадают:

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

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

Ответ 2

Там нет разницы, кроме Intel и AMD, желающих отказаться от дублирования SAL.

Ответ 3

shl и sal - одинаковые. Они имеют одинаковый машинный код.
shr и sar НЕ. Они имеют почти одинаковый машинный код. (но не)
Проверьте это.

Ответ 4

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

Ответ 5

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

Ответ 6

Я также хотел бы взглянуть на таблицу в Руководствах разработчиков программного обеспечения для архитектуры 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, поэтому они идентичны.

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

Ответ 7

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

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

ОБА БОЛЬШЕ РАБОТАЮТ ИСПОЛЬЗОВАТЬ И ИМЕЕТСЯ ИМЯ МАШИННОГО КОДА