免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2956 | 回复: 5
打印 上一主题 下一主题

请问这个gas内联汇编为什么不通过? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-08 16:21 |只看该作者 |倒序浏览
#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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-08 17:29 |只看该作者
已经搞定了,输入部分改成:
int temp = 0x8000+(dpl<<13)+(type<<;
:"m" ((short) (temp)),
不知道是不是计算太多不能作为立即数处理的缘故

论坛徽章:
0
3 [报告]
发表于 2007-11-08 18:02 |只看该作者
原帖由 jinglexy 于 2007-11-8 17:29 发表
已经搞定了,输入部分改成:
int temp = 0x8000+(dpl


试了一下,还真是这样,不过我很怀疑:gcc对这方面有约束吗?

论坛徽章:
0
4 [报告]
发表于 2007-11-08 18:28 |只看该作者
上面只是猜测,因为执行结果正确就没有多想了。
不知道linux内核里面这个函数是怎么编过的,无端的多了一个局部变量很不爽

论坛徽章:
0
5 [报告]
发表于 2007-11-08 19:21 |只看该作者
还有个警告,改成

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));
}

可以消除,可是不知道为什么?

论坛徽章:
0
6 [报告]
发表于 2007-11-09 09:54 |只看该作者
原帖由 jinglexy 于 2007-11-8 19:21 发表
还有个警告,改成

void CTrap::__set_gate(void *gate_addr, short type, short dpl, void *addr)
{
        int __d0, __d1;
        short temp = 0x8000+(dpl


不明白,其实原来的写法,如果“”内是g或r,也没问题。 但i就不行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP