以下小结纯属小菜自学过程产生的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

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

[asm] 小菜汇编基础和学习技巧小结(一)的更多相关文章

  1. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  2. 零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧

    云计算概念一旦产生便一发不可收拾,成为移动互联网时代最为火热的行业之一.国内各大互联网公司例如阿里.腾讯.百度.网易等纷纷推出自己的云计算产品,3月10日,腾讯云0.01元投标时间更是让云计算在普罗大 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》5-7章:汇编基础

    第5-7章感觉是这一本书中比较奇怪的章节,可能是作者考虑到读者人群水平的差异,故意由浅入深地讲如何在屏幕上显示字符和使用mov,jmp指令等等,但是这样讲的东西有点重复,而且看了第六,第七章以后,感觉 ...

  4. CentOS系统中的passwd命令实用技巧小结

    这篇文章主要介绍了Linux系统中的passwd命令实用技巧小结,是Linux入门学习中的基础知识,需要的朋友可以参考下   先来回顾一下passwd命令的基本用法: Linux passwd命令用来 ...

  5. [pwn基础]Pwntools学习

    目录 [pwn基础]Pwntools学习 Pwntools介绍 Pwntools安装 Pwntools常用模块和函数 pwnlib.tubes模块学习 tubes.process pwnlib.con ...

  6. 老司机浅谈linux系统学习技巧

    Linux起源于20世纪70年代,是一种优秀的操作系统系统.初次接触到linux这个系统是在大学期间,这样才发现除了windows外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它 ...

  7. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

  8. GCC基础知识学习

    GCC基础知识学习 一.GCC编译选项解析 常用编译选项 命令格式:gcc [选项] [文件名] -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -c:仅执行编译操作,不进行连接操作: -o ...

  9. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

随机推荐

  1. ajax往后台传值的一些方式

    $('#del1').click(function () { $.ajax({ url: 'http://localhost:8089/test1', data: {a: 1, b: 2}, type ...

  2. 关于SQL中的 where 1 = 1 的用法

    在项目中的常见的一个操作:在有关SQL的代码中加入where 1 = 1,关于它的用法,可以总结如下: 首先,where 1 = 1的用法往往是为了方便后续的给SQL增加where限制条件.如果实现加 ...

  3. mac php Swoole入门

    一. swoole 扩展安装 安装前必须保证系统已经安装了下列软件 php-7.0 或更高版本 gcc-4.8 或更高版本 make autoconf pcre (CentOS系统可以执行命令:yum ...

  4. k8s管理存储资源

    1. Kubernetes 如何管理存储资源 理解volume 首先我们学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Vol ...

  5. CentOS7 开机提示Initial setup of CentOS Linux 7 (Core)

    一.开机以后提示信息如下 二.解决方法 . 输入1,按Enter同意许可协议 . 输入2,按Enter同意许可协议 . 输入q,按Enter退出 . 输入yes,按Enter确定 . 完成重启后即可正 ...

  6. PAT 乙级 1008.数组元素循环右移问题 C++/Java

    1008 数组元素循环右移问题 (20 分) 题目来源 一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A​0​​A​1​​⋯ ...

  7. Linux学习26-linux查看某个时间段的日志(sed -n)-史上最详细

    前言 在linux上查找日志的时候,如果我想找出某个时间段的日志,比如查找今天早上8点到下午2点的日志. 用grep不太方便直接过滤出来,可以使用sed根据时间去查找 sed -n '/开始时间日期/ ...

  8. 第六篇 -- LINQ to XML

    一.LINQ to XML常用成员 LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元 ...

  9. 什么是 MFA?

    Multi-Factor Authentication (MFA) 是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护. 启用 MFA 后,用户登录阿里云网站时,系统将要 ...

  10. Easyui 验证验证扩展,限制combobox 只能输入选项内容

    $.extend($.fn.validatebox.defaults.rules, { CHS: { validator: function (value, param) { return /^[\u ...