ATT组装(算术和逻辑运算)

时间:2013-02-16 21:31:02

标签: assembly x86 bit-shift att

// 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:

通俗地说,SHRSAR之间有什么区别?我的书中说一个是逻辑移位(用零填充),另一个是算术移位(填充符号位的副本)。

用0 /符号位填充什么?

例如:

我如何知道哪一个使用以下装配说明?

movl   12(%ebp), %ecx   //Get n
______                  //x >>=n

书后面有答案

sarl   %cl, %eax 

请向我解释如果我们使用shrl会发生什么。

感谢您帮助理解这一点!!

2 个答案:

答案 0 :(得分:5)

salshl是同义词,它们具有相同的操作码。

由于sar确实将2个舍入数字划分为负无穷大(-Inf),而shr将无符号除数除以2,因此英特尔的工程师可能决定同时合并{{1} }和sal即使它们是同义词。

以下是shlshr所做的示例:

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),仅用于右移的对称性。它们都映射到相同的机器代码。