首页 > 试题广场 >

考虑下面的汇编代码: loop: movl %esi,

[问答题]
考虑下面的汇编代码:
loop:
  movl %esi,%ecx
  movl $1,%edx
  movl $0,%eax
  jmp .Lw
.L3:
  movq %rdi,%r8
  andq %rdx,%r8
  orq %r8,%rax
  salq %c1,%rdx
.L2:
  testq %rdx,%rdx
  jne .L3
  rep;ret

以上代码是编译以下整体形式的C代码产生的:

 long loop(long x,int n)
 {
   long result = ()  ;
   long mask;
   for (mask =(); mask(); mask =()) {
        result |= ();
    }
   return result;
  }

你的任务是填写这个c代码中缺失的部分,得到一个程序等价于产生的汇编代码。回想一下,这个函数的结果是在寄存器%rax中返回的。你会发现以下工作很有帮助:检查循环之前、之中和之后的汇编代码,形成一个寄存器和程序变量之间一致的映射。

A. 哪个寄存器保存着程序值x、n、result和mask?

B. result和mask的初始值是什么?

C. mask的测试条件是什么?

D. mask是如何被修改的?

E. result是如何被修改的

F.填写这段C代码中所有缺失的部分。


这道题你会答吗?花几分钟告诉大家答案吧!