// 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
会发生什么。
感谢你帮我理解这一点!
发布于 2013-02-17 05:58:08
sal
和shl
是同义词,它们具有相同的操作码。
就像sar
用2个四舍五入的数字除以负无穷大(-Inf),shr
用2做无符号除法一样,英特尔的工程师可能已经决定同时包含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
通常用于无符号除法或位移位,而sar
用于有符号除法。
发布于 2013-02-17 05:48:27
实际上并没有两个不同的操作,只是同一条指令的两个名称。
如果右移,则有符号(SAR)和无符号值(SHR)之间存在差异,因此一个运算符号扩展,而另一个不扩展。
当向左移动时没有区别,但它仍然有两个名称(SAL和SHL),只是为了与右移位的对称性。它们都映射到相同的机器代码。
https://stackoverflow.com/questions/14915336
复制相似问题