当我从linux 0.11内核的include / asm / system.h分析内核代码时,
我有一些问题。
有一些代码,如
#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
"movw %0,%%dx\n\t" \
"movl %%eax,%1\n\t" \
"movl %%edx,%2" \
: \
: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"o" (*((char *) (gate_addr))), \
"o" (*(4+(char *) (gate_addr))), \
"d" ((char *) (addr)),"a" (0x00080000))
#define set_intr_gate(n,addr) \
_set_gate(&idt[n],14,0,addr)
#define set_trap_gate(n,addr) \
_set_gate(&idt[n],15,0,addr)
#define set_system_gate(n,addr) \
_set_gate(&idt[n],15,3,addr)
需要设置idt。 一些设置idt的代码使用像
这样的宏void trap_init(void)
{
int i;
set_trap_gate(0,÷_error);
set_trap_gate(1,&debug);
set_trap_gate(2,&nmi);
set_system_gate(3,&int3); /* int3-5 can be called from all */
set_system_gate(4,&overflow);
set_system_gate(5,&bounds);
set_trap_gate(6,&invalid_op);
set_trap_gate(7,&device_not_available);
此时我对c语法有疑问:“o”(*((char )(gate_addr)))。和“o”((4+(char *)(gate_addr)))
此代码是否使输出为一个字节???
例如,如果&amp; idt [0]是0x00006620,“o”(*((char *)(gate_addr)))代码是否因为char类型而输出像0x20
但是,似乎代码使输出像0x00006620。
我不知道这个asm语法。为什么这个asm代码像这样工作?什么是规则和语法?
答案 0 :(得分:0)
这不是“C语法”本身,而是GCC extended asm syntax的一部分。 "o"
是constraint,它限制了编译器在程序集中引用该变量时将尝试使用的访问方法。