2009-05-27 16 views
3

皆さんの助けを借りて私は小さなインラインアセンブラプログラムをほとんどどこにも持っています。しかし、今はrdtscコマンドで非常に奇妙なことが起こっているようです。基本的に、私はそれを呼び出すときにセグメンテーション違反を得る。CのインラインアセンブリでRDTSCがセグメンテーション違反の原因になります。

int timings[64*N]; 
int main(void) 
{ 

    int i; 

    __asm__ __volatile__ ( 
     "lea edx, [timings] \n\t" 
     "rdtsc \n\t" 
     ".rept 32 \n\t" 
     "mov eax,[edx] \n\t" 
     "inc eax \n\t" 
     "mov dword ptr [edx], eax \n\t" 
     "add edx, 4 \n\t" 
     ".endr \n\t" 
    : 
    : [timings] "m" (*timings) 
    ); 

    for(i=0; i<32; i++) 
     printf("%d\n", timings[i]); 

    return 0; 
} 

rdtscを抜けて、プログラムがコンパイルされ、実行する必要があることが実行されます。しかし、rdtsc行を追加すると、セグメンテーション違反が発生します。私はデュアルコアマシン上でこのようなことを実行し、コンパイルに使用しています:gcc -masm = intel test.c

助けてください!

答えて

5

rdtscは、チックカウンタの部分でeaxedxを上書きします。 (leatimingsのアドレスをedxにロードしたので、先にrdtscが機能しなくなります。 rdtscをコマンドチェーンの上に移動するか、eaxedx以外のレジスタを使用して、プログラムの機能を実行できます。

+0

カントは私がどれほど愚かであるか信じています。タイムスタンプカウンタの上位部分がedxに格納されていることを完全に無視しました。ここで私を助けてくれて本当にありがとう、それはちょうど朝早くにある;) –

0

明白なRDTSCのEDX問題への書き込み以外に、asmステートメントのクローバーリストを送信しませんでした。 GCCは、あなたが出力/ clobberとしてどこにもリストしていないすべてのレジスタは、コードの実行後も変更されず、これらのレジスタを使用してコード全体にわたっていくつかの値を保持できると仮定します。私はそれを覚えていないので、GCCのドキュメントの構文を見てください:)。

関連する問題