3

皆さんの助けのおかげで、私は私の小さなインラインアセンブラプログラムをほぼそこに持っていきました。ただし、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

助けていただければ幸いです!

4

2 に答える 2

5

rdtscとティックカウンターの部分を上書きeaxします。のアドレスを以前にedxロードしたため ( )、プログラムの機能が台無しになります。コマンドチェーンの上位に移動するか、プログラムの機能以外のレジスタを使用することができます。leatimingsedxrdtscrdtsceaxedx

于 2009-05-27T06:19:56.107 に答える
0

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

于 2009-07-03T09:26:16.347 に答える