C程序中的ASM代码导致分段错误

时间:2012-04-26 09:34:03

标签: c linux gcc x86 inline-assembly

我在一个小程序中包含了一些示例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代码时因分段错误而崩溃。 有人能告诉我这个小程序有什么问题吗?非常感谢。

3 个答案:

答案 0 :(得分:7)

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

  

使用ioperm(2)或iopl(2)告诉内核允许   用户空间应用程序访问有问题的I / O端口。失败   这样做会导致应用程序收到分段错误。

答案 1 :(得分:2)

如果您的操作系统是Windows或Linux,很可能您的程序已终止,因为操作系统不允许常规应用程序访问I / O端口。

答案 2 :(得分:0)

你的语法绝对正确。只需找到并使用系统上有效或未使用的端口即可。