x86.h static inline uint readeflags(void)

トップページ
jupiteroak.hatenablog.com


x86.h
https://github.com/mit-pdos/xv6-public/blob/master/x86.h#L94

static inline uint readeflags(void)
{
  uint eflags;
  asm volatile("pushfl;
                popl %0"
                : "=r" (eflags));
  return eflags;
}

readeflags関数は、EFLAGSレジスタの値を取得します。

戻り値 uint eflags
取得したEFLAGSレジスタの値です。


処理の内容

インラインアセンブラ

asm volatile("pushfl;
              popl %0"
              : "=r" (eflags));

関数内のインラインアセンブラを解釈すると以下のようになります。

アセンブリ言語命令

pushfl
popl %レジスタ

pushfl

pushfl命令により、EFLAGSレジスタの値をスタックへ退避させます。

popl %レジスタ

popl命令により、32bitのデータをスタックから復帰させ、その値をレジスタ(eax,ebx,ecx,edx,esi,ediレジスタのいずれか)にセットします。

取得したEFLAGSレジスタの値を戻り値としてリターン

return eflags;

インラインアセンブラの命令実行後は、レジスタの値がeflagsに格納されているので、その値を戻り値としてリターンします。