0

このアセンブリのバグを追跡するのに非常に苦労しています。助けていただければ幸いです。

私はバグを 1 つの場所まで追跡しましたが、それは私を混乱させています。

not_object:
        movq _stanza_header(%rip), %rbp
        movq c_rsp_offset(%rbp), %rsp
        andq $-16, %rsp
        addq $0, %rsp    // Code does not work without this line
        call _gc_failure

何らかの理由で、ダミー ステートメント (addq $0, %rsp) を追加するとコードが機能しますが、それがないと機能しません。

この動作がどのように発生する可能性があるかを知っている人はいますか? コードをヒープに動的にロードしていないので、何らかの方法でセグメンテーション違反なしでコードを上書きしているとは思いません。

64 ビット Intel マシンで、Apple の i686-apple-darwin10-gcc-4.2.1 を使用してコードをアセンブルしています。

どうもありがとうございました! -パトリック


結果のマシン コード (gdb によって逆アセンブルされたもの) は、私が書いたものと一致します。

not_object:
0x000000010001060e <not_object+0>:  mov    0xabb(%rip),%rbp        # 0x1000110d0 <stanza_header>
0x0000000100010615 <not_object+7>:  mov    0x58(%rbp),%rsp
0x0000000100010619 <not_object+11>: and    $0xfffffffffffffff0,%rsp
0x000000010001061d <not_object+15>: add    $0x0,%rsp
0x0000000100010621 <not_object+19>: callq  0x10000173f <gc_failure>

したがって、バグのあるアセンブラを原因として除外する必要があると思います。

4

0 に答える 0