首页
社区
课程
招聘
[求助]一个内联汇编调函数的问题!
发表于: 2011-2-26 01:25 4555

[求助]一个内联汇编调函数的问题!

2011-2-26 01:25
4555
void fun(CString str) {...};
形参也可以是其他类。
asm怎么调用呢?

DWORD faddr = (DWORD)&fun;
_asm
{
    ...应该是再这里构造CString吧,想半天,没想出来
    call faddr;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 193
活跃值: (64)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
传递形参
2011-2-26 09:23
0
雪    币: 193
活跃值: (64)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
还有函数名就代表函数地址的
2011-2-26 09:28
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
嵌入汇编只能调用全局且未重载的函数,不能调用重载函数或类成员函数,当然也不能调用构造函数,想办法在嵌入汇编的块外构造,更好的办法是另定义一个全局函数fun2实现CString的构造并调用fun,然后在汇编中调用fun2。
2011-2-26 14:31
0
雪    币: 266
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
汇编中调用类成员函数,也很简单。

其实问题的关键是怎么实例化类在指定的内存中。
必须在call faddr之前的栈上申请空间
DWORD len = sizeof(CString);
_asm
{
    sub esp,len;
      ...这里就是问题的重点了。
      call faddr;
}
2011-2-26 18:17
0
雪    币: 266
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
考虑到被调函数,可能是_stdcall约定,就不能在汇编外实例化类,更加不能new,new是在堆上分配空间。。。
想到这里,我明白了,是我对new不太了解,new可以在指定的地址中构造对象,呵呵。
原来解决这个问题须用new

void _stdcall fun(CString str) {...};

DWORD faddr = (DWORD)&fun;
DWORD len = sizeof(CString);
BYTE* buf = NULL;

_asm
{
    sub esp,len;
    mov buf,esp;
}
new(buf) CString("test");
_asm
{
    call faddr;
}

回家试试,不知道行不行。
2011-2-26 18:53
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
有些想当然了吧,据我所知, 嵌入汇编中不能调用成员函数是因为无法解析函数名, 当然, 你可以使用函数指针(只能在汇编块外初始化函数指针), 但构造函数例外,因为你不能取构造函数的指针。6层方法是可行的,甚至可以更简化些:
void _stdcall fun(CString str) {...};

DWORD faddr = (DWORD)&fun;
BYTE* buf = NULL;

_asm
{
    sub esp,size CString
    mov buf,esp
}
new(buf) CString("test");
_asm
{
    call faddr;
}
如果fun是全局无重载函数,则可以更直接:call fun
2011-2-26 19:53
0
雪    币: 266
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
先感谢半道出家,认真回答我的问题。
当说到,汇编中调用类成员函数时,我首先想到的是,汇编外取得地址,再调用,不好意思,是我思维有问题,呵呵。

刚试过了,用new没问题。但总觉的在汇编外构造对象,对问题的研究还不够深入。又转回到构造函数了,呵呵,貌似除了new想不出什么办法了。
2011-2-26 23:52
0
游客
登录 | 注册 方可回帖
返回
//