アプリ版:「スタンプのみでお礼する」機能のリリースについて

#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli ":"=g" (x): /* no input */ :"memory")


の記述で、「EFLAGSレジスタを値をスタックに退避し(pushfl)、当該レジスタのIFフラグをクリアし割り込みを禁止する」ことは分かったのですが、

(1)popl %0 ; は何をやっているのでしょうか?
(2)"=g" (x) の制御指定子のgはGeneralと言うことらしいですが、gの内容をxに出力すると言うことになると思うのですが、ここは何をやっているのでしょうか?

質問者からの補足コメント

  • %0はg(x)の引数xのことらしいです。
    つまり、popl %0 ; はスタックに積まれた引数の値を変数xにポップスすると言うことだと思います。
    ただ、実引数をpopした後にpushしないといけないと思うので、
    popl %0 ; pushfl ; の順番になるような気がするのですが、何故、
    pushfl ; popl %0 ; の順番で取り出せるのでしょうか?
    分かる方、教えてください。

      補足日時:2021/01/22 16:22

A 回答 (1件)

pushfl EFLAGSレジスタをスタックへ複写


popl %0 スタックトップ(上で保存したEFLAGSレジスタ値)を%0へ移動
cli 割り込み禁止

全体としてスタックの状態は変化しないのでは? EFLAGSレジスタ値はスタックを介して変数xに保存される。スタックは通過点に過ぎない。
割り込み禁止はcli命令ね。
"=g" (x): /* no input */ はxが書き出し用変数だということを示しているのでしょう。no inputだから元々のxの値は参照しない。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。
「スタックは通過点に過ぎない。」→その通りですね。

お礼日時:2021/01/23 04:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!