2012-04-26 79 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 2012-04-26 09:36:31

+0

我在linux上使用gcc – mike 2012-04-26 09:46:17

回答

2

如果您的操作系統是Windows或Linux,最有可能您的程序被終止,因爲操作系統不允許常規應用程序訪問I/O端口。

+0

是的,訪問priviledge是問題 – mike 2012-04-26 10:34:24

7

在允許使用端口I/O之前,您需要使用ioperm。另外,請注意內核已經提供inb and outb functions

使用ioperm(2)或者iopl(2)告訴內核允許 用戶空間應用程序訪問有問題的I/O端口。如果失敗 ,則會導致應用程序收到分段錯誤。

+0

它的工作原理,非常感謝 – mike 2012-04-26 10:16:31

+1

@mike一定要[接受答案](http://meta.stackexchange.com/questions/5234/how如果這對你有幫助的話,你可以接受一個答案)。 – philipvr 2012-04-26 16:17:46

0

你的語法是絕對正確的。只需在您的系統上找到並使用有效或未使用的端口即可。