gpt4 book ai didi

c - 奇怪的行为 - 获取 GDT @ 内联程序集

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:15 27 4
gpt4 key购买 nike

在我开始之前,这里提到的所有代码都在运行@ring0(内核模式)- OSX 10.9:

以下函数崩溃:

UINT64 GetGdtBase()
{
UINT64 gdt = 0;
asm("sgdt %0\n" ::"m"(gdt));
return gdt >> 16;
}

以下函数运行良好:

UINT64 GetGdtBase(UINT64* result)
{
asm("sgdt %0\n" ::"m"(*result));
*result >>= 16;
return *result;
}

嗯,这对我来说看起来有点滑稽和奇怪,但也许你们会发现我在这里做的有问题。

很想听听一些建议。

谢谢

最佳答案

在长模式(64 位代码)中,sgdt 指令存储一个 64 位“GDT 线性地址”和一个 16 位“GDT 限制”。这占用 10 个字节,不适合 UINT64。

对于代码的第一个版本,您会破坏堆栈。很可能会破坏函数的返回地址并导致崩溃。

对于您的代码的第二个版本,您仍然会破坏一些东西;但不管怎样,被丢弃的东西可能都不会被使用。

关于c - 奇怪的行为 - 获取 GDT @ 内联程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212517/

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