1
// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
    x <<= 2;
    x >>= n;
    return x;
}

问题 1. 左移 =SALSHL. 我的书说它们具有相同的效果。那为什么会有两个班次操作呢?

例如:

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.

感谢您帮助理解这一点!

4

2 回答 2

5

sal并且shl是同义词,它们具有相同的操作码。

正如sar有符号除以 2 舍入数向负无穷大 (-Inf) 和shr无符号除以 2 一样,英特尔的工程师可能已经决定将两者合并salshl即使它们是同义词。

这是一个做什么shrsar做什么的例子:

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-16T21:58:08.307 回答
0

实际上没有两种不同的操作,只有同一指令的两个名称。

如果右移,有符号 (SAR) 和无符号值 (SHR) 之间存在差异,因此一个操作符号扩展而另一个不扩展。

左移时没有区别,但它仍然有两个名称(SAL 和 SHL),只是为了与右移对称。它们都映射到相同的机器代码。

于 2013-02-16T21:48:26.743 回答