2015-11-19 10 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); 
} 

にアセンブラから変数を渡します。これは可能ですか?私のアセンブラコードはSegmentation fault (core dumped)を引き起こします。私はUbuntu 15.10 x86_64、gcc 5.2.1を使用しています。Iは<code>result</code>変数介し<code>main</code>にアセンブラからいくつかのデータを渡したいC

+0

GCCはあなたが参照することができ、このための[拡張ASM](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)を持っていますその '__asm__'フラグメントの出力変数に渡します。 –

+2

これに追加する:コードは、プログラムのコードセグメントに 'result'のためのスペースを割り当て、' .long 0'は2つの '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; 
} 
関連する問題

 関連する問題