gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:25:36 25 4
gpt4 key购买 nike

我刚刚开始尝试了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com