// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
x <<= 2;
x >>= n;
return x;
}
问题1.左移= SAL
和SHL
。我的书说他们有同样的效果。那么为什么有两次轮班?ATT装配(算术和逻辑运算)
例如:
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
会发生什么。
感谢您的理解帮助!
非常感谢的实例和解释 – juice 2013-02-16 22:06:55
实际上有'sal'和'shl'两种不同的操作码,但到目前为止他们的行为一直是相同的,虽然它看起来像英特尔希望弃用两个中的一个,如果你通过自己的判断文档。 – 2013-02-16 23:27:35
@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