能力值:
( LV3,RANK:30 )
|
-
-
2 楼
传递形参
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
还有函数名就代表函数地址的
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
嵌入汇编只能调用全局且未重载的函数,不能调用重载函数或类成员函数,当然也不能调用构造函数,想办法在嵌入汇编的块外构造,更好的办法是另定义一个全局函数fun2实现CString的构造并调用fun,然后在汇编中调用fun2。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
汇编中调用类成员函数,也很简单。
其实问题的关键是怎么实例化类在指定的内存中。
必须在call faddr之前的栈上申请空间
DWORD len = sizeof(CString);
_asm
{
sub esp,len;
...这里就是问题的重点了。
call faddr;
}
|
能力值:
( 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;
}
回家试试,不知道行不行。
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
先感谢半道出家,认真回答我的问题。
当说到,汇编中调用类成员函数时,我首先想到的是,汇编外取得地址,再调用,不好意思,是我思维有问题,呵呵。
刚试过了,用new没问题。但总觉的在汇编外构造对象,对问题的研究还不够深入。又转回到构造函数了,呵呵,貌似除了new想不出什么办法了。
|
|
|