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。他の add 命令を理解できれば、それはまったく同じです。add 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 に答える