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
有两种不同的操作码,但到目前为止,它们的行为是相同的,尽管从他们的文档来看,英特尔似乎想要反对这两种操作码中的一种。