社区
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??
上面代码有什么问题请指出,谢谢!!
...全文
302
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 需要栈帧, 当然不能酱紫用 ...
还有你的汇编看起来就是错的 ...
naked
函数
调用
正常的情况下,我们写一个 C/C++
函数
,即使是一个空
函数
,编译器也为我们做了不少的工作,生成了一些“必要”的代码。请看下面的
函数
(为了说明
问题
随便写的): int Test() { int iReturn; char szTemp
_declspec(
naked
) 使用(裸
函数
)
最近学习驱动开发,在写绕过inline hook的代码时,有个
问题
困扰了我一天,最后发现原来是在内嵌汇编时,没有使用_declspec(
naked
)导致的,看来是偶的基础知识掌握的不牢固啊(得补一下了,磨刀不误砍柴功),在此给记录一下,给自己一个警示。 对于jmp类型的hook, 如果自己的过程没有使用_declspec(
naked
),那么系统会自动给添加一些额外的代码,控制堆栈平衡,但
naked
使用时的注意事项。
一般情况下,为了不开辟堆栈,用此标记符。 但是,用此标记符会出现一些
问题
,在这里记录一下。 1,用
naked
之后,不能使用局部变量。最好不要使用吧。感觉也是可以用的,但是要自己手动 push esp,mov ebp,esp。?这个以后验证吧。 2,使用
naked
之后,不要strcat(pszfilename,“一个字符串”),因为从汇编来看,编译器会将一个字符串归类为局部变量。会改变ebp-
_declspec(
naked
) 使用
http://www.cnblogs.com/netzlj/archive/2009/10/22/1588177.html 对于jmp类型的hook, 如果自己的过程没有使用_declspec(
naked
),那么系统会自动给添加一些额外的代码,控制堆栈平衡,但是这些额外的代码会破坏被hook
函数
的堆栈。 对于call类型的hook,如果使用_declspec(
naked
)修饰的话,
ARMCLANG V6编译下core_cm3.c的
naked
function错误解析与修复
本文详细解析了在MDK环境下使用ARMCLANG V6编译器编译STM32项目时,core_cm3.c文件中
naked
function引发的编译错误。文章深入剖析了错误根源在于新旧编译器对裸
函数
规范的严格程度差异,并提供了直接修改源码和调整编译器选项两种实战修复方案,帮助开发者顺利完成项目迁移与升级。
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章