关于fastcall的一个初级问题,请老鸟们帮助解惑

[复制链接]
查看11 | 回复10 | 2021-1-27 06:01:36 | 显示全部楼层 |阅读模式
__fastcallfunction::Open(void)
pushebp
movebp,esp
addesp,0FFFFFF98h
pushebx
pushesi
pushedi
mov[ebp+var_64],eax
我知道fastcall是用寄存器进行参数传递,以上这个片断让我很疑惑,函数的参数是void,那么片断最后一句mov[ebp+var_64],eax中,eax是什么内容?把什么东西入栈了?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
一晚上了,没人回复,自己顶,看看早上是不是人多一点。
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
C++的话可能是This指针……我猜的
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
。。。。。。。。。。这要逆向调用函数啊,你看这个函数根本就不知道eax是什么,看调用的时候把什么东西放eax中了
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
或许没什么意义,只是保存当前的eax值,然后做什么运算以后,恢复而已
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
fastcall不会用到eax传参的,用的是ecx和edx,其他参数压栈的。
至于三楼说的this指针,应该不是的,在windows下类成员函数是thiscall,用ecx传this指针;而linux下是用栈传递的this指针。
楼主这里上下文不全,没办法分析mov[ebp+var_64],eax这一句的目的。建议动态调试去跟踪下。
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
ecx和edx传递参数,这是微软的规范吧?其他的如Borland公司的,貌似是eax,ebx,ecx先用,之后的入栈。上面这个片断是反汇编某个bpl文件得到的,按Borland公司的规范,貌似最左边的那个参数入eax的,但这个函数是void,也没参数,那么到底是啥东西入栈了呢?疑惑中。。。继续坐等高手解答。
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
msfastcallecx、edx
borlandfastcalleax、edx、ecx

回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
那如果函数的参数为void,那么调用时,eax内传递的是什么?全0?
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
是返回值。如果函数有返回值,则返回前必然有对EAX寄存器进行操作的指令;如果没有,则例行做一个同样的操作。高级语言中,编译器做事情有固定的套路,有时候不能太较真。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行