前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是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执行即可,观察结果如下:

成功。

总结:以上便是汇编中函数的存在形式,以及如何调用函数,一定要记住函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。

至此,文章介绍,感谢收看。

【汇编】汇编中的函数相关推荐

  1. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  2. 汇编语言调用c语言ads,ADS1.2 在汇编代码中调用C函数

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x , U) b) }+ U8 \" d/ v( \$ ~  T对于ARM体系来说,不同语言撰写的函数之间相互调用( ...

  3. c语言如何实现全部参数加9,从C语言到汇编(九)函数参数

    C语言参数依照从右到左的顺序依次传入栈中.有几个参数就传入几个参数. int fun(int a,int b) { return a-b; } int main(void) { fun(5,-1); ...

  4. linux smp lock 锁总线 内嵌汇编,gcc中的内嵌汇编语言(Inteli386平台)

    gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的.有些汇编语言代码是直接写在汇 编源程序 ...

  5. 【3分钟秒懂】结合汇编代码解析C函数入参与PowerPC芯片寄存器的关系

    目录 1. PowerPC 通用寄存器简介 2. 代码实例解析C函数入参与芯片寄存器的关系 3. 总结 本文没有面面俱到地解释每一个PowerPC寄存器,只抽取相关的寄存器结合汇编代码解析C函数入参与 ...

  6. 注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0

    注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0. 真是忽然明白呀. 这是因为编译器不理解以字母开头的东西的.[加上0是没有什么意义的,所以加上0也不会影响程序执行!]

  7. 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result

    为什么80%的码农都做不了架构师?>>>    //在汇编代码中使用 Result function Fun(x: Integer): Integer; asmmov ecx, &a ...

  8. c++ 代码_C代码对汇编代码中声明的全局符号的访问方式详解

    首先声明一点:符号的值是地址,该地址上存储的值才是变量,不明白的话看另一篇文章: "静态链接与动态链接的宏观概述及微观详解". (1)对非数组符号的访问,编译器生成访存指令,要想寻 ...

  9. C中printf函数的实现原理

    一.printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机 ...

最新文章

  1. 如何使用MERGE(合并)SQL
  2. 让批处理运行不显示窗口的两个方法
  3. 学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?...
  4. Linux网络常用工具分类介绍
  5. SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作
  6. 年度迷惑新闻:美女其实是个男生?
  7. LeetCode: Word Ladder
  8. (转)一个百倍股的坠落:那个曾经满大街的ESPRIT是如何衰败的
  9. 【docker】docker学习
  10. Day12:一元N次方程的根(略窥群论一二)
  11. BouncyCastle使用注意事项
  12. 【JAVA】xml文件的读取
  13. JavaScript:实现将 base64 字符串转换为字节数组算法(附完整源码)
  14. 文件系统大目录下的操作性能效率提升
  15. db2iupgrade失败:DBI1205E One or more local databases cannot be upgraded
  16. 这8大技术趋势,将塑造未来科技行业格局
  17. 【技术分享】五:搜索排序-特征分析
  18. 视频教程-微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-微信开发
  19. MAX31856 高精度热电偶至数字输出转换器开发笔记
  20. 井号法(#)创建二叉树(利用前序遍历来建树)C++实现

热门文章

  1. 一起来看看苹果新款MacBook:CPU质变
  2. 云计算概念及Linux系统详解
  3. 【2013水王争霸赛】啊!
  4. python的图标是什么_python标志
  5. 将C盘的软件已经移到了D盘,为什么C盘还是会出现变红或饱满的状态?
  6. 数字电路逻辑设计笔记(3):集成逻辑门电路
  7. java解析宏文件,从命令行或批处理文件运行Excel宏的方法?
  8. 46. 孩子们的游戏-圆圈中最后剩下的数字
  9. echart 折线从左到右动画效果_echarts多条折线图动态分层的实现方法
  10. Vivado使用技巧(17):时序异常 Timing Exception