80x86アセンブラでの作業方法を学習したので、ビット単位のシフト操作で、SALおよびSHLの使用に関する問題に直面しました。私は次のコード行の違いを意味します:
MOV X, 0AAH
SAL X, 4
MOV X, 0AAH
SHL X, 4
SHLを使用する必要がある場合とSALを使用する場合それらの違いは何ですか?
this によると、これらは同じです。
左算術算術左(SAL)命令と左論理シフト(SHL)命令は同じ演算を実行します。これらは、宛先オペランドのビットを左にシフトします(より重要なビット位置に向かって)。シフトカウントごとに、宛先オペランドの最上位ビットがCFフラグにシフトされ、最下位ビットがクリアされます(インテル®64およびIA-32アーキテクチャーソフトウェア開発者向けマニュアル、ボリューム1の図7-7を参照)。 )。
右シフトにはisの区別があるため、両方とも完全性のためにおそらく含まれていました。
shlとsalは同じです。同じマシンコードを持っています。
shrとsarは[〜#〜]ではありません[〜#〜]同じです。ほぼ同じマシンコード(ただし、そうではない)
チェック this 。
IntelとAMDが重複するSALを廃止することを望んでいること以外に違いはありません。
左方向を使用しても同じです。
算術シフトは、左にある(増加する)ときのビット単位のシフトと同じであるため、同じように機能します。一方、sarは、符号ビットが設定されている場合、shrとは異なります。
また、 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の引用 が同じセクションに続き、さらに確認します。