2

テストを行うために、いくつかのサンプル ASM コードを小さなプログラムに含めました。

私のプログラムは次のとおりです。

#include <stdio.h>

static inline
unsigned char inb (int port) {
    unsigned char data;
    asm volatile("inb %w1,%0" : "=a" (data) : "d" (port));
    return data;
}

int main()
{
    printf("hello world %d\n", inb(22));
    return 0;
}

プログラムを実行すると、ASM コードの実行時にセグメンテーション違反でクラッシュします。この小さなプログラムのどこが悪いのか誰か教えてもらえますか? どうもありがとう。

4

3 に答える 3

7

iopermポートI/Oの使用を許可する前に、を使用する必要があります。また、カーネルがすでに提供し、機能していることに注意しinboutbください

ioperm(2)または代わりにiopl(2)を使用して、ユーザースペースアプリケーションが問題のI/Oポートにアクセスできるようにカーネルに指示します。これを行わないと、アプリケーションはセグメンテーション違反を受け取ります。

于 2012-04-26T09:52:37.243 に答える
2

OS が Windows または Linux の場合、通常のアプリケーションが I/O ポートにアクセスすることを OS が許可していないため、プログラムが終了している可能性があります。

于 2012-04-26T09:49:26.383 に答える
0

あなたの構文は絶対に正しいです。システムで有効または未使用のポートを見つけて使用するだけです。

于 2012-04-26T10:04:45.797 に答える