schwug
schwug

Reputation: 11

Convert assembly to C

Need some help converting assembly code to C. To my understanding it is a while loop with condition (a < c) but I do not understand the body of the while loop.

 movl $0, -8(%ebp) # variable B is at ebp - 8
 movl $0, -4(%ebp) # variable A is at ebp - 4
 jmp .L3
.L2
 movl 8(%ebp), %eax # parameter C is at ebp + 8
 addl $2, %eax
 addl %eax, %eax
 addl %eax, -8(%ebp)
 addl $1, -4(%ebp)
 .L3
 movl -4(%ebp), %eax
 cmpl 8(%ebp), %eax
 jl .L2

Also explain why you did what you did, thanks.

This is what I got so far

int a,b = 0;

while (a < c) {
     c += 4 + 2*c;
     a++;
}

If I did all that correctly, then the only thing I don't understand is the line

addl %eax, -8(%ebp)

Upvotes: 1

Views: 1037

Answers (1)

phuclv
phuclv

Reputation: 41962

addl %eax, -8(%ebp) will add the value in eax to the value stored at ebp-8. If you can understand the other add instructions then it's just the same. There's no add 4 intruction so I don't know how you can get the expression 4 + 2*c

 movl $0, -8(%ebp)   # B = 0
 movl $0, -4(%ebp)   # A = 0
 jmp .L3
.L2
 movl 8(%ebp), %eax  # eax = C
 addl $2, %eax       # eax = C + 2
 addl %eax, %eax     # eax *= 2
 addl %eax, -8(%ebp) # B += eax
 addl $1, -4(%ebp)   # A++
 .L3
 movl -4(%ebp), %eax
 cmpl 8(%ebp), %eax
 jl .L2

So the result is as below

int a, b = 0;

while (a < c) {
     b += (c + 2)*2;
     a++;
}

which is simply

int a = c, b = c*(c+2)*2;

Upvotes: 3

Related Questions