内联汇编lable已经定义了错误 [英] Inline assembly lable already defined error

查看:193
本文介绍了内联汇编lable已经定义了错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写我的第一个内联asm程序,它是一个素数函数。

  ../ prime.c:30:错误:symbol`loop_top'已经被定义
../prime.c:38:错误:符号`loop_bot'已定义
../prime.c:40:错误:符号`loop_end'已经定义

int inline_prime(long n)
{
if(n == 2)
return 1;
if(n%2 == 0)
return 0;
long sr = sqrt(n);
long prime = 0;
__asm__

jmp loop_bot \\\

movq $ 3,%% r8 \\\

loop_top:\\\


movq $ 0,%[prime] \\\

movq%[n],%% rax \\\

divq %% r8 \\\

test%[prime],%[prime] \\\

jz loop_end \\\



addq $ 2,%% r8 \\\

cmpq%[sr],%% r8 \\\

loop_bot:\\\

jle loop_top \\\

loop_end:\ n'
:[prime]= d(prime)
:[n]r(n),[sr]r(sr)
:%r8 ,%rax
);
返回素数;
}

如何定义我的标签和跳转?

解决方案

使用特殊格式字符串%= 定义 here 例如:

 loop_top _%=:\\\

jmp loop_top _%= \\\


I am trying to write my first inline asm program which is a prime number function. I get these errors...

../prime.c:30: Error: symbol `loop_top' is already defined
../prime.c:38: Error: symbol `loop_bot' is already defined
../prime.c:40: Error: symbol `loop_end' is already defined

int inline_prime(long n)
{
    if(n == 2)
        return 1;
    if(n % 2 == 0)
        return 0;
    long sr = sqrt(n);
    long prime = 0;
    __asm__
    (
        "jmp loop_bot \n"
        "movq $3, %%r8 \n"
        "loop_top:\n"

        "movq $0, %[prime] \n"
        "movq %[n], %%rax \n"
        "divq %%r8 \n"
        "test %[prime], %[prime] \n"
        "jz loop_end \n"


        "addq $2, %%r8 \n"
        "cmpq %[sr], %%r8 \n"
        "loop_bot: \n"
        "jle loop_top \n"
        "loop_end: \n"
        : [prime]"=d"(prime)
        : [n]"r"(n), [sr]"r"(sr)
        : "%r8", "%rax"
    );
    return prime;
}

How should I define my labels and jumps?

解决方案

Use the Special Format String %= as defined here.

For example:

"loop_top_%=:\n"
"jmp loop_top_%=\n"

这篇关于内联汇编lable已经定义了错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆