"(*(void(*)())0)(); 和 for(;;) Function();"这个帖子的主人来给指点下
下面这段话是你在帖子中的有的原话,我有些想不明白, "我在VC6中,先编译一编,得到LABLE的地址. "这句话什么意思,得到的是什么地址?内存地址好像在编绎时得不到吧,应该在运行时才能确定的吧,希望给点指教.
===================================================
zhujiujun ( < < < < < < < <动感光波> > > > > > > > )
其实用 "(*(void(*)())Address)(); "这个就可以跳出来.
我发帖的时候刚好看到它,便想起了第2个问题.
例如:
for (;;)
Function();
LABLE:
...
只需要知道LABLE的地址,就可以在Function中调用(*(void(*)())Address)();
跳到LABLE的位置,执行后面的程序.
我在VC6中,先编译一编,得到LABLE的地址,然后把该地址给Address.即可以实现.
但是这种方法也只能是一种取巧了.
Chiyer(星羽) 的longjmp确实不错,但是不知道会不会产生什么问题.继续研究一下
===========================================================
[解决办法]
这个,你得了解编译方面的知识了。
对你稍深了点,跳过吧。
不要好奇心太强,有太多更重要的东西要学呢。
[解决办法]
得到这个标签的地址
其实也就是下面执行代码的地址空间
最终的确立在连接和加载期决定的
编译好像不扫描相互依赖的关系
[解决办法]
呵呵,原帖的帖主应聘的应该是一个嵌入式的公司.
嵌入式系统里面应该有不少用这种手法的.
[解决办法]
LABLE最终就是一个地址,就是循环后面的那一句。(*(void(*)())LABLE)()就是执行修改PC的为LABLE,实现了程序的跳转
[解决办法]
有兴趣google PE文件格式 参考参考就知道了。