社区
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??
上面代码有什么问题请指出,谢谢!!
...全文
247
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?? 上面代码有什么问题请指出,谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
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 需要栈帧, 当然不能酱紫用 ...
还有你的汇编看起来就是错的 ...
相关推荐
5天Python闯关答疑训练营-直播答疑
#《5天Python闯关训练营》学习计划#挑战周期:11月4日—11月8日直播答疑:11.6号晚8点直播答疑,将学习难点可集中
请教
老师哦~11.4-11.8号为本课正式服务周期,期间遇到学习
问题
可社群
请教
,群内安排助教老师答疑
__attribute_((
naked
))
我们知道VC++和gcc都支持
naked
函数
,即所谓的“裸
函数
”,对于这种
函数
,编译器不会生成任何
函数
入口代码和退出代码。这种
函数
一般应用在与操作系统内核相关的代码中,如中断处理
函数
、钩子
函数
等。 VC++的声明语法:__declspec(
naked
) gcc的声明语法:__attribute__((
naked
)) 因为编译器不会生成入口代码和退出代码,所以写
naked
函数
的时候
关于 __declspec(
naked
) 编写干净
函数
对于用 __declspec(
naked
) 编写干净
函数
Copy codeVOID __declspec(
naked
) My
Naked
Function(){strcmp(...);// __cdecl
函数
是调用者清除参数堆栈,对于非内联汇编调用这类
函数
,编译器将自动平衡堆栈,加入 ADD ESP, 8}Copy codeVOID __declspec(
naked
) MyNake
4.__declspec(
naked
) 生成纯汇编使用方法
__declspec(
naked
)是用来告诉编译器
函数
代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码,通俗说可生成纯汇编。 使用方法: #define
NAKED
__declspec(
naked
) VOID
NAKED
MyFunc() { __asm { ret } } 1,使用
naked
关键
5天从零入门Python编程开班典礼
#《5天Python闯关训练营》学习计划#11.4-11.8号为本课正式服务周期,期间遇到学习
问题
可社群
请教
,群内安排助教老师答疑
C++ 语言
63,594
社区成员
250,391
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下