免费注册 查看新帖 |

Chinaunix

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

内嵌汇编出错,求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-09 18:18 |只看该作者 |倒序浏览
调试了一个中午,真的很郁闷,不知道哪里出错了,执行完第一条指令后,就直接退出汇编了....


  1. int main(void)
  2. {
  3.     int m,n,sum = 0;

  4.     printf("input two integer:\n");
  5.     scanf("%d%d",&m,&n);
  6.       
  7.     if ( m != 0 && n != 0 ) {
  8. /*
  9.         while(m != 0) {
  10.             if ( m & 1 )
  11.                 sum += n;
  12.             m = m >> 1;
  13.             n = n << 1;
  14.         }
  15. */
  16.         __asm__("movl $0,%%eax\n"
  17.                 "1:\tcmpl $0,%1\n\t"
  18.                 "je 3f\n\t"
  19.                 "andl $1,%1\n\t"
  20.                 "cmpl $1,%1\n\t"
  21.                 "jne 2f\n\t"
  22.                 "addl %2,%0\n"
  23.                 "2:\t sar $1,%1\n\t"
  24.                 "sal $1,%2\n\t"
  25.                 "jmp 1b\n"
  26.                 "3:"
  27.                 :"=a"(sum)
  28.                 :"b"(m),"c"(n));
  29.     }

  30.     printf("%d * %d = %d\n",m,n,sum);

  31.     return 0;
  32. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-04-10 12:01 |只看该作者

  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. int main(void)
  4. {
  5.         unsigned int m, n, sum = 0;

  6.         printf("input 1 integer:\n");
  7.         scanf("%u",&m);
  8.         printf("input 1 integer:\n");
  9.         scanf("%u",&n);

  10.         if ( m != 0 && n != 0 ) {
  11.                 /**
  12.                  * while(m != 0) {
  13.                  *         if ( m & 1 )
  14.                  *                 sum += n;
  15.                  *         m = m >> 1;
  16.                  *         n = n << 1;
  17.                  * }
  18.                  */
  19.                 __asm__("1:\t cmpl $0, %1\n\t"
  20.                         "je 3f\n\t"
  21.                         "movl %1, %%eax\n\t"
  22.                         "andl $1, %%eax\n\t"
  23.                         "jz 2f\n\t"
  24.                         "addl %2, %0\n\t"
  25.                         "2:\t sar $1, %1\n\t"
  26.                         "sal $1, %2\n\t"
  27.                         "jmp 1b\n"
  28.                         "3:"
  29.                         : "=m"(sum)
  30.                         : "g"(m), "g"(n)
  31.                         : "eax"
  32.                         );
  33.         }


  34.         printf("%u * %u = %u\n",m,n,sum);



  35.         return 0;
  36. }
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2007-04-10 14:28 |只看该作者
原帖由 albcamus 于 2007-4-10 12:01 发表于 2楼  

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
        unsigned int m, n, sum = 0;

        printf("input 1 integer:\n");
        scanf("%u",&m);
        printf(" ...

"addl %2, %0\n\t"
两个都是内存操作数。

论坛徽章:
0
4 [报告]
发表于 2007-04-10 14:30 |只看该作者

回复 #3 cjaizss 的帖子

%2是"g"(n), 是寄存器

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2007-04-10 14:41 |只看该作者
You are righit
我开始的时候用一个比较老版本的gcc编译不通过,用新的编译就可以通过了

[ 本帖最后由 cjaizss 于 2007-4-10 17:17 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-04-10 22:05 |只看该作者
gcc 的嵌入汇编语法虽然灵活,但有时候让人有点迷糊,呵
sand_hz 该用户已被删除
7 [报告]
发表于 2007-04-11 01:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
sand_hz 该用户已被删除
8 [报告]
发表于 2007-04-11 01:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2007-04-11 08:36 |只看该作者
谢谢

http://bbs.chinaunix.net/viewthread.php?tid=921511&page=1&extra=page%3D3#pid6666220

论坛徽章:
0
10 [报告]
发表于 2007-04-11 22:07 |只看该作者
原帖由 sand_hz 于 2007-4-11 01:22 发表于 8楼  
再相帮解释一下
if ( m & 1 )
这句在原码乘法中的作用。
学习ING,谢谢。



在我的 blog 里有一篇讲述 ALU 乘法的文章, 可以看看:
http://blog.chinaunix.net/u/11773/showart.php?id=192721






.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP