【问题标题】:ASM code in C program causes segmentation faultC程序中的ASM代码导致分段错误
【发布时间】:2012-04-26 09:34:02
【问题描述】:

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

【问题讨论】:

    标签: c linux gcc x86 inline-assembly


    【解决方案1】:

    您需要先使用ioperm,然后才能使用端口 I/O。另外,请注意内核已经提供了inb and outb functions

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 2011-02-22
        • 1970-01-01
        相关资源
        最近更新 更多