0

ここに私のCコードがあります:

int test(int x, int y){
    int val=4*x;
    if (y>0){
        if (x<y) val=x-y;
        else val=x^y;
    }
    else if (y<-2) val=x+y;
    return val;
}

そして、GCCコマンドラインに入力したものは次のとおりです。

gcc -O1 -S -march=i686 test.c

そして、これが私が得たSファイルです(計算部分のみ):

pushl   %ebx
movl    8(%esp), %ecx
movl    12(%esp), %edx
testl   %edx, %edx
jle     L2
movl    %ecx, %eax
subl    %edx, %eax
movl    %edx, %ebx
xorl    %ecx, %ebx
cmpl    %edx, %ecx
cmovge  %ebx, %eax
jmp     L4

L2:
leal    0(,%ecx,4), %eax
addl    %edx, %ecx
cmpl    $-2, %edx
cmovl   %ecx, %eax

L4:
popl    %ebx
ret

私の質問は、上記の S ファイルを使用してまったく同じ C コードを取得できますか? 私はまったく同じことを意味します。たとえば、valis 4*x(C コードの 2 行目) のデフォルト値を特定できますか? if各ステートメントのテスト式を特定できますか?

私は本当にあなたの助けが必要です。ありがとうございました!!!

4

1 に答える 1

2

この場合、変数に対応する各レジスタが次のように表示されることがわかります。

  • %eax-var
  • %ebx- コンテキスト一時変数
  • %ecx-x
  • %edx-y

識別子の「正確に」を意味する場合、「シンボル テーブル」という名前の特別な構造の場合にのみ可能です。-g( GCC でフラグ付きでコンパイル)

とにかく、コードは常にコンパイラによって最適化できることを知っておく必要があります。この場合、コードが同じ数学的な意味を持つ別のコードに変更されることを意味します。コードが逆翻訳されている場合は、次のようになります。

int test(int x, int y) {
    int val;
    if (y > 0) {
        if (x < y)
            val = x - y;
        else
            val = x ^ y;
    } else {
        if (y < -2)
            val = x + y;
        else
            val = 4 * x;
    }
    return val;
}

最適化を行わない場合は、-O0代わりにflag を使用して-O1ください。

于 2013-07-05T03:54:18.537 に答える