x86.h static inline uchar inb(ushort port)

トップページ
jupiteroak.hatenablog.com


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

static inline uchar inb(ushort port)
{
  uchar data;

  asm volatile("in %1,%0"
               : "=a" (data)
               : "d" (port));
  return data;
}

inb関数は、引数port(I/Oポートアドレス)で指定される入出力装置から1バイトのデータを読み取ります。

引数 ushort port
入出力装置を指定するI/Oポートアドレスです。

戻り値 uchar data
in命令(ポート入力命令)で入出力装置から読み取った1バイトのデータです。


処理の内容

インラインアセンブラ

asm volatile("in %1,%0"
               : "=a" (data)
               : "d" (port));

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

アセンブリ言語命令

in %edx, %eax

インラインアセンブラの命令を実行する前の状態

・edxレジスタ(入力レジスタのリストにdで表記され、%1に対応している)
引数portの値が設定されています。

in命令

in命令(ポート入力命令)は、edxレジスタの値(I/Oポートアドレス)で指定される入出力装置から1バイトのデータを読み取り、読み取ったデータをeaxレジスタにセットします。

入出力装置から読み取った1バイトのデータを戻り値としてリターン

return data;

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