4

https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.htmlで指定されたアセンブラを理解するのを手伝ってくれませんか

こんなふうになります:

uint64_t msr;
asm volatile ( "rdtsc\n\t"    // Returns the time in EDX:EAX.
               "shl $32, %%rdx\n\t"  // Shift the upper bits left.
               "or %%rdx, %0"        // 'Or' in the lower bits.
               : "=a" (msr)
               :
               : "rdx");

それはどのように違うのですか:

uint64_t msr;
asm volatile ( "rdtsc\n\t"
               : "=a" (msr));

なぜシフトおよびまたは操作が必要なのですか? また、最後の rdx は何をしますか?

編集:元の質問にまだ不明な点を追加しました。

  • "\n\t" は何をしますか?
  • ":" は何をしますか?
    • 区切り文字出力/入力/クロバー...
  • 最後の rdx は 0 ですか?

要約するだけです。最初の行は、レジスタ eax および edx にタイムスタンプをロードします。2 行目は値を eax にシフトし、rdx に格納します。3 行目では、edx の値と rdx の値を ors し、rdx に保存します。4 行目は、rdx の値を変数に割り当てます。最後の行は rdx を 0 に設定します。

  • 最初の 3 行に「:」がないのはなぜですか?
    • それらはテンプレートです。":" を含む 1 行目は出力、2 行目はオプションの入力、3 行目はクロバー (変更されたレジスター) のオプション リストです。
  • a は実際には eax と d - edx ですか? これはハードコードされていますか?

再度、感謝します!:)

EDIT2:私の質問のいくつかに答えました...

4

2 に答える 2

8
uint64_t msr;
asm volatile ( "rdtsc\n\t"    // Returns the time in EDX:EAX.
               "shl $32, %%rdx\n\t"  // Shift the upper bits left.
               "or %%rdx, %0"        // 'Or' in the lower bits.
               : "=a" (msr)
               :
               : "rdx");

命令は結果をandでrdtsc返すため、64 ビット マシンのストレート 64 ビット レジスタではなく (詳細については、Intel システムのプログラミング マニュアルを参照してください。これは x86 命令です)、2 番目の命令はレジスタを左にシフトします 32下位32 ビットではなく上位 32 ビットになります。の内容を( the ) に移動します。つまり、その下位 32 ビットに移動します。したがって、合計で(上位 32 ビット) と(下位 32 ビット) が になります。C 変数を表す clobberです。edxeaxrdxedx
"=a" (msr)eaxmsr%0edxeaxrdxmsr
rdxmsr

これは、C で次のことを行うのと似ています。

static inline uint64_t rdtsc(void)
{
    uint32_t eax, edx;
    asm volatile("rdtsc\n\t", "=a" (eax), "=d" (edx));
    return (uint64_t)eax | (uint64_t)edx << 32;
}

と:

uint64_t msr;
asm volatile ( "rdtsc\n\t"
               : "=a" (msr));

eaxこれは、 intoの内容を提供するだけですmsr

編集:

1) "\n\t" は、生成されたアセンブリがより明確でエラーのないように見えるようにするためのもので、 movl $1, %eaxmovl $2, %ebx
2)最後の rdx は 0 に等しいですか? 左シフトはこれを行い、すでに にあるビットを削除しますrdx
3) a は実際に eax と d - edx ですか? これはハードコードされていますか?はい、どの文字がどのレジスタを表すかを説明した表があります。たとえば、"D" はrdi、"c" はecx...

于 2016-01-15T11:59:18.303 に答える