#define _set_gate(gate_addr,type,dpl,addr,seg) /
do { /
int __d0, __d1; /
__asm__ __volatile__ ("movw %%dx,%%ax/n/t" /
"movw %4,%%dx/n/t" /
"movl %%eax,%0/n/t" /
"movl %%edx,%1" /
:"=m" (*((long *) (gate_addr))), /
"=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) /
:"i" ((short) (0x8000+(dpl<<13)+(type<<8))), /
"3" ((char *) (addr)),"2" ((seg) << 16)); /
} while (0)
分析:
output:
*(gate_addr) 0%
*(1+gate_addr) 1%
d0 2% (seg)<<16 存放在eax中(=&a)
d1 3% ((char *)addr) 存放在edx中(=&d)
inout:
(0x800+(dpl<<13)+(type<<8))
movw %%dx,%%ax 將edx的低16位移到eax低16中,也即將((char *)addr)低16為地址移到eax中
這樣eax中的值就為(seg)<<16|addr(0-15)
movw %4,%%dx 將(0x800+(dpl<<13)+(type<<8))移到edx中
這樣edx的值就為addr(16-31)|(0x800+(dpl<<13)+(type<<8))
movl %%eax,%0 將eax寫入*(gate_addr) *(gate_addr)為中斷描述符的低32位
movl %%edx,%1 將edx寫入*(1+gate_addr) *(gate_addr+1)為中斷描述符的高32位
這樣中斷描述符的內容為:
addr(31-16)|(0x800+(dpl<<13)+(type<<8)) (63-32)
(seg)<<16|addr(0-15) (31-0)