2011-12-23 3 views
8

私はD.変換ヘルプ:__asm__ __volatile__

static __inline void outb (unsigned char value, unsigned short int port) 
{ 
    __asm__ __volatile__ ("outb %b0,%w1" 
          : 
          : 
         "a" (value), 
          "Nd" (port)); 
} 

にポートCのOUTBの機能をしたいと思います。これは、Dバージョンです。

extern(C) 
{ 
    void outb (ubyte value, ushort port) 
    { 
     // I couldn't figure out this part 
    } 

} 

これらは、件名に関するリンクです。

Dインラインアセンブラ

http://dlang.org/iasm.html

GCC-インライン・アセンブリ-HOWTO

http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

しかし、私はので、私はいくつかの助けを必要とするアセンブリ言語を知りません。どんな助けもありがとう。ありがとう。

答えて

8

outb命令はoutb %al, %dxと呼びます。ここで、%alは値で、%dxはポートです。

Dは、デフォルトでAT & T構文を使用するGNUアセンブラとは異なり、x86ではIntel構文を使用します。対応するインテルの構文はout dx, alだろう、とD内の対応するコードは次のようになります。あなたはdruntimeは同じ命令を実行core.bitop.outp機能を持っているので、全くのアセンブリを記述する必要はありません

void outb (ubyte value, ushort port) 
{ 
    asm { 
     mov AL, value; 
     mov DX, port; 
     out DX, AL; 
    } 
} 

注意。

void outb (ubyte value, ushort port) 
{ 
    import core.bitop; 
    outp(port, value); 
} 
4

おそらくあなたをトリップだ最初の事はあなたが提供する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の場合、これらのレジスタはdxalです。 D'sのインラインアセンブリ構文に続いて、変数を移動し、次のようにoutオペコードを呼び出すことができます。

asm 
{ 
    MOV AL, value; 
    MOV DX, port; 
    OUT DX, AL; 
} 

、そのGCCはAT & Tアセンブラ構文を使用し、Dは、インテルのアセンブラ構文、順序のを使用しているため、 OUTに提供された議論は元に戻されます。

関連する問題