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

Sha*_*ars 1 x86 assembly bit-shift att

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

问题1.左移= SALSHL.我的书说他们有同样的效果.那为什么有两个班次操作?

例如:

movl    8(%ebp), %eax    //Get x
_______                  //x <<= 2 
Run Code Online (Sandbox Code Playgroud)

我的书给出了答案

sall    $2, %eax
Run Code Online (Sandbox Code Playgroud)

shll    $2, %eax 
Run Code Online (Sandbox Code Playgroud)

也是正确的答案?

问题2:

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

用0 /符号位填充什么?

例如:

我怎么知道哪一个使用以下装配说明?

movl   12(%ebp), %ecx   //Get n
______                  //x >>=n
Run Code Online (Sandbox Code Playgroud)

这本书的背面有答案

sarl   %cl, %eax 
Run Code Online (Sandbox Code Playgroud)

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

感谢您的帮助,了解这一点!

nrz*_*nrz 5

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

正如sar签署2个舍入数字向负无穷大(-Inf)shr划分,并且无符号除以2,可能英特尔的工程师决定同时兼并两者sal,shl即使它们是同义词.

这里有一个例子是什么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)
Run Code Online (Sandbox Code Playgroud)

因此shr填充零,并sar填充符号位.

shr对于无符号的除法或一般的位移,以及sar有符号的划分.

  • 实际上有两个不同的"sal"和"shl"操作码,但到目前为止它们的行为是相同的,尽管如果你根据他们的文档来判断英特尔想要弃用其中一个. (2认同)