0

私は大学でPintosおもちゃのオペレーティングシステムに取り組んでいますが、GCC4.6.2を使用すると奇妙なバグがあります。システムコール引数をプッシュすると(インラインアセンブリでは3プッシュ)、いくつかの不思議なデータもスタックに表示され、引数の順序が間違っています。-fno-omit-frame-pointerを設定すると、奇妙なデータが削除されますが、引数の順序はまだ間違っています。GCC4.5は正常に動作します。どの特定のオプションがこれを修正できるか考えていますか?

注:問題は-O0でも発生します。

4

3 に答える 3

1

コード例と、さまざまなコンパイルの結果のリストがないと、役に立ちません。しかし、問題の原因として次の 3 つが考えられます。

  1. 引数がスタックにプッシュされる方法を理解していることを確認してください。引数は後ろからプッシュされます。これによりprintf(char *, ...)、最初のアイテムを調べて、あと何個あるかを調べることができます。関数を呼び出したい場合は、 c、次にb、最後にaint foo(int a, int b, int c)をプッシュする必要があります。
  2. スタック上の奇妙なデータは、リターン アドレスまたは EFLAGS でしょうか? Pintos とシステム コールがどのように行われるかはわかりませんが、CALL/RET と INT/IRET の違いを理解していることを確認してください。INT はフラグをスタックにプッシュします。
  3. インライン アセンブリに副作用がある場合は、その前にvolatile/を書きたいと思うかもしれません。__volatile__それ以外の場合、GCC は最適化時にそれを移動できます。

何が起こっているのかをよりよく理解するために、あなたのコードを見る必要があります。

于 2012-02-26T06:13:05.107 に答える
0

syscall の後にスタックのパラメーターを消去しましたか? gcc は、スタックにアクセスしてコードを生成することを認識していない可能性があり、想定されるスタック ポインターに依存します。-fno-omit-frame-pointer gcc がロケート データにアクセスするために e/rbp を使用することを強制しますが、実際の問題を隠すだけです。

于 2012-05-13T18:39:33.427 に答える
0

原因は -fomit-frame-pointer で、これは 4.6.2 以降デフォルトで有効になっています。-fno-omit-frame-pointer で問題が修正されました。

于 2012-02-28T16:25:09.173 に答える