将程序计数器(AKA指令指针)重置为0

时间:2014-08-13 17:56:39

标签: c compiler-construction compilation program-counter

我正在尝试将程序计数器(AKA指令指针)重置为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设置为该函数的地址外,还可以将函数调用编译成什么?

由于

1 个答案:

答案 0 :(得分:1)

这实际上取决于您要定位的硬件,但它可能会编译为与任何其他函数指针调用相同的东西。编译器也可以识别给reset的常量值,并对其进行优化。如果没有别的,你可以随时做:

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

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


调用是否成功完全是另一回事:在大多数使用虚拟内存的平台上,内核有目的地留下NULL地址+未映射的一些空间(可能是几KB,也许是几MB) 。您的指令指针可能仍会变为0,但只要CPU尝试从该地址获取指令, KABOOM