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

问题1.左移= SALSHL。我的书说他们有同样的效果。那么为什么有两次轮班?ATT装配(算术和逻辑运算)

例如:

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会发生什么。

感谢您的理解帮助!

回答

4

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

由于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签署的部门。

+0

非常感谢的实例和解释 – juice 2013-02-16 22:06:55

+2

实际上有'sal'和'shl'两种不同的操作码,但到目前为止他们的行为一直是相同的,虽然它看起来像英特尔希望弃用两个中的一个,如果你通过自己的判断文档。 – 2013-02-16 23:27:35

+0

@AlexeyFrunze哪一个?在[64和IA-32架构 软件开发人员手册](http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-开发人员手动325462.html),我只能找到相同的编码两个'sal'和'shl':(有/无'REX')'DO/4','D2/4','C0/4 ib','D1/4','D3/4','C1/4 ib'。另外,如果我组装如。 'SAL人,1'与NASM,导致'D0 E0',ndisasm拆开它作为'SHL人,1'。 – nrz 2013-02-16 23:37:56

0

真的没有两个不同的操作,只有两个名称为同一条指令。

如果右移,签名(SAR)和无符号值(SHR)之间有差异,所以一个操作符号延伸,另一个不延伸。

左移时没有区别,但它仍然有两个名称(SAL和SHL),仅用于右对称的对称。它们都映射到相同的机器码。

+1

实际上有'sal'和'shl'两种不同的操作码,但到目前为止他们的行为一直是相同的,虽然它看起来像英特尔希望弃用两个中的一个,如果你被他们的文档判断。 – 2013-02-16 23:28:27