Assembly ATT组件(算术和逻辑运算)

Assembly ATT组件(算术和逻辑运算),assembly,x86,bit-shift,att,Assembly,X86,Bit Shift,Att,我的书回答了这个问题 movl 8(%ebp), %eax //Get x _______ //x <<= 2 会 sall $2, %eax 答案也正确吗 问题2: 用外行的话说,SHR和SAR之间有什么区别?我的书说一个是逻辑移位(用零填充),另一个是算术移位(用符号位的副本填充) 用0/符号位填充什么 例如: // Code I'll be working with int shift_left2_rightn(int

我的书回答了这个问题

movl    8(%ebp), %eax    //Get x
_______                  //x <<= 2 

sall    $2, %eax
答案也正确吗

问题2:

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

用0/符号位填充什么

例如:

// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
    x <<= 2;
    x >>= n;
    return x;
}
我如何知道在以下装配说明中使用哪一个

shll    $2, %eax 
书的后面有答案

movl   12(%ebp), %ecx   //Get n
______                  //x >>=n
请向我解释如果我们使用
shrl
会发生什么


感谢您帮助我理解这一点

实际上没有两种不同的操作,同一条指令只有两个名称

如果右移,则有符号(SAR)和无符号值(SHR)之间存在差异,因此一个操作符号扩展,另一个不扩展


当向左移动时没有区别,但它仍然有两个名称(SAL和SHL),只是为了与向右移动对称。它们都映射到相同的机器代码。

实际上没有两种不同的操作,只有同一条指令的两个名称

如果右移,则有符号(SAR)和无符号值(SHR)之间存在差异,因此一个操作符号扩展,另一个不扩展


当向左移动时没有区别,但它仍然有两个名称(SAL和SHL),只是为了与向右移动对称。它们都映射到相同的机器代码。

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

由于
sar
对负无穷大(-Inf)进行有符号除法,而
shr
对2进行无符号除法,英特尔的工程师可能已经决定将
sal
shl
合并,即使它们是同义词

以下是
shr
sar
所做的一个示例:

sarl   %cl, %eax 
因此
shr
用零填充,而
sar
用符号位填充


shr
通常用于无符号除法或位移位,而
sar
用于有符号除法。

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

由于
sar
对负无穷大(-Inf)进行有符号除法,而
shr
对2进行无符号除法,英特尔的工程师可能已经决定将
sal
shl
合并,即使它们是同义词

以下是
shr
sar
所做的一个示例:

sarl   %cl, %eax 
因此
shr
用零填充,而
sar
用符号位填充


shr
通常用于无符号除法或位移位,而
sar
用于有符号除法。

非常感谢示例和解释
sal
shl
实际上有两种不同的操作码,但到目前为止,它们的行为是相同的,尽管看起来Intel想要反对这两种产品中的一种,如果你根据它们的文档判断的话。@AlexeyFrunze哪一种?在中,我能找到的
sal
shl
的编码都是相同的:(有/没有
REX
DO/4
D2/4
C0/4ib
D1/4
D3/4
C1/4ib/code>。另外,如果我用NASM组装例如
sal al,1
,结果是
D0 E0
,NDISSM将其分解为
shl al,1
/6
是这两个中的另一个。非常感谢示例和解释
sal
shl
实际上有两个不同的操作码,但到目前为止,他们的行为是相同的,不过如果你从他们的文档判断的话,看起来英特尔想要反对其中一个。@AlexeyFrunze哪一个?在中,我能找到的
sal
shl
的编码都是相同的:(有/没有
REX
DO/4
D2/4
C0/4ib
D1/4
D3/4
C1/4ib/code>。另外,如果我用NASM组装例如
sal al,1
,结果是
D0 E0
,NDISSM将其分解为
shl al,1
/6
是这两个中的另一个。实际上
sal
shl
有两个不同的操作码,但到目前为止它们的行为是相同的,虽然从他们的文档来看,英特尔似乎想要反对这两种操作码中的一种。实际上,
sal
shl
有两种不同的操作码,但到目前为止,它们的行为是相同的,尽管从他们的文档来看,英特尔似乎想要反对这两种操作码中的一种。