web-dev-qa-db-ja.com

80x86でのSHLとSALの違い

80x86アセンブラでの作業方法を学習したので、ビット単位のシフト操作で、SALおよびSHLの使用に関する問題に直面しました。私は次のコード行の違いを意味します:

MOV X, 0AAH
SAL X, 4

MOV X, 0AAH
SHL X, 4

SHLを使用する必要がある場合とSALを使用する場合それらの違いは何ですか?

28

this によると、これらは同じです。

左算術算術左(SAL)命令と左論理シフト(SHL)命令は同じ演算を実行します。これらは、宛先オペランドのビットを左にシフトします(より重要なビット位置に向かって)。シフトカウントごとに、宛先オペランドの最上位ビットがCFフラグにシフトされ、最下位ビットがクリアされます(インテル®64およびIA-32アーキテクチャーソフトウェア開発者向けマニュアル、ボリューム1の図7-7を参照)。 )。

右シフトにはisの区別があるため、両方とも完全性のためにおそらく含まれていました。

30
Mysticial

shlとsalは同じです。同じマシンコードを持っています。
shrとsarは[〜#〜]ではありません[〜#〜]同じです。ほぼ同じマシンコード(ただし、そうではない)
チェック this

4
ARISTOS

IntelとAMDが重複するSALを廃止することを望んでいること以外に違いはありません。

4
Alexey Frunze

左方向を使用しても同じです。

1
That coworker

算術シフトは、左にある(増加する)ときのビット単位のシフトと同じであるため、同じように機能します。一方、sarは、符号ビットが設定されている場合、shrとは異なります。

1
jcomeau_ictx

また、 Intel 64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第2巻 「SAL/SAR/SHL/SHR—」の表も参照してください。シフト」には次の表が含まれます。

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の両方で同じエンコーディングを使用しているため、同じであることがわかります。

Mysticalの引用 が同じセクションに続き、さらに確認します。