首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解精益和装配

理解精益和装配
EN

Stack Overflow用户
提问于 2016-04-06 06:09:19
回答 1查看 520关注 0票数 0

我希望有人能验证我对以下汇编代码的理解:

代码语言:javascript
复制
test %esi,%esi
js 17 <build+0x17>
cmp $0x8,%esi
ja 1d <build+0x1d>
lea (&rsi,2),%ecx
shl $0x2,%rdi
mov %rdi,%rax
retq
mov $0x0,%eax //17
retq
mov $0x0,%eax //1d
retq

下面是我认为代码所做的事情:

  • 如果esi和esi是负值,则返回地址0处的返回项
  • 如果esi在8以上,则返回地址0的项。
  • rsi *2进入ecx的存储地址
  • 然后右移rdi,右移2位
  • 复制rdi到rax并返回它
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 08:19:46

这就是代码的作用:

代码语言:javascript
复制
if (esi >= 0 && esi <= 7) {
    return rdi >> (esi * 8);   // Note: arithmetic shift; preserves sign
}
return 0;

因此,esi指定了从rdi右移出的字节数(0..7)。由于使用了算术移位,所以保留了rdi的原始符号。

例如:

代码语言:javascript
复制
Input:
  rdi = 0xFC00AABB12345678
  esi = 2

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

https://stackoverflow.com/questions/36442874

复制
相关文章

相似问题

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