2015-07-21 115 views
0

我想寫我的第一個內聯asm程序,這是一個素數函數。我得到這些錯誤...行內彙編標籤已經定義錯誤

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

我該如何定義我的標籤和跳轉?

回答

2

使用定義爲here的特殊格式字符串%=

例如:

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

我只得到了OP使用-02標誌時遇到的錯誤。我給了這個旋轉,並收到錯誤。 「助記符中的字符'%'無效。」接下來是「操作數1中的」無效字符=「。」我用-S來獲得沒有優化的程序集,它看起來很荒謬。很多浪費的指示。但我不認爲由-S生成的代碼可以工作..... –

+1

我自己找到答案(令人興奮,因爲它通常不會發生)...我必須使用__attribute __(( noinline始終))'。完美的作品。 –