红联Linux门户
Linux帮助

真头疼,我这段内联汇编到底哪里有问题阿?

发布时间:2009-10-18 17:16:50来源:红联作者:faku
[i=s] 本帖最后由 faku 于 2009-10-18 17:28 编辑 [/i]

1
2 #include
3
4 int main ()
5 {
6 int fd = 2;
7 const char * p = "hello world\n";
8 int len = strlen(p);
9
10 __asm__ __volatile__(
11 "movl %0, %%eax\n\t"
12 "movl %1, %%ebx\n\t"
13 "movl %2, %%ecx\n\t"
14 "movl %3, %%edx\n\t"
15 "int $0x80\n\t"
16 :: "i" (4), "i" (fd), "m" (*p), "i" (len)
17 : "%eax", "%ebx", "%ecx", "%edx"
18 );
19 return 0;
20 }

文件名是__asm__.c
gcc -o __asm__ __asm__.c
__asm__.c: In function ‘main’:
__asm__.c:10: warning: asm operand 1 probably doesn’t match constraints
__asm__.c:10: warning: asm operand 3 probably doesn’t match constraints
__asm__.c:10: error: impossible constraint in ‘asm’
make: *** [__asm__] Error 1
无论怎么改,都是同样的错误
文章评论

共有 7 条评论

  1. faku 于 2009-10-20 09:34:17发表:

    我就觉得1楼的大哥挺搞笑的,0号中断时时钟中断没错,可是0x80中断(应该是异常)对应的0号系统调用,应该是restart systemcall,
    唉!!!!!!!!!!!

  2. 414716676 于 2009-10-19 15:43:44发表:

    都已经玩到这个地步了,不错啊!

  3. 微宝贝 于 2009-10-18 21:36:40发表:

    arm-linux-gcc似乎有那么点不配合,我看见别人也有这样的问题。内嵌汇编代码老出问题。

  4. faku 于 2009-10-18 19:44:18发表:

    可能是gcc版本问题,我从内核源代码上复制了一段类似的代码,也编译不过去!

  5. faku 于 2009-10-18 19:05:14发表:

    我明白了,"i"(立即数,不能用变量)

  6. faku 于 2009-10-18 18:59:58发表:

    呵呵,大哥,谢谢您老回答,
    但是。。。。。。。。。。。。。。。。。。。。。。。。。
    首先,请您老看清楚:% 和 $
    其次,即使我这么写:movl $0, %%eax,编译也是不会报错的

    可能我给出的信息比较少:
    CentOS5.3
    gcc:gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)

  7. wang7131984 于 2009-10-18 17:56:07发表:

    据我所知int 0x80第0号功能是时钟中断。你拿它来显示字符串真是很奇怪。写每条语句之前,拜托搞清楚它的具体意思,不要瞎写。