【发布时间】:2014-08-13 17:56:39
【问题描述】:
我正在尝试将程序计数器(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 设置为该函数的地址之外,函数调用还可以编译成什么?
谢谢
【问题讨论】:
-
你期望它做什么?我预计那会崩溃。
-
@dohashi:崩溃没有问题,但我希望看到 PC 寄存器在崩溃前被设置为 0。
-
你在实践中观察到了什么?
-
在汇编程序中执行此类操作的标准方法是
push 0; ret;。 IIRC,一些处理器在开机时或中断后以 IP=0 启动。 -
您的代码导致我的
$pc归零...
标签: c compiler-construction compilation program-counter