我正在努力在 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
将扩展为所需的五个参数并且SETUP_IDT_ENTRY
会很高兴。我尝试了各种括号组合,但似乎没有任何效果;有没有办法使这项工作?
注意:我知道在 x86 程序集中构建 IDT 有其他方法,但这不是我要在这里回答的问题;我只是想弄清楚宏是否可以扩展为宏参数。