当前位置: 首页 > news >正文

汇编(函数调用)

函数调用


我们知道函数本身其实就是多条指令的合集,只不过这多个指令的合集可以被多次重复调用

我们学过两个指令 JMP和CALL指令,都是跳转到对应目标地址继续执行下一条指令,但JMP和CALl的区别是什么?

jmp只能修改eip的值,要跳回去还要再加一个jmp来实现回跳的功能,但如果有多个地方要使用这个函数,那这时,jmp就无法使用了
call是在同时修改eip的同时,还把call指令的下一条地址压入栈中,再ret返回时,取出栈中的地址放入eip中,这时不管什么地方调用都不会出现问题

参数传递

在x86模式下,我们要给一个函数传递参数可以用到8个通用寄存器,但是如果我们要传递的参数不止8个呢?

这时,就要使用我们的堆栈传参

// 使用堆栈完成10个数相加
_asm{push 1push 2push 3push 4push 5push 6push 7push 8push 10push 11call 0x4183E1add eax,DWORD PTR DS:[esp+28] // 第十个参数add eax,DWORD PTR DS:[esp+24] // 第九个参数add eax,DWORD PTR DS:[esp+20] // 第八个参数add eax,DWORD PTR DS:[esp+1c] // 第七个参数add eax,DWORD PTR DS:[esp+18] // 第六个参数add eax,DWORD PTR DS:[esp+14] // 第五个参数add eax,DWORD PTR DS:[esp+10] // 第四个参数add eax,DWORD PTR DS:[esp+c] // 第三个参数add eax,DWORD PTR DS:[esp+8] // 第二个参数add eax,DWORD PTR DS:[esp+4] // 第一个参数ret
}

堆栈平衡

什么是堆栈平衡?

如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化,要在RET这条指令之前,ESP指向的是我们压入栈中的地址

_asm{...call 0x12345678...// 函数调用后有使用堆栈的操作mov eax,1push eaxret	// 堆栈不平衡
}

修改后

// 在函数执行完成后(外平栈)
_asm{...call 0x12345678add esp,4 // 堆栈平衡// 函数调用后有使用堆栈的操作mov eax,1push eaxret...
}// // 在函数执行里面(内平栈)
_asm{...call 0x12345678...// 函数调用后有使用堆栈的操作mov eax,1push eaxret 4 // 堆栈平衡...
}

EBP寻址

esp寻址的弊端

我们在往堆栈中存入参数时,可以根据esp来加上偏移来取出参数,但是这种通过esp来寻址的方式并不友好,前面有几个push就要加多个对应的偏移来获取,可以采取另一种寻址方式EBP寻址

在这里插入图片描述

_asm{...push 1push 2call 0x12345678...push ebp 	// 保留原来ebp的值mov ebp,espsub esp,1c 	// 提升espmov eax,dword ptr ss:[ebp + 8] // 第二个参数add eax,dword ptr ss:[ebp + c] // 第一个参数mov esp,ebp	// 把ebp的值给到esp (还原esp)pop ebp		// 还原ebpret...
}

相关文章:

  • Node.js版本管理
  • LangChain文档加载器自动选择器:支持多种文件格式的统一加载方法
  • SpreadJS 在预算编制中的应用深度剖析
  • 日本滨松R669光电倍增管Hamamatsu直径51 mm 直径端窗型扩展红多碱光阴极面光谱灵敏度特性:300 至 900 nm
  • 生鲜商城源码系统设计+springboot3+vue3+JDK17(带用户协同过滤个性化推荐算法)
  • AX620Q上模型部署流程
  • Android Compose 自定义滑动进度条
  • JAVA CAS 详解
  • 【学习笔记】RTSP-Ovnif-GB28181
  • 5.Caffe
  • 如何抓取DP_AUX辅助通道数据
  • 简单实现shardingSphere + MybatisPlus分库分表2025
  • 【期末速成】软件项目管理
  • java使用WebMagic架构写个分布式爬虫
  • MySQL中触发器详解 触发器在自动化任务中的应用场景
  • 今日行情明日机会——20250611
  • 缓冲区(C语言缓冲区+内核缓冲区)一个例子解释他们的关系和作用!!!
  • TF-IDF算法的代码实践应用——关键词提取、文本分类、信息检索
  • AI时代的弯道超车之第二十五章:《生命3.0》未来AI有生命了怎么办?
  • Vuex 中Mutation 和Action介绍
  • 网站设计过程中需要注意的问题/北京自动网络营销推广
  • 江阴网络公司做网站/5g网络优化工程师
  • 做网站公司在哪/如何制作自己的链接
  • 专业帮人做网站号码/怎么优化标题和关键词排名
  • 西安设计网站公司/百度搜索网址大全
  • 门户网站静态页面/网站推广优化的原因