以下的ide为CodeBlocks,编译器采用的GCC,系统为win10 64bit,在不同编译器和环境下汇编代码可能不同
现象
|
|
上面这段代码是比大小输出小的,typedef int (*pfunction)(int, int);
定义了一个函数指针,但是下面这段代码和上面的功能是完全一样的
|
|
原因分析
当c = pGetmin(a, b);
调用pGetmin的时候,在汇编中是先call跳到一个地址然后从那个地址再jmp到函数入口地址然后开始执行函数
getmin函数整体汇编为
|
|
通过一些调试程序(发现CodeBlocks带的汇编调试没有vc6好用,看不到硬编码)可以得出这段汇编代码在硬编码中的值为
|
|
这段数据我们在第二个代码中把它存入了一个char类型的数组,它虽然在数据区,但是它还是可以看作可运行的一段函数代码,我们依旧定义一个函数指针指向这个char类型数组的入口地址,达到了和第一种相同的效果 在编程中,我们是把代码和数据分得很开的,但是在逆向和汇编中,这个区别就不明显了,在计算机中都是以数据形式存在的,你可以说它是一串数据,也可以说它是代码
转载请注明出处