请教naked函数问题

Evence_Tom 2008-03-07 11:23:51
__declspec( naked ) void Add( int* a, int* b, int* c )
{
__asm
{
push EAX
mov EAX, [a]
ADD EAX, [b]
mov [c], EAX
pop EAX
RET
}
}

void main()
{
int a=1, b=2, c=0;
Add( &a, &b, &c );

cout<<c<<endl;


输出结果:0
为什么不是3??
上面代码有什么问题请指出,谢谢!!
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinosinux 2008-03-07
  • 打赏
  • 举报
回复
貌似对啊, debug 跟踪一下子呗;)
baihacker 2008-03-07
  • 打赏
  • 举报
回复
int _declspec(naked) sum(int a, int b)
{
// prolog代码
_asm push ebp ;主调函数的ebp入栈
_asm mov ebp, esp ;调用时的esp保存到ebp,作为在栈上分配变量的基址(顶部)

// 用于相加变量和返回的代码
_asm mov eax, dword ptr [ebp + 8] ;ebp为刚入栈的esp,ebp+4为调用函数时入栈的eip, ebp+8为a(假设参数从右到左入栈)
_asm add eax, dword ptr [ebp + 12] ;加上b

// epilog代码
_asm pop ebp ;恢复主调函数的ebp
_asm ret
}
jjfwenwenti 2008-03-07
  • 打赏
  • 举报
回复
恩,先markkkkk
Evence_Tom 2008-03-07
  • 打赏
  • 举报
回复
网上搜索到一段代码,测试通过:
int _declspec(naked) sum(int a, int b)
{
// prolog代码
_asm push ebp
_asm mov ebp, esp

// 用于相加变量和返回的代码
_asm mov eax, dword ptr [ebp + 8]
_asm add eax, dword ptr [ebp + 12]

// epilog代码
_asm pop ebp
_asm ret
}

void main()
{
int a=1, b=8, c=0;
c = sum( a, b );

cout<<c<<endl;


现在又有新问题了:
1、把EBP入栈,ESP的值给EBP(为什么要这样做?)
2、是不是只能通过这种方式访问参数:dword ptr [ebp + xx]?
3、为什么参数a要+8?
4、如果参数是一个数组的首地址,要对整个数组处理该怎么办?
mLee79 2008-03-07
  • 打赏
  • 举报
回复
naked 的函数不生成栈帧, 在嵌入汇编中访问函数参数 a b c 需要栈帧, 当然不能酱紫用 ...
还有你的汇编看起来就是错的 ...

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧