c - 在内联汇编中读取非标准大小的寄存器(ID​​TR)(容易吗?)

标签 c gcc x86 kernel inline-assembly

我刚刚开始尝试了解 Linux 内核,并尝试找到 IDTR 的位置。 似乎应该是一个足够简单的过程,因为汇编语言为此目的提供了 lidt 指令。因此,我认为我可以提供一个足够大的结构来容纳该寄存器的内容作为输出操作数,如下所示:

struct idt_ptr
{
    unsigned short limit;
    unsigned long long base;
} __attribute__((packed));

struct idt_ptr idtp;

int * get_idt() {
    __asm__
    __volatile__(
        "lidt %0;"
        : "=&r"(idtp)
    );
}

当然,这是行不通的。结果是

/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt'

认为结构体的大小是正确的,short应该为段地址提供16位,long long为段地址提供64位抵消。问题只是我不能使用结构作为输出目标吗?否则我该怎么办?另外,由于资源(据我发现)有点稀缺,有人可以推荐关于该主题的好的教程或书籍吗?

谢谢。

最佳答案

这是an example在 gcc 内联汇编中使用 LIDT。请注意,LIDT 设置 IDTR 的新值,而不是读取当前值。您应该使用SIDT来读取IDTR。这是 example了解如何使用 gcc 进行内联汇编。

关于c - 在内联汇编中读取非标准大小的寄存器(ID​​TR)(容易吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158312/

相关文章:

c++ - 为什么 GCC 4.8.2 不传播 'unused but set' 优化?

android - 原生 Android 应用程序在 x86 上使用 SIGILL 崩溃

c - 如何部分预处理具有特定工作目录的 C 文件

c - 二维数组中 c 语言的螺旋矩阵

c++ - 如何在 Linux 上延迟加载共享库

c - 如何解决此转换为不同大小警告的指针?

visual-studio - 如何使用 VSCode 在 GOARCH=386 的 64 位 GO 项目上使用 32 位 DLL

c - 在 C 中返回 char* 的 x86 函数

C - 将未初始化的变量传递给函数

c - c语言Openflow数据包解析