知识点:
 cdecl 函数调用约定
 stdcall 函数调用约定
 CALL堆栈平衡 配置属性--> c/c++ -->高级-->调用约定
一、cdecl调用约定
VC++默认约定__cdecl
、源代码
int __cdecl add1(int a,int b)
{
return a+b;
}
、生成汇编代码
/$ PUSH EBP
|. 8BEC MOV EBP,ESP
|. 8B45 MOV EAX,DWORD PTR SS:[EBP+]
|. 0C ADD EAX,DWORD PTR SS:[EBP+C]
|. 5D POP EBP
0040100A \. C3 RETN ; POP EIP 、调用代码
push b
push a
call add1
add esp,
|. 6A PUSH ; 0012FF7C
|. 6A PUSH
|. E8 C6FFFFFF CALL stdcall_. ; __cdecl add1
0040103A |. 83C4 ADD ESP, ; RETN 二、stdcall调用约定
API函数约定 __stdcall
、源代码
int __stdcall add2(int a,int b)
{
return a+b;
} 、生成汇编代码
/$ PUSH EBP
|. 8BEC MOV EBP,ESP
|. 8B45 MOV EAX,DWORD PTR SS:[EBP+]
|. 0C ADD EAX,DWORD PTR SS:[EBP+C]
|. 5D POP EBP
0040101A \. C2 RETN ; RETN //ADD ESP,8 、调用代码
push b
push a
call add2
0040103D |. 6A PUSH ; 0012FF7C
0040103F |. 6A PUSH
|. E8 CAFFFFFF CALL stdcall_. ; __stdcall add2 PUSH 下一个EIP
三、fastcall 函数调用约定
直接用寄存器传递参数,由于寄存器相对于栈(存储器)速度要快上许多,所以这类的调用约定叫fastcall
、源代码
int __fastcall add2(int a,int b)
{
return a+b;
}
、汇编代码
/$ PUSH EBP
|. 8BEC MOV EBP,ESP
|. 83EC SUB ESP, ; int a,b;
|. F8 MOV DWORD PTR SS:[EBP-],EDX ; b=edx
|. 894D FC MOV DWORD PTR SS:[EBP-],ECX ; a=ecx
0040102C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-]
0040102F |. F8 ADD EAX,DWORD PTR SS:[EBP-]
|. 8BE5 MOV ESP,EBP ; add esp,
|. 5D POP EBP
\. C3 RETN 、调用代码
|. BA MOV EDX,
0040109B |. B9 MOV ECX,
004010A0 |. E8 7BFFFFFF CALL fastcall. ;

汇编  cdecl 函数调用约定,stdcall 函数调用约定的更多相关文章

  1. cdecl和stdcall调用约定-汇编演示

    . .model flat, stdcall .stack ExitProcess PROTO, dwExitCode:DWORD .data val2 sdword result dword ? . ...

  2. 关于函数调用约定-thiscall调用约定

    函数调用约定描述了如何以正确的方式调用某些特定类型的函数.包括了函数参数在栈上的分配顺序.有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等. 函数调用约定的几种类型 stdcall,cd ...

  3. 64位只有一种调用约定stdcall

    procedure TForm2.Button1Click(Sender: TObject); function EnumWindowsProc(Ahwnd: hwnd; AlParam: lPara ...

  4. x64汇编第三讲,64位调用约定与函数传参.

    目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...

  5. C++调用约定和名字约定

    C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...

  6. C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall

    https://www.cnblogs.com/xiangtingshen/p/11014514.html C++函数调用约定_cdecl约定:参数:从右向左依次入栈堆栈平衡:调用方平衡 #inclu ...

  7. 为什么 Windows API 使用 stdcall 调用约定?

    作者:知乎用户链接:https://www.zhihu.com/question/31453641/answer/52001143来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. AT&T汇编中系统调用和C函数调用的使用

    我的博客:www.while0.com 区别: 系统调用的参数存储在寄存器中,函数调用的则存储在堆栈中. 系统调用使用中断方式,函数调用使用call指令 相同之处: 都有返回值和输入值 返回值都存储在 ...

  9. stdcall 函数调用过程(以delphi为例),还有负数的补码

    以delphi下调用stdcall 函数为例,从右往左压栈:procedure TForm1.Button2Click(Sender: TObject);var i:integer;begin i:= ...

随机推荐

  1. JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)

    JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架) 本来想实现 QQ 登录,有域名一直没用过,还得备案,好麻烦,只能过几天再更新啦. 先把实现的发送邮箱验证码更能更新了. 老规矩,更多内容在注释 ...

  2. go语言练习:数组

    1.创建数组: package main import "fmt" func main() { var lst = [3]int{1, 2, 3} //var name=[数量]类 ...

  3. oracle学习之pl/sql使用==转载

    PLSQL循序渐进全面学习教程(全):https://blog.csdn.net/spark998/article/details/2065269

  4. 使用Eclipse Debug的一些说明

    目录 Debug视图 线程堆栈视图 变量视图 断点视图 表达式视图 代码视图 远程Debug 异常断点 条件断点 表达式 Debug定位第三方插件的问题 Debug一些经验   Debug视图 认识d ...

  5. ubuntu下给raspy pi2 编译qt5库

    交叉编译时,通常要准备mkspec, 参考: http://wiki.qt.io/Building_Qt_for_Embedded_Linux mkspec包含两个文件: qmake.conf- Th ...

  6. Oracle EBS OM 删除订单行

    DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...

  7. VS2010/2013 运行是很卡的加速方案

    前段时间为了一个项目而把VS2008换成了VS2010,结果原本就不堪重负的本本跑起VS2010来那更是慢得没话说,于是看了遍VS2010选项,又从网上到处找资料找优化方法,总算使我的VS2010跑得 ...

  8. Lombok 继承时应注意的点

    lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法.即它最终能够达到的效果是:在源码中没 ...

  9. swift的类型推断

    类型推断的前提是有待定类型和上下文. 1.由定义推断实现的类型: 2.由赋值推断声明的类型: 3.由实现推断泛型的类型: Type inference refers to the automatic ...

  10. Volley源码分析(二)CacheDispatcher分析

    CacheDispatcher 缓存分发 cacheQueue只是一个优先队列,我们在start方法中,分析了CacheDispatcher的构成是需要cacheQueue,然后调用CacheDisp ...