【汇编】汇编中的函数
前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是DTDEBUG。
1、什么是函数?
在汇编中,函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。
下面这四行指令就算是一个函数了:
该函数的功能就是往寄存器里赋值。
2、如何调用函数?
什么是调用函数?
首先需要保证,调用函数就该有返回操作,也就是说,我们执行完函数中的指令之后,应该返回到原来调用该函数的指令地址的下一条继续执行。所以有如下两种方法实现函数返回:
<1>使用jmp指令实现函数返回
我们可以在EIP对应的地址写入jmp指令,跳转到函数执行地,然后执行完函数中的指令之后,再次使用jmp调回来,如下:
通过两条jmp指令,我们就可以实现简单的函数调用和返回了,但是不推荐使用JMP指令。
原因:假设,我们在下面还有一个地方需要调用这个函数呢?因为我们也说了,函数就是为了完成某个会重复使用的功能,所以如果发生如下情况,jmp就不好使了。
所以不推荐使用JMP指令调用函数。
<2>使用call指令调用函数
通过上面的操作,即使再加一个call调用,遇到ret还是返回到当前call指令的下一步继续执行,所以call指令+ret指令简直就是完美的函数调用指令。
3、封装任意两数相加的函数
我大致讲一下通用寄存器大多数的用途:
目前本教程不讨论这些,关于寄存器以后会继续发文章。
所以我将使用ecx,edx作为函数参数,将两数之和存入eax中,如下:
这就是函数的内容,没有想象的那么复杂吧。
调用函数:
一个call指令就够了。
函数传参:
假设我们要做的是计算1+2,那么在调用函数前将1存入ecx,2存入edx就行了,如下:
下面单步步过F8执行即可,观察结果如下:
成功。
总结:以上便是汇编中函数的存在形式,以及如何调用函数,一定要记住函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。
至此,文章介绍,感谢收看。
【汇编】汇编中的函数相关推荐
- C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...
C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...
- 汇编语言调用c语言ads,ADS1.2 在汇编代码中调用C函数
EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x , U) b) }+ U8 \" d/ v( \$ ~ T对于ARM体系来说,不同语言撰写的函数之间相互调用( ...
- c语言如何实现全部参数加9,从C语言到汇编(九)函数参数
C语言参数依照从右到左的顺序依次传入栈中.有几个参数就传入几个参数. int fun(int a,int b) { return a-b; } int main(void) { fun(5,-1); ...
- linux smp lock 锁总线 内嵌汇编,gcc中的内嵌汇编语言(Inteli386平台)
gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的.有些汇编语言代码是直接写在汇 编源程序 ...
- 【3分钟秒懂】结合汇编代码解析C函数入参与PowerPC芯片寄存器的关系
目录 1. PowerPC 通用寄存器简介 2. 代码实例解析C函数入参与芯片寄存器的关系 3. 总结 本文没有面面俱到地解释每一个PowerPC寄存器,只抽取相关的寄存器结合汇编代码解析C函数入参与 ...
- 注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0
注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0. 真是忽然明白呀. 这是因为编译器不理解以字母开头的东西的.[加上0是没有什么意义的,所以加上0也不会影响程序执行!]
- 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result
为什么80%的码农都做不了架构师?>>> //在汇编代码中使用 Result function Fun(x: Integer): Integer; asmmov ecx, &a ...
- c++ 代码_C代码对汇编代码中声明的全局符号的访问方式详解
首先声明一点:符号的值是地址,该地址上存储的值才是变量,不明白的话看另一篇文章: "静态链接与动态链接的宏观概述及微观详解". (1)对非数组符号的访问,编译器生成访存指令,要想寻 ...
- C中printf函数的实现原理
一.printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机 ...
最新文章
- 如何使用MERGE(合并)SQL
- 让批处理运行不显示窗口的两个方法
- 学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?...
- Linux网络常用工具分类介绍
- SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作
- 年度迷惑新闻:美女其实是个男生?
- LeetCode: Word Ladder
- (转)一个百倍股的坠落:那个曾经满大街的ESPRIT是如何衰败的
- 【docker】docker学习
- Day12:一元N次方程的根(略窥群论一二)
- BouncyCastle使用注意事项
- 【JAVA】xml文件的读取
- JavaScript:实现将 base64 字符串转换为字节数组算法(附完整源码)
- 文件系统大目录下的操作性能效率提升
- db2iupgrade失败:DBI1205E One or more local databases cannot be upgraded
- 这8大技术趋势,将塑造未来科技行业格局
- 【技术分享】五:搜索排序-特征分析
- 视频教程-微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-微信开发
- MAX31856 高精度热电偶至数字输出转换器开发笔记
- 井号法(#)创建二叉树(利用前序遍历来建树)C++实现
热门文章
- 一起来看看苹果新款MacBook:CPU质变
- 云计算概念及Linux系统详解
- 【2013水王争霸赛】啊!
- python的图标是什么_python标志
- 将C盘的软件已经移到了D盘,为什么C盘还是会出现变红或饱满的状态?
- 数字电路逻辑设计笔记(3):集成逻辑门电路
- java解析宏文件,从命令行或批处理文件运行Excel宏的方法?
- 46. 孩子们的游戏-圆圈中最后剩下的数字
- echart 折线从左到右动画效果_echarts多条折线图动态分层的实现方法
- Vivado使用技巧(17):时序异常 Timing Exception