SHL和SAL之间的差异在80x86

时间:2011-12-04 05:04:12

标签: assembly x86-16 bit-shift

我已经学会了如何使用80x86汇编程序,所以在逐位移位操作中,我遇到了SAL和SHL使用的问题。我的意思是代码行之间的区别如下:

MOV X, 0AAH
SAL X, 4

MOV X, 0AAH
SHL X, 4

何时应该使用SHL并使用SAL?它们有什么区别?

8 个答案:

答案 0 :(得分:30)

根据this,它们是相同的:

  

左移(DEL)和左移(SHL)   指令执行相同的操作;他们改变了比特   目标操作数向左(朝向更重要的位)   位置)。对于每个班次计数,最重要的一点   目标操作数被移入CF标志,并且最少   有效位清零(参见英特尔®64和IA-32中的图7-7)   Architectures Software Developer's Manual,Volume 1)。

两者都可能只是为了完整性而包括在内,因为 是右移的区别。

答案 1 :(得分:4)

除了英特尔和AMD希望弃用重复的SAL之外没有区别。

答案 2 :(得分:4)

shl和sal是相同的。他们有相同的机器代码 shr和sar 相同。他们有几乎相同的机器代码。(但不是)
检查this

答案 3 :(得分:1)

它们的工作方式相同,因为算术移位与向左移位(增加)时的按位移位相同。另一方面,如果设置符号位,sar将与shr不同。

答案 4 :(得分:1)

如果你使用左方向它们是相同的。

答案 5 :(得分:1)

我还要看一下Intel 64 and IA-32 Architectures Software Developer's Manuals Volume 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的每个操作数选择都具有相同的编码,因此它们是相同的。

Mystical's quote随后在同一部分中进一步确认。

答案 6 :(得分:-1)

实际上两者都是一样的..! 但SAL用于数字乘法时使用 示例SAL:

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

两者都是同样的,并且有相同的机器代码

答案 7 :(得分:-2)

请看一下:

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

当SHL / SHR执行无符号旋转时,SAL / SAR执行带符号的旋转。