我已经学会了如何使用80x86汇编程序,所以在逐位移位操作中,我遇到了SAL和SHL使用的问题。我的意思是代码行之间的区别如下:
MOV X, 0AAH
SAL X, 4
MOV X, 0AAH
SHL X, 4
何时应该使用SHL并使用SAL?它们有什么区别?
答案 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)
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执行带符号的旋转。