首页
社区
课程
招聘
VC内联汇编返回字符串路径问题
发表于: 2009-11-13 14:48 4774

VC内联汇编返回字符串路径问题

2009-11-13 14:48
4774
我在VC里用内联汇编写了个函数,代码如下:
void __declspec(naked) Func()
{
        __asm
           {
                 .....
                 call dword ptr [edi+5]  ;该函数有返回值,返回一个char类型MAX_PATH大小的数组
           mov dword ptr [edi+13], eax         ;我把返回放到edi+13里,一会要用到
           .....
                 mov eax, dword ptr [edi+13]         ;将路径压栈,调用XXXXXXXX
                 push eax
                 call    XXXXXXXX
                 .....
             }
}

请问我这样做正确吗?我不想在函数里定义一个局部变量char s[MAX_PATH],因为我用的是__declspec(naked),定义局部变量在平衡堆栈时会很麻烦,有人说把返回值压进堆栈保存,请问那应该怎么实现?在堆栈里构造字符串吗?路径具体占几个字节事先是不知道的,怎么在堆栈里实现?请高手们指点一下!万分感谢~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 22
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
个人觉得把存放返回值的edi+13的地址放入堆栈就可以吧。
2009-11-13 14:54
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就是我上面写的那样吗?
mov eax, dword ptr [edi+13]
push eax
2009-11-13 14:56
0
雪    币: 22
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=追风傲雪;711654]就是我上面写的那样吗?
mov eax, dword ptr [edi+13]
push eax[/QUOTE]

应该是
lea eax,dword ptr ds:[edi+13]
push eax
2009-11-13 14:57
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
假设我在函数里定义了一个局部变量:char ret_path[MAX_PATH];
在call dword ptr [edi+5]之后:
mov esi, eax
lea edi, ret_path
mov ecx, MAX_PATH
rep movs byte ptr es:[edi], byte ptr ds:[esi]

然后在call    XXXXXXXX之前:
lea eax, ret_path
push eax
call  XXXXXXXX

这样就能准确的调用XXXXXXXX函数,但我采用了naked约定,多了一个局部变量,我该怎么调整堆栈平衡?我用naked目的就是不想VC编译器帮我调整堆栈
2009-11-13 15:12
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
edi+5 是我在代码段里留出来的地方,而不是数据段里的
我已经在程序前面加上#pragma comment(linker,"/section:.text,rwe"),把代码段设置为“可读可写可执行”了
2009-11-13 15:17
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请问怎么做才能保证正确地调用XXXXXXXX?如果定义局部变量的话,该怎么调整堆栈?不定义局部变量,那怎么把返回路径存放在堆栈里?麻烦高手们指导指导~
2009-11-13 15:23
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没人知道吗?帮帮忙啊~!~!~
2009-11-13 15:51
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顶~~~~~
2009-11-13 18:27
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
可以定义局部变量,但必须自己建栈结构,大概如下:
void __declspec(naked) Func()
{
       char ret_path[MAX_PATH];
        __asm
           {
                 push ebp
                 mov ebp,esp
                 sub esp, __LOCAL_SIZE

                 lea eax,ret_path
                 push eax
                 call    XXXXXXXX
                 .....
            
                 leave
                 ret
             }
}

要点:__LOCAL_SIZE是编译器提供的宏,编译器会自动计算其大小(可能超过你的求的大小);局部变量访问时,要使用EBP,因此必须建立栈结构。
2009-11-13 19:08
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
问题已经解决了,感谢半道出家的回答
2009-11-16 10:31
0
游客
登录 | 注册 方可回帖
返回
//