__declspec(naked) int add(int a, int b)

本文介绍了一个使用__declspec(naked)修饰符定义的加法函数的实现细节,展示了如何通过直接操控寄存器来完成两个整数相加的过程。特别地,文章分析了函数不使用标准调用约定时,参数传递及栈帧管理的具体方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__declspec(naked) int add(int a, int b)
{
 _asm
  {
   mov eax, dword ptr [esp + 0x4]
   add eax, dword ptr [esp + 0x8]
   ret
  }
}

函数 __declspec(naked) int add(int a, int b) 生成的汇编代码

:00401BCC 8B442404  mov eax, dword ptr [esp+04]
:00401BD0 03442408  add eax, dword ptr [esp+08]
:00401BD4 C3        ret

因为函数开头没有

push ebp    
mov ebp, esp

ebp没有入栈,所以函数参数地址就是 esp + 0x4 和 esp + 0x8 了。自然函数结束也不需要 pop ebp 了。
 

0x00007FF76CC51480 处(位于 veh hook.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000001 时发生访问冲突。 00007FF76CC51438 jmp __p__commode (07FF76CC5982Eh) 00007FF76CC5143D jmp RtlCaptureContext (07FF76CC598A0h) 00007FF76CC51442 jmp __scrt_dllmain_crt_thread_attach (07FF76CC57490h) 00007FF76CC51447 jmp __p___argc (07FF76CC59804h) 00007FF76CC5144C jmp std::vector<DbgPoint,std::allocator<DbgPoint> >::push_back (07FF76CC55140h) 00007FF76CC51451 jmp __scrt_get_dyn_tls_dtor_callback (07FF76CC57D10h) 00007FF76CC51456 jmp __scrt_stub_for_acrt_initialize (07FF76CC59920h) 00007FF76CC5145B jmp _set_new_mode (07FF76CC59828h) 00007FF76CC51460 jmp __scrt_initialize_default_local_stdio_options (07FF76CC57C70h) 00007FF76CC51465 jmp __crt_debugger_hook (07FF76CC57D20h) 00007FF76CC5146A jmp RtlLookupFunctionEntry (07FF76CC598A6h) 00007FF76CC5146F jmp std::vector<DbgPoint,std::allocator<DbgPoint> >::vector<DbgPoint,std::allocator<DbgPoint> > (07FF76CC53020h) 00007FF76CC51474 jmp __castguard_slow_path_check_debugbreak (07FF76CC584E0h) 00007FF76CC51479 jmp __castguard_check_failure_nop (07FF76CC58320h) 00007FF76CC5147E int 3 00007FF76CC5147F pop rbp 00007FF76CC51480 sub al,byte ptr [rax] 00007FF76CC51482 add cl,ch 00007FF76CC51484 cwde 00007FF76CC51485 pop rdi 00007FF76CC51486 add byte ptr [rax],al 00007FF76CC51488 jmp std::_Throw_bad_array_new_length (07FF76CC54B70h) 00007FF76CC5148D jmp __p___argv (07FF76CC5980Ah) 00007FF76CC51492 jmp operator new (07FF76CC53670h) 00007FF76CC51497 jmp operator delete (07FF76CC556C0h) 00007FF76CC5149C jmp __scrt_release_startup_lock (07FF76CC57830h) 00007FF76CC514A1 jmp __std_type_info_destroy_list (07FF76CC5977Ah) 00007FF76CC514A6 jmp _RTC_CheckStackVars (07FF76CC55740h) 00007FF76CC514AB jmp __isa_available_init (07FF76CC59290h) 00007FF76CC514B0 jmp std::_Default_allocator_traits<std::allocator<DbgPoint> >::max_size (07FF76CC55080h) 00007FF76CC514B5 jmp __scrt_fastfail (07FF76CC57D40h) 00007FF76CC514BA jmp RaiseException (07FF76CC5988Eh) 00007FF76CC514BF jmp std::exception::`scalar deleting destructor' (07FF76CC538C0h) 00007FF76CC514C4 jmp std::bad_array_new_length::bad_array_new_length (07FF76CC532F0h) 00007FF76CC514C9 jmp _initterm (07FF76CC597E6h) 执行代码在这里卡着了
最新发布
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值