3

x86アセンブリでIDTテーブルを手動で作成する作業をしています。.SファイルでCプリプロセッサを使用して次のマクロを定義しています。

// sets up an entry in the idt for a trap type
#define SETUP_IDT_ENTRY( name, num, istrap, segment, dpl ) \
    lea name, %edx; \
    movl $(KCODE << 16), %eax; \
    movw $0x8e00, %dx; \
    lea (idt + (8 * num)), %edi; \
    movl %eax, (%edi); \
    movl %edx, 4(%edi);

// sample set of args to a call to setup_dt_entry
#define M_DIVIDE _t_divide_ep, T_DIVIDE, 0, KCODE, 0

// the call
SETUP_IDT_ENTRY( M_DIVIDE )

ただし、gccは次のように文句を言います。error: macro "SETUP_IDT_ENTRY" requires 5 arguments, but only 1 given

関数呼び出しが評価される前に、#define'd関数への#define'd引数が拡張されたと思いました。その場合、M_DIVIDE必要な5つの引数に拡張され、SETUP_IDT_ENTRY満足します。括弧のさまざまな組み合わせを試しましたが、何も機能していないようです。これを機能させる方法はありますか?

注:x86アセンブリでIDTを構築するための代替アプローチがあることは知っていますが、それは私がここで答えようとしている質問ではありません。マクロをマクロ引数として展開できるかどうかを調べようとしています。

4

2 に答える 2

4

引数自体は拡張されますが、引数の数はマクロ定義と一致する必要があります。それを機能させるには、追加のマクロが必要です。

#define IDT1(x) SETUP_IDT_ENTRY(x)

IDT1(M_DIVIDE)

ここここでより多くの情報。

于 2013-01-31T16:48:04.660 に答える
2

これは、間接参照の別のレイヤーで実行できます。

#define PLEASE_SETUP_IDT_ENTRY(...) SETUP_IDT_ENTRY(__VA_ARGS__)
// the delicate, civilized call
PLEASE_SETUP_IDT_ENTRY(M_DIVIDE)

(新しいバリアントが1つだけの引数を受け入れるようにする場合は、可変個引数マクロは必要ありません。上記の定義は1つまたは複数の引数を受け入れます)。

于 2013-01-31T16:47:09.720 に答える