汇编(函数调用)

函数调用


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

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

jmp只能修改eip的值,要跳回去还要再加一个jmp来实现回跳的功能,但如果有多个地方要使用这个函数,那这时,jmp就无法使用了

call是在同时修改eip的同时,还把call指令的下一条地址压入栈中,再ret返回时,取出栈中的地址放入eip中,这时不管什么地方调用都不会出现问题

参数传递

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

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

cpp 复制代码
// 使用堆栈完成10个数相加
_asm{
	push 1
	push 2
	push 3
	push 4
	push 5
	push 6
	push 7
	push 8
	push 10
	push 11
	call 0x4183E1
	add 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指向的是我们压入栈中的地址

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

修改后

cpp 复制代码
// 在函数执行完成后(外平栈)
_asm{
	...
	call 0x12345678
	add esp,4 // 堆栈平衡
	// 函数调用后有使用堆栈的操作
	mov eax,1
	push eax
	ret
	...
}

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

EBP寻址

esp寻址的弊端

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

cpp 复制代码
_asm{
	...
	push 1
	push 2
	call 0x12345678
	...
	push ebp 	// 保留原来ebp的值
	mov ebp,esp
	sub esp,1c 	// 提升esp
	mov eax,dword ptr ss:[ebp + 8] // 第二个参数
	add eax,dword ptr ss:[ebp + c] // 第一个参数
	mov esp,ebp	// 把ebp的值给到esp (还原esp)
	pop ebp		// 还原ebp
	ret
	...
}
相关推荐
阿白的白日梦17 小时前
winget基础管理---更新/修改源为国内源
windows
埃博拉酱5 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21885 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
我在人间贩卖青春5 天前
汇编之伪指令
汇编·伪指令
tryCbest5 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅5 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技5 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf
一个人旅程~5 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
一个假的前端男5 天前
[特殊字符] Flutter 安装完整指南 Windows—— 2026最新版
windows·flutter