gpt4 book ai didi

c - 将程序计数器(又名指令指针)重置为 0

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

我正在尝试将程序计数器(又名指令指针)重置为 0。

我原以为以下 C 代码可以工作(但没有):

typedef void(*func)();
func reset = NULL;
reset();

这是使用VS2013编译器时的反汇编:

mov  dword ptr[reset],0
mov esi,esp
call dword ptr[reset]

我意识到这个问题不是由C语言标准决定的,而是特定编译器实现的问题。尽管如此,我希望它在每个像样的编译器上都能正常工作。

除了将 PC/IP 设置为该函数的地址之外,函数调用还可以编译成什么?

谢谢

最佳答案

这实际上取决于您所针对的硬件,但它可能会编译为与任何其他函数指针调用相同的内容。编译器还可以识别赋予 reset 的常量值,并对其进行优化。如果没有别的事,你总是可以这样做:

((void (*)())NULL)();

它基本上将 NULL 转换为 void 类型的无参数函数。

<小时/>

调用是否成功是完全不同的事情:在大多数使用虚拟内存的平台上,内核故意留下NULL地址+一些未映射的空间(可能是几KB,可能是一个几MB)。您的指令指针可能仍会指向 0,但一旦 CPU 尝试从该地址获取指令,KABOOM

关于c - 将程序计数器(又名指令指针)重置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293010/

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