このアセンブリのバグを追跡するのに非常に苦労しています。助けていただければ幸いです。
私はバグを 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>
したがって、バグのあるアセンブラを原因として除外する必要があると思います。