cdecl和stdcall调用约定的汇编代码对比

简介:
decl和stdcall调用约定的汇编代码对比
 
 
--- d:\projects\lab\call_type\call_type.cpp ------------------------------------
#include <stdio.h>
int __stdcall add(int a, int b)
{
013D13B0 push ebp
013D13B1 mov ebp,esp
013D13B3 sub esp,0C0h
013D13B9 push ebx
013D13BA push esi
013D13BB push edi
013D13BC lea edi,[ebp-0C0h]
013D13C2 mov ecx,30h
013D13C7 mov eax,0CCCCCCCCh
013D13CC rep stos dword ptr es:[edi]
return a+b;
013D13CE mov eax,dword ptr [a]
013D13D1 add eax,dword ptr [b]
}
013D13D4 pop edi
013D13D5 pop esi
013D13D6 pop ebx
013D13D7 mov esp,ebp
013D13D9 pop ebp
013D13DA ret 8
---------------
--- d:\projects\lab\call_type\call_type.cpp ------------------------------------
int main()
{
013D13F0 push ebp
013D13F1 mov ebp,esp
013D13F3 sub esp,0C0h
013D13F9 push ebx
013D13FA push esi
013D13FB push edi
013D13FC lea edi,[ebp-0C0h]
013D1402 mov ecx,30h
013D1407 mov eax,0CCCCCCCCh
013D140C rep stos dword ptr es:[edi]
printf("%d\n", add(1,2));
013D140E push 2
013D1410 push 1
013D1412 call add (13D1109h)
013D1417 mov esi,esp
013D1419 push eax
013D141A push offset string "%d\n" (13D573Ch)
013D141F call dword ptr [__imp__printf (13D82BCh)]
013D1425 add esp,8
013D1428 cmp esi,esp
013D142A call @ILT+315(__RTC_CheckEsp) (13D1140h)
return 0;
013D142F xor eax,eax
}
013D1431 pop edi
013D1432 pop esi
013D1433 pop ebx
013D1434 add esp,0C0h
013D143A cmp ebp,esp
013D143C call @ILT+315(__RTC_CheckEsp) (13D1140h)
013D1441 mov esp,ebp
013D1443 pop ebp
013D1444 ret
=====================================
--- d:\projects\lab\call_type\call_type.cpp ------------------------------------
#include <stdio.h>
int add(int a, int b)
{
00D513B0 push ebp
00D513B1 mov ebp,esp
00D513B3 sub esp,0C0h
00D513B9 push ebx
00D513BA push esi
00D513BB push edi
00D513BC lea edi,[ebp-0C0h]
00D513C2 mov ecx,30h
00D513C7 mov eax,0CCCCCCCCh
00D513CC rep stos dword ptr es:[edi]
return a+b;
00D513CE mov eax,dword ptr [a]
00D513D1 add eax,dword ptr [b]
}
00D513D4 pop edi
00D513D5 pop esi
00D513D6 pop ebx
00D513D7 mov esp,ebp
00D513D9 pop ebp
00D513DA ret
---------------------
--- d:\projects\lab\call_type\call_type.cpp ------------------------------------
int main()
{
00D513F0 push ebp
00D513F1 mov ebp,esp
00D513F3 sub esp,0C0h
00D513F9 push ebx
00D513FA push esi
00D513FB push edi
00D513FC lea edi,[ebp-0C0h]
00D51402 mov ecx,30h
00D51407 mov eax,0CCCCCCCCh
00D5140C rep stos dword ptr es:[edi]
printf("%d\n", add(1,2));
00D5140E push 2
00D51410 push 1
00D51412 call add (0D51096h)
00D51417 add esp,8
00D5141A mov esi,esp
00D5141C push eax
00D5141D push offset string "%d\n" (0D5573Ch)
00D51422 call dword ptr [__imp__printf (0D582BCh)]
00D51428 add esp,8
00D5142B cmp esi,esp
00D5142D call @ILT+315(__RTC_CheckEsp) (0D51140h)
return 0;
00D51432 xor eax,eax
}
00D51434 pop edi
00D51435 pop esi
00D51436 pop ebx
00D51437 add esp,0C0h
00D5143D cmp ebp,esp
00D5143F call @ILT+315(__RTC_CheckEsp) (0D51140h)
00D51444 mov esp,ebp
00D51446 pop ebp
00D51447 ret
---------------------------------------------------
我们的thunkCode如下:
const unsigned char thunkCodeTemplate[] =  

    0x55, // push ebp
    0x8B, 0xEC, // mov ebp, esp
    0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, [new_addr]
    0xB9, 0x00, 0x00, 0x00, 0x00, // mov ecx, [old_addr]
    0x51, // push ecx
    0xFF, 0xD0, // call eax
    0xC9, // leave
    0xC3 // ret
};











本文转sinojelly51CTO博客,原文链接: http://blog.51cto.com/sinojelly/431695 ,如需转载请自行联系原作者

相关文章
|
2月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
3月前
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
45 0
|
2月前
|
Windows
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
|
3月前
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
42 2
|
3月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
|
3月前
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
43 0
|
6月前
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
104 1
|
5月前
|
Python
python 代码脚本汇编
python 代码脚本汇编
48 0
|
6月前
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
41 0