2012-04-26 4 views
2

小さなプログラムにサンプルASMコードを含めてテストしました。Cプログラムの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コードを実行するとき、それがセグメンテーションフォールトでクラッシュ。 誰かがこの小さなプログラムの何が問題なのか教えてもらえますか?どうもありがとう。

+0

これはどのコンパイラですか? – Ben

+0

私はLinux上でgccを使用しています – mike

答えて

2

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

+0

はい、アクセス特権が問題です – mike

7

ポートI/Oを使用する前に、iopermを使用する必要があります。また、カーネルはすでにinb and outb functionsを提供しています。代わり

使用はioperm(2)またはIOPL(2)該当のI/Oポートにアクセスするための ユーザー空間のアプリケーションを許可するようにカーネルに指示します。 を失敗させると、アプリケーションはセグメンテーションフォールトを受信します。

+0

それは、ありがとうたくさんありがとう – mike

+1

@mike [回答を受け入れる](http://meta.stackexchange.com/questions/5234/how) -does-accepting-an-an-answer-work)を使用してください。 – philipvr

0

構文は間違いありません。システム上の有効または未使用のポートを見つけて使用するだけです。

関連する問題