GCC内联汇编(inline assembly )的几个例子

https://gcc.gnu.org/onlinedocs/gcc/index.html#SEC_Contents

int __ffs (int x)
{
  int cnt;
  int tmp;

  asm ("bsfl %2,%0\n"       /* Count low bits in X and store in %1.  */
       "cmovel %1,%0\n"     /* If number was zero, use -1 as result.  */
       : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1));

  return cnt + 1;
}


int asm1(void)
{
    int src=1;
    int dst;
    __asm__ ("movl %1, %0\n\t"
            "addl $1, %0"
            :"=r"(dst)
            :"r"(src));

    printf("src=%d,dst=%d\n",src,dst);

}

int asm2(void)
{
    int src=1;
    int dst;
    __asm__ ("movl %1, %0\n\t"
            "addl $1, %0"
            :"=r"(dst)
            :"m"(src));

    printf("src=%d,dst=%d\n",src,dst);

}

void asm3(void)
{
    int Mask = 1234;
    int Index;

      asm ("bsfl %1, %0"
         : "=r" (Index)
         : "r" (Mask)
         : "cc");

}


void asm3b(void)
{
    int Mask = 1234;
    int Index;

      asm ("bsfl %[aMask], %[aIndex]\n\t"
         "addl $1,%1\n\t"
         "addl $2,%0"

         : [aIndex]"=r" (Index),[aMask]"=r"(Mask)
         : "r" (Mask)
         : "cc");

}


int asm4(void)
{
            int a=10, b;
            asm ("movl %1, %%eax\n\t"
                 "movl %%eax, %0"
                 :"=r"(b)        /* output */
                 :"r"(a)         /* input */
                 :"%eax"         /* clobbered register */
                 );
            return b;
}

int asm4b(void)
{
    int foo = 10, bar = 15;
    asm("addl  %%ebx,%%eax"
    :"=a"(foo)
    :"a"(foo), "b"(bar)
                                 );
    printf("foo+bar=%d\n", foo);
    return foo;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值