当我分析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,&divide_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+(字符*)(门地址)))
此代码是否使输出为一个字节???
例如,如果&idt[0]是0x00006620,“o”(*((char*)(gate_addr))代码是否因为字符类型而使输出类似于0x20??
但是,代码似乎使输出类似于0x00006620。
我不知道这个asm语法。为什么这个asm代码是这样工作的??? 规则和语法是什么?

最佳答案

这不是“C语法”,而是GCCextended asm syntax的一部分。"o"是一个constraint限制编译器在程序集中引用该变量时尝试使用的访问方法。

关于c - 关于linux内核__asm__语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33579808/

10-13 03:53