x86.h inline void outb(ushort port, uchar data)

トップページ
jupiteroak.hatenablog.com


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

static inline void outb(ushort port, uchar data)
{
  asm volatile("out %0,%1"
               :
               : "a" (data), "d" (port));
}

outb関数は、引数port(I/Oポートアドレス)で指定される入出力装置に、引数dataで指定された1バイトの値を書き込みます。

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

引数 uchar data
out命令(ポート出力命令)で入出力装置に書き込む1バイトの値です。


処理の内容

インラインアセンブラ

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

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

アセンブリ言語命令

out %eax, %edx

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

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

out命令

out命令(ポート出力命令)は、edxレジスタの値(I/Oポートアドレス)で指定される入出力装置に、eaxレジスタに設定された1バイトの値を書き込みます。