1

需要一些帮助将汇编代码转换为 C。据我了解,这是一个带有条件 (a < c) 的 while 循环,但我不了解 while 循环的主体。

 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

还要解释为什么你做了你所做的,谢谢。

这是我到目前为止得到的

int a,b = 0;

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

如果我做对了,那么我唯一不明白的就是这条线

addl %eax, -8(%ebp)
4

1 回答 1

3

addl %eax, -8(%ebp)会将值添加eax到存储在的值中ebp-8。如果您可以理解其他添加说明,那么它是一样的。没有添加 4指令,所以我不知道如何获得表达式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

所以结果如下

int a, b = 0;

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

这很简单

int a = c, b = c*(c+2)*2;
于 2013-11-06T02:05:16.113 回答