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?

long result = 0;
long mask = 1;

C. What is the test condition for mask?

mask != 0

D. 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