2015-11-19 30 views
5
#include <stdio.h> 

int main(){ 
     __asm__ (
       "result: \n\t" 
       ".long 0 \n\t" 
       "rdtsc  \n\t" 
       "movl %eax, %ecx\n\t" 
       "rdtsc  \n\t" 
       "subl %ecx, %eax\n\t" 
       "movl %eax, result\n\t" 
     ); 

     extern int result; 
     printf("%d\n", result); 
} 

我想通過result變量從彙編器通過一些數據main。這可能嗎?我的彙編程序代碼導致Segmentation fault (core dumped)。我使用Ubuntu 15.10 x86_64,gcc 5.2.1。傳遞變量從彙編到C

+0

GCC有[擴展ASM(https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)對於這一點,讓你參考到'__asm__'片段中的輸出變量。 –

+2

要補充說明的是:代碼就像在程序的代碼段中爲'result'分配空間,'.long 0'產生兩個'add%al,(%rax)'指令。 –

+0

如果你想讀時鐘,爲什麼不使用'unsigned long long a = __builtin_ia32_rdtsc()'?那麼你不需要寫任何asm。 –

回答

1

更好的方法可能是:

int main (void) 
{ 
    unsigned before, after; 

    __asm__ 
    (
     "rdtsc\n\t" 
     "movl %%eax, %0\n\t" 
     "rdtsc\n\t" 
     : "=rm" (before), "=a" (after) 
     : /* no inputs */ 
     : "edx" 
    ); 

    /* TODO: check for after < before in case you were unlucky 
    * to hit a wraparound */ 
    printf("%u\n", after - before); 
    return 0; 
}