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:私の質問のいくつかに答えました...