Assembly language to C

assembly, bit-shift, c

Solution

`sall %cl, %edx` shifts %edx left by `%cl` bits. (`%cl`, for reference, is the low byte of `%ecx`.) The subsequent `testl` tests whether that shift zeroed out %edx.

The `jne` is called that because it's often used in the context of comparisons, which in ASM are often just subtractions. The flags would be set based on the difference; ZF would be set if the items are equal (since x - x == 0). It's also called `jnz` in Intel syntax; i'm not sure whether GNU allows that too.

All together, the three instructions translate to `i <<= n; if (i != 0) goto L2;`. That plus the label seem to make a for loop.

for (i = 1; i != 0; i <<= n) { result ^= i & x; }

Or, more correctly (but achieving the same goal), a do...while loop.

i = 1;
do { result ^= i & x; i <<= n; } while (i != 0);

Problem

So I have the following assembly language code which I need to convert into C. I am confused on a few lines of the code. I understand that this is a `for` loop. I have added my comments on each line. I think the `for` loop goes like this ``` for (int i = 1; i > 0; i << what?) { //Calculate result } ``` What is the test condition? And how do I change it? Looking at the assembly code, what does the variable 'n' do? This is Intel x86 so the format is movl = source, dest ``` movl 8(%ebp), %esi //Get x movl 12(%ebp), %ebx //Get n movl $-1, %edi //This should be result movl $1, %edx //The i of the loop .L2: movl %edx, %eax andl %esi, %eax xorl %eax, %edi //result = result ^ (i & x) movl %ebx, %ecx //Why do we do this? As we never use $%ebx or %ecx again sall %cl, %edx //Where did %cl come from? testl %edx, %edx //Tests if i != what? - condition of the for loop jne .L2 //Loop again movl %edi, %eax //Otherwise return result. ```

Original source