首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

“确定被调用的宿主有关问题”各种语言版大征集

2012-06-25 
“确定被调用的宿主问题”各种语言版大征集!C语言版:需要尽量简单地设置编译链接选项。VC6http://topic.csdn.

“确定被调用的宿主问题”各种语言版大征集!
C语言版:需要尽量简单地设置编译链接选项。VC6
http://topic.csdn.net/u/20120530/05/A9E5E49E-940A-44AE-96A5-A0E7DB986C10.html

C/C++ code
#include <stdio.h>void whocallme();void fun1() {    whocallme();}void fun2() {    whocallme();}void fun3() {    fun1();}void whocallme() {    int *_esp,i;    __asm {        mov eax,esp        mov _esp,eax    }    printf("\nfun1,fun2,fun3,_esp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_esp);    for (i=0;i<100;i++) if (_esp[i]==(int)_esp) break;    if (i<100) {        printf("ret addr=%08x\n",_esp[i+2]);        if ((int)fun1<=_esp[i+2] && _esp[i+2]<(int)fun2) printf("fun1 callme\n");        if ((int)fun2<=_esp[i+2] && _esp[i+2]<(int)fun3) printf("fun2 callme\n");    }}void main() {    fun2();    fun1();}//C:\tmp\tmp\Debug>tmp////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040102e//fun2 callme////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040100e//fun1 callme////C:\tmp\tmp\Debug>cd ..\release////C:\tmp\tmp\Release>tmp////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401012//fun2 callme////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401008//fun1 callme//


欢迎大家在下面踊跃给出其它语言版:

[解决办法]
赵老师发帖,顶起!
[解决办法]
探讨

赵老师发帖,顶起!

[解决办法]
赵老师发帖,顶起!
[解决办法]
赵大侠一向很牛X
[解决办法]
不懂,支持赵老师一个
[解决办法]
看到LZ的帖子,我只能说我被雷到了,我每天大部分时间会接触不同平台的汇编语言(至少两种,算法,没办法,不是我想),但我不会想到居然用汇编 ---- 不同平台光改汇编就改死你;这么简单的问题为什么搞得如此的复杂,怪不得外行人都说IT很复杂呢;假设这个程序不是你写的,出问题的函数是客户的(你无法加whocallme)?假设现在不是VC6++呢,用户偏偏喜好GCC呢?。。。
这个帖子已经回复:http://topic.csdn.net/u/20120530/05/a9e5e49e-940a-44ae-96a5-a0e7db986c10.html?seed=1214750586&r=78880293#r_78880293
实际可适用语言不止c/c++;
[解决办法]
看不懂啊,还得继续努力!

热点排行