【问题标题】:Reading a register of nonstandard size (IDTR) in inline assembly (easy?)在内联汇编中读取非标准大小(IDTR)的寄存器(容易吗?)
【发布时间】:2012-04-26 20:23:19
【问题描述】:

我刚开始尝试了解 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 位。问题仅仅是我不能使用结构作为输出目标吗?否则我该怎么办?另外,由于资源(根据我的发现)一直很稀缺,任何人都可以推荐一本关于该主题的好教程或书籍吗?

谢谢。

【问题讨论】:

    标签: c gcc x86 kernel inline-assembly


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我知道这很简单(我混淆了 lidt 和 sidt 有点尴尬)。很明显,我是在倒退。感谢您的帮助。
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2014-09-19
    • 2014-07-06
    • 2014-04-16
    • 1970-01-01
    • 2021-08-27
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多