[asm] 小菜汇编基础和学习技巧小结(一)
以下小结纯属小菜自学过程产生的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] 小菜汇编基础和学习技巧小结(一)的更多相关文章
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- 零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧
云计算概念一旦产生便一发不可收拾,成为移动互联网时代最为火热的行业之一.国内各大互联网公司例如阿里.腾讯.百度.网易等纷纷推出自己的云计算产品,3月10日,腾讯云0.01元投标时间更是让云计算在普罗大 ...
- ASM:《X86汇编语言-从实模式到保护模式》5-7章:汇编基础
第5-7章感觉是这一本书中比较奇怪的章节,可能是作者考虑到读者人群水平的差异,故意由浅入深地讲如何在屏幕上显示字符和使用mov,jmp指令等等,但是这样讲的东西有点重复,而且看了第六,第七章以后,感觉 ...
- CentOS系统中的passwd命令实用技巧小结
这篇文章主要介绍了Linux系统中的passwd命令实用技巧小结,是Linux入门学习中的基础知识,需要的朋友可以参考下 先来回顾一下passwd命令的基本用法: Linux passwd命令用来 ...
- [pwn基础]Pwntools学习
目录 [pwn基础]Pwntools学习 Pwntools介绍 Pwntools安装 Pwntools常用模块和函数 pwnlib.tubes模块学习 tubes.process pwnlib.con ...
- 老司机浅谈linux系统学习技巧
Linux起源于20世纪70年代,是一种优秀的操作系统系统.初次接触到linux这个系统是在大学期间,这样才发现除了windows外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它 ...
- 20145308 《网络对抗》 逆向及BOF基础实践 学习总结
20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...
- GCC基础知识学习
GCC基础知识学习 一.GCC编译选项解析 常用编译选项 命令格式:gcc [选项] [文件名] -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -c:仅执行编译操作,不进行连接操作: -o ...
- (转)Linux基础知识学习
Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...
随机推荐
- [摘抄] 4.require命令
4.require命令 1. 基本用法 Node适用CommonJS模块规范,内置的require命令用于加载模块文件. require命令的基本功能是,读入并执行一个JavaScript文件,然后返 ...
- 06-Vue路由
什么是路由 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有 ...
- 机器学习笔记4:SVM支持向量积的推导过程
内容来自:https://github.com/GreedyAIAcademy/Machine-Learning 最初 支持向量机的目的:找到一条好的分割线 什么杨的分割线最好? 有最大间隔的分割线最 ...
- Socket网络编程-SocketServer
Socket网络编程-SocketServer 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SocketServer概述 socket编程过于底层,编程虽然有套路,但是想要写 ...
- Linux无法免密登录的原因
一.免密登录的方法 下面操作是把/root/.ssh/id_dsa.pub文件内容追加到192.168.7.100系统中的/root/.ssh/authorized_keys文件中 # 创建并发送密钥 ...
- win7 创建vhd提示“找不到指定文件的虚拟磁盘支持提供程序”解决方法
本文参照:https://itbbs.pconline.com.cn/diy/16509116_2.html 14楼中"坚持不放弃"用户的答案得到解决 问题复现: 1.window ...
- 第七篇 -- XmlReader 和 XmlWriter
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- Laravel5.4框架中视图共享数据的方法详解
本文实例讲述了Laravel5.4框架中视图共享数据的方法.分享给大家供大家参考,具体如下: 每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图 ...
- egg 阻止 sql 注入,相关文章
egg 阻止 sql 注入,相关文章 网址 注意!!我们极其不建议开发者拼接 sql 语句,这样很容易引起 sql 注入!!如果必须要自己拼接 sql 语句,请使用 mysql.escape 方法. ...
- 如何开发一个异常检测系统:异常检测 vs 监督学习
异常检测算法先是将一些正常的样本做为无标签样本来学习模型p(x),即评估参数,然后用学习到的模型在交叉验证集上通过F1值来选择表现最好的ε的值,然后在测试集上进行算法的评估.这儿用到了带有标签的数据, ...