// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
x <<= 2;
x >>= n;
return x;
}
问题1.左移= SAL
和SHL
。我的书说他们有同样的效果。那为什么有两个班次操作?
例如:
movl 8(%ebp), %eax //Get x
_______ //x <<= 2
我的书给出了答案
sall $2, %eax
会
shll $2, %eax
也是正确的答案?
问题2:
通俗地说,SHR
和SAR
之间有什么区别?我的书中说一个是逻辑移位(用零填充),另一个是算术移位(填充符号位的副本)。
用0 /符号位填充什么?
例如:
我如何知道哪一个使用以下装配说明?
movl 12(%ebp), %ecx //Get n
______ //x >>=n
书后面有答案
sarl %cl, %eax
请向我解释如果我们使用shrl
会发生什么。
感谢您帮助理解这一点!!
答案 0 :(得分:5)
sal
和shl
是同义词,它们具有相同的操作码。
由于sar
确实将2个舍入数字划分为负无穷大(-Inf),而shr
将无符号除数除以2,因此英特尔的工程师可能决定同时合并{{1} }和sal
即使它们是同义词。
以下是shl
和shr
所做的示例:
sar
所以mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)
shr al,1 ; 0b01000100 = 68d = 68d (2's complement)
mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)
sar al,1 ; 0b11000100 = 196d = -60d (2's complement)
填充零,shr
填充符号位。
sar
一般用于无符号除法或位移,而shr
用于已签名的除法。
答案 1 :(得分:0)
实际上没有两个不同的操作,只有两个名称用于同一条指令。
如果向右移动,有符号(SAR)和无符号值(SHR)之间存在差异,因此一个操作符号会延伸而另一个操作符号不会延伸。
向左移动时没有区别,但它仍然有两个名称(SAL和SHL),仅用于右移的对称性。它们都映射到相同的机器代码。