社区
C++ 语言
帖子详情
请教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
打赏
收藏
请教naked函数问题
__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?? 上面代码有什么问题请指出,谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 需要栈帧, 当然不能酱紫用 ...
还有你的汇编看起来就是错的 ...
THUNK
一种实现Win32窗口过程
函数
(Window Procedure)的新方法 基于Thunk实现的类成员消息处理
函数
JERKII.SHANG (JERKII@HOTMAIL.COM) MAR.10th - 31st, 2006 Windows是一个
Thunk
一种实现Win32窗口过程
函数
(Window Procedure)的新方法 基于Thunk实现的类成员消息处理
函数
JERKII.SHANG (JERKII@HOTMAIL.COM) MAR.10th - 31st, 2006 Windows是一个消息驱动的操作系统,在...
lib dll
在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些
问题
:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费...
进程控制
写这篇文档的时候由于我足够菜,碰到了不少
问题
,多谢bkbll,a1rsupply和SobeIt的指点,还有TCH的辛勤劳动,才有这篇文档的诞生,本文中可能存在一些错误,这些错误都是由于我的失误造成的,如果您有什么意见和看法,...
挂接CreateProcessW实现对进程创建的完全控制
文章作者:System32这份文档演示了如何实现全局HOOK【前言】【概述】【copy-on-write】【三种可行的办法】【完整演示代码】【资源】++++++++++++++++++++...写这篇文档的时候由于我足够菜,碰到了不少
问题
,多谢bkbll
C++ 语言
64,282
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章