Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assembly language to C

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.
like image 246
Catie Avatar asked Oct 24 '10 12:10

Catie


People also ask

Can I convert assembly code to C?

You can't deterministically convert assembly code to C. Interrupts, self modifying code, and other low level things have no representation other than inline assembly in C. There is only some extent to which an assembly to C process can work.

Is C made from assembly language?

The origin of C is closely tied to the development of the Unix operating system, originally implemented in assembly language on a PDP-7 by Dennis Ritchie and Ken Thompson, incorporating several ideas from colleagues.

Is assembly same as C?

Assembler is a lower level programming language than C,so this makes it a good for programming directly to hardware. Hardware programming can be done directly in either language. The only things you can't do in C are accessing stack pointers and condition registers etc, of the CPU core itself.

What is asm () in C?

The asm keyword allows you to embed assembler instructions within C code. GCC provides two forms of inline asm statements. A basic asm statement is one with no operands (see Basic Asm), while an extended asm statement (see Extended Asm) includes one or more operands.


1 Answers

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);
like image 183
cHao Avatar answered Oct 05 '22 21:10

cHao