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

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

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

void SetX(int x)
{
x = ;
} int _tmain(int argc, _TCHAR* argv[])
{
SetX();//1.直接传数值 int x = ;
SetX(x);//2.传一个有初始值的变量
return ;
}

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

第一种情况:

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

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

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

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

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

这个例子里,第一个函数调用没有赋值的动作,且看对应的汇编代码:

 push
call SetX (012811EAh)
add esp,

这个情况看起来就如果本身就不带返回值的情况。看起来没法这样分辨了,但是其实如果是这样调用,不就个没带返回值效果是一样的了。判别有没有返回值已经没有意义了。

 push
call SetX (012811EAh)
add esp,
mov dword ptr [x],eax
xor eax,eax

上面的第二种情况,则明显多了一个mov指令。在调用完函数之后,立马来个mov,显然是返回了一个值存于eax,需要立即保存在地址x的内存里。很明显是带返回值的。

3.参数传递中值传递和引用传递的区别

void SetX(int x)
{
x++;
}
void SetY(int &y)
{
y++;
} int _tmain(int argc, _TCHAR* argv[])
{
int x = ;
int y = ;
SetX(x);//1.值传递,x的值不会变
SetY(y);//2.引用传递,y的值会产生变化
return ;
}

在汇编码里,更容易看出两个函数的不同
对于第一个函数:

 mov         eax,dword ptr [x]
push eax
call SetX (01611F4h)
add esp,

明显是将地址为x的内存里的值传入eax,再经由eax传给函数。而对于第二个函数,先是用lea取一块有效的内存区域用于存储计算过程中生成的结果。然后将这个刚刚建立的内存区域的地址传给eax,以便可以直接操作y区域的内存。

 lea         eax,[y]
push eax
call SetY (01611EFh)
add esp,
xor eax,eax

这几个小细节在汇编,甚至反汇编的时候非常有使用价值。

最新文章

  1. Xcode8控制台乱码的解决方式
  2. oracle 中数据库完全导入导出:cmd命令行模式(转载)
  3. angularjs的resource实例对象
  4. hdu1686 KMP
  5. Windows环境下配置Vim为Python的IDE
  6. strip_tags,htmlspecialchars,htmlentities,stripslashes,addslashes学习小结
  7. Ununtu 12.04 gedit安装插件Source Code Browser
  8. 疯狂的表单-html5新增表单元素和属性
  9. MVC4.0系统开发新手历程(一)
  10. Windows 安装Mongoliadb
  11. 利用NSURLSession完成的断点续传功能
  12. python基础-循环
  13. python中的函数(定义、多个返回值、默认参数、参数组)
  14. Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
  15. 桥接模式-Bridge(Java实现)
  16. 支付宝红包口令自动复制到剪贴板脚本js,安卓,IOS通用版
  17. JS的splice()方法在for循环中使用可能会遇到的坑
  18. 第一个Python游戏窗口
  19. ASP.NET MVC 3 笔记
  20. dict-test

热门文章

  1. 学习笔记之Django
  2. Float型 与 Double型数据的存储方式
  3. ip协议栈
  4. Executor的线程代码
  5. 使用composer命令加载vendor中的第三方类库
  6. Tomcat get请求中文参数乱码
  7. pyqt5--TableWidGet
  8. delay timer的wrap around
  9. 折腾deepin修改终端语言
  10. Android PKMS服务