2017-03-09 11 views
1

私は、関数decodを持つCプログラムを持っていて、その関数は次のようなステートメントを持っています。Cプログラムのアセンブリコード

マイdecode.cスクリプト:

int decod(int x, int y, int z) { 
    int ty = y; 
    ty = ty - z; 
    int py = ty; 
    py = py << 31; 
    py = py >> 31; 
    ty = ty * x; 
    py = py^ty; 
    } 

gcc -S decod.cによって生成された)このプログラムのアセンブリコードは、次のコードを示しています。

movl %edi, -20(%rbp) 
movl %esi, -24(%rbp) 
movl %edx, -28(%rbp) 
movl -24(%rbp), %eax 
movl %eax, -8(%rbp) 
movl -28(%rbp), %eax 
subl %eax, -8(%rbp) 
movl -8(%rbp), %eax 
movl %eax, -4(%rbp) 
sall $31, -4(%rbp) 
sarl $31, -4(%rbp) 
movl -8(%rbp), %eax 
imull -20(%rbp), %eax 
movl %eax, -8(%rbp) 
movl -8(%rbp), %eax 
xorl %eax, -4(%rbp) 
popq %rbp 
.cfi_def_cfa 7, 8 
ret 

ただし、次のコード行のみを含むアセンブリファイルを生成します。

私は、上記のコードを生成するプログラムを書くのにかなり近いと知っています。しかし、なぜスクリプトが異なるアセンブリコードを生成するのか、私は無知です。どんな方向にも役立ちます。

+0

その関数は何も返しません。 – Arash

+0

*その*コードになるようにしたいのであれば、なぜアセンブリではなくC言語で記述していますか? –

+0

、賢明なasmコードを取得するには、最適化をオンにします。一方、合理的な最適化されたコードを提供するには、完全に最適化されないコードを提供してください(何も返さないので完全に無駄です)。 – Tommylee2k

答えて

3

関数をそのままコンパイルすると、最適化レベル3で-O3が完全に最適化されます。これは、戻り値がなく、関数の後には、とにかく破棄されたpytyです。しかし、あなたは次のように生成されたコードがある最後にreturn py;を追加する場合

参考のためのコードは

.globl decod 
    .def decod; .scl 2; .type 32; .endef 
    .seh_proc decod 
decod: 
    .seh_endprologue 
    ret 
    .seh_endproc 

を下回っています。

.globl decod 
    .def decod; .scl 2; .type 32; .endef 
    .seh_proc decod 
decod: 
    .seh_endprologue 
    subl %r8d, %edx 
    movl %edx, %eax 
    imull %edx, %ecx 
    sall $31, %eax 
    sarl $31, %eax 
    xorl %ecx, %eax 
    ret 
    .seh_endproc 

これは、機能的に期待しているものと同じです。

関連する問題