ff 15 和e8都是用来调用函数的机器码,看一个例子:
218 f9ebc53a 6a00                  push    0
218 f9ebc53c ff1500c9ebf9    call    dword ptr [APC!PspExitThread_Addr (f9ebc900)]
219 f9ebc542 a100c9ebf9      mov     eax,dword ptr [APC!PspExitThread_Addr (f9ebc900)]
219 f9ebc547 50                      push    eax
219 f9ebc548 68f0c4ebf9     push    offset APC!GetPspExitThreadAddr+0xee (f9ebc4f0)
219 f9ebc54d e872020000     call    APC!DbgPrint (f9ebc7c4)
219 f9ebc552 83c408              add     esp,8
220 f9ebc555 e870020000     call    APC!KeGetCurrentThread (f9ebc7ca)
220 f9ebc55a 8945fc               mov     dword ptr [ebp-4],eax
221 f9ebc55d 8b4dfc               mov     ecx,dword ptr [ebp-4]
221 f9ebc560 51                      push    ecx
221 f9ebc561 680cc5ebf9      push    offset APC!GetPspExitThreadAddr+0x10a (f9ebc50c)
221 f9ebc566 e859020000    call    APC!DbgPrint (f9ebc7c4)
221 f9ebc56b 83c408             add     esp,8

222 f9ebc56e 6a00                 push    0
222 f9ebc570 8b5508             mov     edx,dword ptr [ebp+8]
222 f9ebc573 52                     push    edx
222 f9ebc574 ff1508c8ebf9   call    dword ptr [APC!_imp__ExFreePoolWithTag (f9ebc808)]

APC!KillThreadRoutine+0x4d [f:/dvs/apc/apc.c @ 224]:
224 f9ebc57a 8be5                mov     esp,ebp
224 f9ebc57c 5d                     pop     ebp
224 f9ebc57d c21400            ret     14h
看上面的代码得到的结果是:
ff 15 调用时后面直接跟的是函数地址,并且不需要主调函数来平衡堆栈(即不需要在主调函数中使用add esp,xxh)
e8调用时后面跟的是函数地址相对于当前地址的偏移量,并且需要主调函数来实现堆栈平衡(即需要在主调函数中添加add esp,xxh),这个xxh当然是等于调用函数前push了多少字节的参数)
但是不知道还有没有其他的区别了...

PS:

call 一个near过程,只把偏移地址压入堆栈,过程返回时用retn返回
call一个far过程,把偏移地址和段地址入栈,过程返回时用retf返回

在过程中的ret指令根据near和far的不同,分别编译成retn和 retf
retn和retf的机器码是不同的,你也可以不定义过程,直接用retn和retf

ff 15 调用函数与e8调用函数的区别 call的两种二进制命令相关推荐

  1. 函数fopen()形参之文件名使用的① ②两种情况

    本文主要讲:函数fopen()形参之文件名使用有① ②两种情况 案例要求: ①从键盘输入字符,逐个 存到磁盘文件中,直到 输入'#"为止 ②读文本文件内容, 并显示 ③文件拷贝 好,开讲: ...

  2. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

  3. Opencv画图函数整理 及 cvCircle cvLine 只能画出黑白两种颜色问题 解决

    一句话:用这些画图函数在RGB图上画,则能画出来彩色. 如果您在灰度图上画 则无论怎么设置color都只能画出黑白两种颜色. 就这一句话搞了我一个晚上,惭愧! Opencv绘图函数:http://ww ...

  4. PythonC++相互混合调用编程全面实战-18c++给python传递变量的两种方法

    作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

  5. html表单调用js方法,使用js提交form表单的两种方法

    提交form表单的时候瑶族一些简单的验证,验证完后才能提交,避免无效提交. 1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在前端页面写:有两种方法,一种是用sub ...

  6. lwIP 细节之三:TCP 回调函数是何时调用的

    使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数.将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调. 注:除非特别说明,以下内容 ...

  7. 【Django】项目中调用深度学习模型model.predict()(Django两种启动方式runserver和uwsgi的区别)

    目录 问题 测试 解决方法 Django两种启动方式runserver和uwsgi的区别 问题 部署含有深度学习模型的Django项目的uWSGI.Nginx服务器的时候,所有模块都可以正常运行,也可 ...

  8. Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)

    分享知识 传递快乐 1.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.Shell 函数定义的语法格式如下: [function] funname [()]{函 ...

  9. 简单Case函数和Case搜索函数的区别

    简单Case函数和Case搜索函数的区别 Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' TH ...

最新文章

  1. 【组队学习】【24期】数据挖掘实践(智慧海洋)
  2. iOS,macOS,darwin,unix 简介
  3. Runtime.exec 调用OS命令特例
  4. 5.1 实验五 四则运算单元测试
  5. SQL -- 是否或推断线相交以在其内部的平面
  6. hana修改字段_自定义SAP HANA登陆界面背景
  7. VTK:可视化算法之SpikeFran
  8. springmvc 重定向传递参数
  9. SQL-22 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum...
  10. java 时间处理经典案例
  11. 初始化参数之memory_target
  12. java拆分日期_Java根据控制台输入的特定日期格式拆分日期
  13. 读取ANSYS结果文件中的数据C语言,[转载][转载]如何在ANSYS中读入txt文件的数据
  14. TLS 各种加密套件
  15. Ubuntu换源-阿里源
  16. linux 验证码 权限,linux 上验证码无法显示
  17. 【DBA】 Oracle 学习路线
  18. vartualBox安装oracle数据库
  19. 孙陶然:企业需要建立自己的人才标准体系
  20. docker centos + pbx

热门文章

  1. 【调剂】浙江理工大学2020年硕士研究生调剂信息
  2. 安兔兔html5测试排名,10部手机安兔兔跑分测试:都是骁龙865处理器,差距比想象要大...
  3. 软件实训-技术学习心得
  4. 易基因|ISME J:细菌ChIP-seq揭示外源基因沉默子对根瘤菌适应性演化的调控机制
  5. IT30: IT男之家训(关于孩子)
  6. 利用电脑玩android版天天连萌刷高分 二,利用电脑玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化...
  7. 华为手机体验鸿蒙系统,内测用户自曝华为手机鸿蒙系统体验:惊喜太多,流畅度大亮...
  8. Vova and Trophies
  9. 门槛越低,越容易引起共鸣
  10. HDC2021技术分论坛:吐司盒子?芝士码?HarmonyOS音视频测试来啦