以下小结纯属小菜自学过程产生的dump,大神请飘过!

    汇编是一门庞大复杂的学问,在计算机的世界里差不多无所不入。很多编程领域都会或多或少跟汇编打交道。本人不是科班出身的程序员,所以很多基础都为零,学历也很低。因此学习汇编的难度可想而知。不过还是凭自己的耐力,掌握了少许的知识。下面做个小小的总结,分享给和我一样想入门汇编的朋友们。

   1.参数直接传值和传入数值变量的区别

void SetX(int x)
{
    x = 6;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SetX(7);//1.直接传数值

    int x = 7;
    SetX(x);//2.传一个有初始值的变量
    return 0;
}

这两种情况运行的结果没有任何区别,但是汇编代码却有些细微的区别:

第一种情况:

 push        7  
 call        SetX (01011E5h)  //1.直接传值
 add         esp,4  //栈指针向下移动

第二种情况多了一个将及时数缓存于内存x的步骤:

 mov         dword ptr [x],7  //首先将及时数7传入双字型内存地址为x的内存中
 mov         eax,dword ptr [x]  //然后再将x里的值传到eax寄存器里
 push        eax   //开始压入参数值
 call        SetX (01011E5h)  
 add         esp,4  //栈指针向下移动,清除变量
 xor         eax,eax  //清空eax的值

2.有返回值与没返回值的区别
在c++或其他高级语言,我们可以一眼看出返回值和返回类型。但是汇编里貌似有些乱。在上面的例子里,Call完SetX之后,后面就紧跟着开始清除变量值。这个还不能说明有没有返回值。再来看一个例子就能明显分辨有没有返回值了。

int SetX(int x)
{
    x = 6;
    return x;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SetX(7);//1.有返回值,但是没有引用
    int x=SetX(7);//2.有返回值,并且引用了
    return 0;
}
View Code

相关文章: