Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于linux内核asm语法_C_Linux_Assembly_Kernel - Fatal编程技术网

C 关于linux内核asm语法

C 关于linux内核asm语法,c,linux,assembly,kernel,C,Linux,Assembly,Kernel,当我分析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

当我分析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)
在这一点上,我有一个关于c语法的问题:o*chargate\u addr。和o 4+字符*门地址

此代码是否使输出为一个字节

例如,如果&idt[0]是0x00006620,o*char*gate\u addr代码是否会因为char类型而使输出类似于0x20

但是,代码似乎使输出类似于0x00006620


我不知道这个语法。为什么这个asm代码是这样工作的???规则和语法是什么?

这不是C语法本身,它是GCC的一部分。o是一个限制编译器在程序集中引用该变量时尝试使用的访问方法的变量。

除了Ignacio所说的之外,如果内存操作数是可偏移的,那么引用simple constraint部分和o约束实际上是什么不是更有用,以下几点:1此代码“输出”的内容由汇编程序决定。movl%%eax,%1将把eax中的32位写入%1 aka*char*gate\u addr中的内存位置。2我觉得这个asm不太合适1是一个仅输入的参数。向它写入代码似乎有点可疑。@DavidWohlferd可能是为什么该代码只存在于非常早期的Linux内核中。这肯定是可疑的。
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);