おそらくあなたをトリップだ最初の事はあなたが提供するC関数で指定されたオペコードのDコンパイラのサポートリストは、outb
が含まれていないことです。掘り下げた後、私はoutb
が一般的なオペコードout
のより具体的な名前であることを知りました。 outb
は、オペコードへの最初の引数がバイトレジスタに含まれることを示します(outw
およびoutl
)。しかし、Dコンパイラはopcodeを使用しますout
を指定し、指定する引数のサイズに基づいて、書き込む特定の演算コードを決定します。
GCCの構文をD構文に変換することは、次のようなことです。 GCC-インライン・アセンブリ-HOWTOによると、あなたが提供されたコードは、拡張されたアセンブリの構文を使用します。
テンプレートを見てみると
asm (assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
を、関数は2つの引数を持つ1つのアセンブリ命令(outb
)、最初のものを指定します(%b0
)であり、第2のものは単語または短い整数(%w0
)です。
入力引数リストに関するトリッキーなビットは、各関数パラメータの前に付く文字列です。 HOWTOによると、これは制約と呼ばれています。基本的には、提供されたアセンブリ命令の引数としてGCCが従わなければならない規則です。value
パラメータに適用される制約"a"
は、変数の内容が変数のサイズに応じてレジスタeax
,ax
またはal
のいずれかに配置されなければならないことを示します。 変数の制約"Nd"
は、最初にその値が0-255の範囲内にあることを示し、2番目に、値がレジスタedx
,dx
またはdl
のいずれかに配置されなければならないことを再び示します。変数。
Gコンパイラは、GCCと同じようにアセンブリブロック内の変数に大きな助けをしません。 Dのインラインアセンブラでは、パラメータの値を適切なレジスタに移動する必要があります。 outb
の場合、これらのレジスタはdx
とal
です。 D'sのインラインアセンブリ構文に続いて、変数を移動し、次のようにout
オペコードを呼び出すことができます。
asm
{
MOV AL, value;
MOV DX, port;
OUT DX, AL;
}
注
、そのGCCはAT & Tアセンブラ構文を使用し、Dは、インテルのアセンブラ構文、順序のを使用しているため、
OUT
に提供された議論は元に戻されます。