Разница между SHL и SAL в 80x86
Я научился работать с ассемблером 80x86, поэтому в режиме бит-сдвига я столкнулся с проблемой использования SAL и SHL. Я подразумеваю разницу между строками кода следующим образом:
MOV X, 0AAH
SAL X, 4
MOV X, 0AAH
SHL X, 4
Когда мы должны использовать SHL и при использовании SAL? В чем их отличие?
Ответы
Ответ 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
ОБА БОЛЬШЕ РАБОТАЮТ ИСПОЛЬЗОВАТЬ И ИМЕЕТСЯ ИМЯ МАШИННОГО КОДА
Ответ 8
Пожалуйста, взгляните на это:
http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate
В то время как SHL/SHR выполняет беззнаковое вращение, SAL/SAR выполняют подписанный поворот.