1

クラスの課題として、おもちゃのオペレーティングシステムに取り組んでいます。カーネルパニック関数の記述に問題があります。

すべてのレジスタを保存し、printfのような関数を呼び出してから、保存したレジスタを印刷してCPUを停止する必要があります。現在、マクロとして定義されています。

#define panic(...) \
    do{ \
        asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
        _panic_printk(&_panic_context, __VA_ARGS__); \
    while(0)

_panic_contextスレッドの保存されたレジスタとその他のものを含むグローバル変数です。問題はにありSAVE_REGISTERSます。アセンブラヘッダーファイルのどこかに定義されているマクロですが、インクルードする方法がわかりません。ファイル内の単純な#includeは明らかに機能しません。私はグーグルで面白くて絶望的なもの(アセンブラー文字列の#includeなど)を書いてみましたが、何も役に立ちませんでした。これを解決する方法はありますか?

GCCを使用しており、MIPS用にコンパイルしています(シミュレーターで実行中:-))

編集: ...SAVE_REGISTERSで定義され.macro SAVE_REGISTERSます。他のアセンブリモジュールで使用されているため、Cマクロに含めることはできません。パニックは可変個引数でなければならないため、それを使用して.Sファイルを作成することはできません。または、少なくとも私はそれを行う他の方法を思い付くことができませんでした。

4

2 に答える 2

3

マクロがどのように機能するかを誤解していると思います。それらは、他のコンパイルが行われる前に拡張されます。asmマクロが展開されることはないため、マクロを含むコードを出力するために使用することはできません。

代わりに、ステートメントを使用してアセンブリコードを作成するSAVE_REGISTERSCマクロとして定義してみてください。asm

#define SAVE_REGISTERS(x) \
   asm volatile ("movx ax, %1", ...);

その後、あなたはすることができます

#define panic(...) \
do { \
    SAVE_REGISTERS(_panic_context); \
    _panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);
于 2009-10-21T16:23:05.830 に答える
2

私はMIPSシステムを使用していませんが、x86 loonixボックスでそれがコメント文字であることを試し#include、発見したので、ファイル名を引用するとすぐに機能しました 。#.include.include "something.i"

さて、ヘッダーファイルとアセンブラーコード用の組織化されたインフラストラクチャがある場合、そもそもなぜインラインasmでこれを実行したいのか疑問に思う必要があります。実数.sまたは.Sファイルを作成し、アセンブラーヘッダーファイルをインクルードして、システムのファーストクラスモジュールにしないのはなぜですか?

私は、すでに彼らの中にあるプロジェクトでさえ、 asmで行われた小さな傑作を見てきました、図を見てください...locore.SMakefile

于 2009-10-21T16:15:08.130 に答える