我正在尝试将程序计数器(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设置为该函数的地址外,还可以将函数调用编译成什么?
由于
答案 0 :(得分:1)
这实际上取决于您要定位的硬件,但它可能会编译为与任何其他函数指针调用相同的东西。编译器也可以识别给reset
的常量值,并对其进行优化。如果没有别的,你可以随时做:
((void (*)())NULL)();
基本上将NULL
强制转换为void
类型的无参数函数。
调用是否成功完全是另一回事:在大多数使用虚拟内存的平台上,内核有目的地留下NULL
地址+未映射的一些空间(可能是几KB,也许是几MB) 。您的指令指针可能仍会变为0,但只要CPU尝试从该地址获取指令, KABOOM 。