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.左移= SAL和SHL.我的书说他们有同样的效果.那为什么有两个班次操作?
例如:
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.
感谢您的帮助,了解这一点!
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)
Run Code Online (Sandbox Code Playgroud)
因此shr填充零,并sar填充符号位.
shr对于无符号的除法或一般的位移,以及sar有符号的划分.