2017-11-30 23 views
2

インラインアセンブリでinb命令を使用するCコードがあります。私はinbが8ビットのサイズを持つオペランドを受け取ると聞いた。 ALとDLは8ビットですから、なぜこれは機能しませんか?in-gccインラインアセンブリのオペランドタイプの不一致

__asm__ __volatile__("inb %al, %dl"); 

「オペランドタイプが一致しません」と表示されます。それが重要な場合、私は上部に ".code16gcc"を持っています。 すべての助力に感謝します。

+0

パラメータは、ATTの構文は第二として、最初のオペランドとdestとsrcをしていると周りに変更する必要があります。同様に[port register](http://www.felixcloutier.com/x86/IN.html)は_DX_ _DL_でなくてはなりません。また、 'AL'のようなレジスタを変更すると、 _GCC_に_EAX_を締め付けたことを伝えてください。あなたはまた、どこかに適切に移動するためにいくつかのタイプの制約を持たなければなりません。インラインアセンブリは非常に難しく、コードプロジェクトチュートリアルでは、どちらも理解できなかったため、苦痛の道を辿っています。 –

+4

このような機能を実行する適切な方法は、 'uint8_t inb(uint16_t port){ uint8_t ret;asm volatile( "inb%1、%0": "= a"(ret): "dN"(port)); return ret; } '。私は通常静的なインラインのような機能をマークし、ヘッダファイルに置きます。 –

答えて

1

2つのこと:AT & Tスタイルアセンブリでは、デスティネーションオペランドは最後であり、データが8ビットであってもポート番号は16ビットです。だから、:

inb %dx, %al 
+1

これでアセンブルされますが、[@ MichaelPetchのコード](https://stackoverflow.com/questions/47579639/operand-type-mismatch-for-in-gcc-inline-assembly/47579797#comment82116781_47579639)のみが作成されますGNU Cのインラインasm *として実際に使える*。 –