質問

私はしばらくの間 Linux 環境で Nasm を扱ってきましたが、この機能はうまく機能しました...しかし、今私はWindows環境に切り替えており、Masm(VS2008で)を使用したいのですが、これを機能させることができないようです...

void outportb (unsigned short _port, unsigned short _data)
{
  __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

こういうことを書くと…

void outportb (unsigned short _port, unsigned short _data)
{
  asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

asm が認識されなくなり、volatile が「string」というエラーをスローします。また、_asm volatile を書き込もうとしましたが、「'opcode' のインライン アセンブラー構文エラー;」というエラーが表示されます。「データ型」が見つかりました」

役に立ちましたか?

解決

x86 コマンド セットについて話していると仮定すると、覚えておくべきことがいくつかあります。

  1. 命令「outb」は 1 バイトを出力します。これは、C/C++ の型「char」または「unsigned char」に相当します。16 ビットのワードを出力するには (「unsigned short」を使用しているため)、「outw」を使用する必要があります。
  2. ただし、Intel では命令ニーモニック "out" を使用し、ポート サイズはオペランド サイズから認識することが推奨されています (VS でも必須です)。例えば「アウトDX、 " は "outw" と同等ですが、"out dx, アル" は "outb" と同等です
  3. x86 では、「out」命令では、ポートと出力値をそれぞれ (e)dx レジスタと {eax/ax/al} レジスタに配置する必要があります。Nasm はそれを自動的に実行してくれるかもしれませんが (手元にコンパイラーがないので確認できません)、VS では CPU レベルで行われる方法で実行する必要があります。
  4. __asm で「volatile」キーワードを指定する理由はありません。インライン アセンブリ命令により、VS コンパイラは読み取りキャッシュを無効にします (volatile キーワードの目的)

コードは次のとおりです (16 ビット ポートに書き込んでいると仮定します)。

void outportw(unsigned short port, unsigned short data)
{
    __asm  mov ax, data; 
    __asm  mov dx, port; 
    __asm  out dx, ax;
}

8 ビット ポートに書き込む場合、コードは次のようになります。

void outportb(unsigned short port, unsigned char data)
{
    __asm  mov al, data; 
    __asm  mov dx, port; 
    __asm  out dx, al;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top