关于_set_gate的注解

#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))


汇编注释:
1、mov :为寄存器移动指令,例如movw dx,ax 即为dx-〉ax,mov为移动指令。“w”为长度的指定w=word=16位=2个字节;相应的“l”=long=32位=4字节。
2、% :AT&T汇编在引用寄存器时要在前面加1个%,%%是因为GCC在编译时会将%视为特殊字符,拥有特殊意义,%%仅仅是为了汇编的%不被GCC全部转译掉
3、ax 与 eax :ax与eax之间是有联系的,他们并不是孤立的,eax为32位寄存器,ax为16位寄存器,而ax就是eax的低16位。dx与edx具有相同的关系。
4、%0、%1、%2、%3:0、1、2、3可以看作变量,这些变量在程序的":"之后,程序的两个":",是定义输入、输出项的。针对这段程序这些变量的前面都加了明确的限定,例如"i"(输入项)、"o"(输出项),剩下的"d"(edx的初始值),"a"(eax的初始值)。而0、1、2、3的概念就是指第几个变量,这里输入项、输出向、寄存器初始混合编号;相应的0("i"((short)(0x8000+(dpl<<13)+(type<<8)))));1((*((char *)(gate_addr))));2((*(4+(char *)(gate_addr))));3("d"((char *)(addr)));4("a"(0x00080000))
5、<<:这是个运算符,如果大家觉得<<不好理解可以用乘2的次方来实现相同的效果,例如14<<13=14*2的13次方
6、\n\t:这是嵌入式汇编一种书写格式

posted on 2011-07-29 14:23  不知道  阅读(2020)  评论(0编辑  收藏  举报

导航