首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ATT汇编(算术和逻辑运算)

ATT汇编(算术和逻辑运算)
EN

Stack Overflow用户
提问于 2013-02-17 05:31:02
回答 2查看 4.6K关注 0票数 1
代码语言:javascript
运行
复制
// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
    x <<= 2;
    x >>= n;
    return x;
}

问题1.左移位= SALSHL。我的书上说它们有同样的效果。那为什么会有两个移位操作呢?

例如:

代码语言:javascript
运行
复制
movl    8(%ebp), %eax    //Get x
_______                  //x <<= 2 

我的书给出了一个答案:

代码语言:javascript
运行
复制
sall    $2, %eax

将会

代码语言:javascript
运行
复制
shll    $2, %eax 

也是正确答案吗?

问题2:

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

用0/符号位填充什么?

例如:

我怎样才能知道在下面的汇编指令中使用哪一个?

代码语言:javascript
运行
复制
movl   12(%ebp), %ecx   //Get n
______                  //x >>=n

书的背面有答案

代码语言:javascript
运行
复制
sarl   %cl, %eax 

请向我解释一下如果我们使用shrl会发生什么。

感谢你帮我理解这一点!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-17 05:58:08

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

就像sar用2个四舍五入的数字除以负无穷大(-Inf),shr用2做无符号除法一样,英特尔的工程师可能已经决定同时包含salshl,即使它们是同义词。

下面是shrsar所做的示例:

代码语言:javascript
运行
复制
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用于有符号除法。

票数 5
EN

Stack Overflow用户

发布于 2013-02-17 05:48:27

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14915336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档