考虑下面的汇编代码:
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代码中所有缺失的部分。