你的分享就是我们的动力 ---﹥

关于后缀的反汇编进栈形式

时间:2014-08-22 18:28来源:www.chengxuyuans.com 点击:
关于后缀的反汇编入栈形式
先看c语言的代码:
#include "stdio.h"
void budong(int a);
void main()
{
    int i=3;
int g=0;
    budong( i++ );
}

void budong(int a )
{
printf("%d",a);
}


   它的反汇编代码如图所示:
   看哪个红线框内,执行顺序是:
第1步——取出i的值,移动给寄存器eax   。
第2步——取出eax的值,移动到 机器内存为 【ebp-0Ch】 的位置。
第3步——取出【ebp-0Ch】那个个位置里面的值,移动给寄存器ecx  。
第4步——把ecx压入栈里。
  相信大家都看的出来,这四个步骤,至少有两步是脱裤子放屁多此一举,比如,完全可以省略成【取出i的值,移动给寄存器eax,然后直接把eax压入栈里,完事。。。就像下面这张图片一样:  其实这个代码唯一的区别就是源代码中的i++变成i】


   我想问的是:在调用函数budong时,为什么传递参数是i++时,机器会多运行一些可有可无的步骤【第2步和第3步】?它们的存在有什么意义??
------解决方法--------------------
缺省配置的Debug 版本,按部就班的执行,
C,C++语义,没有做优化。
有冗余代码是正常的。
缺省配置的Release 版本才会做优化。
VC缺省配置的Debug 版本,不做优化,严格按照C,C++代码的语义,编译。
从而保证 逻辑正确,语义正确。这是必要的。
这可以保证,不会有其他原因,引出的错误,干扰编译结果。
冗余代码消除,属于编译优化的工作,对Debug 版本,不是必要的。 

转载注明地址:http://www.chengxuyuans.com/Hardware/assembly-language/80544.html