内嵌汇编出错,求助

发布于 2022-09-29 00:47:49 字数 2336 浏览 19 评论 0

调试了一个中午,真的很郁闷,不知道哪里出错了,执行完第一条指令后,就直接退出汇编了....

  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. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

舂唻埖巳落 2022-10-06 00:47:49
  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. }

复制代码

洒一地阳光 2022-10-06 00:47:49

原帖由 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"
两个都是内存操作数。

护你周全 2022-10-06 00:47:49

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

夜访吸血鬼 2022-10-06 00:47:49

You are righit
我开始的时候用一个比较老版本的gcc编译不通过,用新的编译就可以通过了

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

夢归不見 2022-10-06 00:47:49

gcc 的嵌入汇编语法虽然灵活,但有时候让人有点迷糊,呵

倾城泪 2022-10-06 00:47:49

谢谢

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

梦里泪两行 2022-10-06 00:47:49

原帖由 sand_hz 于 2007-4-11 01:22 发表于 8楼  
再相帮解释一下
if ( m & 1 )
这句在原码乘法中的作用。
学习ING,谢谢。

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

.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文