3.60 For Loop
★★
Consider the following assembly code:
loop:
; x in %rdi, n in %esi
movl %esi, %ecx
movl $1, %edx
movl $0, %eax
jmp .L2
.L3:
movq %rdi, %r8
andq %rdx, %r8
orq %r8, %rax
salq %cl, %rdx
.L2:
testq %rdx, %rdx
jne .L3
rep; retThe preceding code was generated by compiling C code that had the following overall form:
long loop(long x, long n) {
long result = ____;
long mask;
for (mask = ____; mask ____; mask = ____) {
result |= ____;
}
return result;
}Your task is to fill in the missing parts of the code to get a program equivalent to the generated assembly code. Recall that the result of the function is returened in register %rax. You will find it helpful to examine the assembly code before, during , and after the loop to form a consistent mapping between the registers and the program variables.
A. Which registers hold program values x, n, result, and mask?
x in %rdi, n in %eax, result in %rax, mask in %rdx
B. What are the initial values of result and mask?
long result = 0;
long mask = 1;C. What is the test condition for mask?
mask != 0D. How does mask get updated?
mask <<= n;E. How does result get updated?
result |= x & mask;F. Fill in all the missing parts of the C code.
long loop(long x, int n) {
long result = 0;
long mask;
for (mask = 1; mask != 0; mask <<= n) {
result |= (x & mask);
}
return result;
}Last updated
Was this helpful?