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; ret

The 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?

C. What is the test condition for mask?

D. How does mask get updated?

E. How does result get updated?

F. Fill in all the missing parts of the C code.

Last updated

Was this helpful?