请问这个gas内联汇编为什么不通过?
#include <unistd.h>#include <stdlib.h>
#include <stdio.h>
#define __KERNEL_CS 0x10
void __set_gate(void *gate_addr, int type, int dpl, void *addr)
{
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" (__KERNEL_CS << 16));
}
int main(int argc, char *argv[])
{
return 0;
}
[ 本帖最后由 jinglexy 于 2007-11-8 16:37 编辑 ] 已经搞定了,输入部分改成:
int temp = 0x8000+(dpl<<13)+(type<<8);
:"m" ((short) (temp)),
不知道是不是计算太多不能作为立即数处理的缘故 原帖由 jinglexy 于 2007-11-8 17:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
已经搞定了,输入部分改成:
int temp = 0x8000+(dpl
试了一下,还真是这样,不过我很怀疑:gcc对这方面有约束吗? 上面只是猜测,因为执行结果正确就没有多想了。
不知道linux内核里面这个函数是怎么编过的,无端的多了一个局部变量很不爽:em16: :em16: :em16: :em16: 还有个警告,改成
void CTrap::__set_gate(void *gate_addr, short type, short dpl, void *addr)
{
int __d0, __d1;
short temp = 0x8000+(dpl<<13)+(type<<8);
__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)
:"q" ((short)temp),
"3" ((char *) (addr)),"2" (__KERNEL_CS << 16));
}
可以消除,可是不知道为什么? 原帖由 jinglexy 于 2007-11-8 19:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
还有个警告,改成
void CTrap::__set_gate(void *gate_addr, short type, short dpl, void *addr)
{
int __d0, __d1;
short temp = 0x8000+(dpl
不明白,其实原来的写法,如果“”内是g或r,也没问题。 但i就不行
页:
[1]