汇编 cdecl 函数调用约定,stdcall 函数调用约定
知识点:
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 函数调用约定的更多相关文章
- cdecl和stdcall调用约定-汇编演示
. .model flat, stdcall .stack ExitProcess PROTO, dwExitCode:DWORD .data val2 sdword result dword ? . ...
- 关于函数调用约定-thiscall调用约定
函数调用约定描述了如何以正确的方式调用某些特定类型的函数.包括了函数参数在栈上的分配顺序.有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等. 函数调用约定的几种类型 stdcall,cd ...
- 64位只有一种调用约定stdcall
procedure TForm2.Button1Click(Sender: TObject); function EnumWindowsProc(Ahwnd: hwnd; AlParam: lPara ...
- x64汇编第三讲,64位调用约定与函数传参.
目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...
- C++调用约定和名字约定
C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...
- C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall
https://www.cnblogs.com/xiangtingshen/p/11014514.html C++函数调用约定_cdecl约定:参数:从右向左依次入栈堆栈平衡:调用方平衡 #inclu ...
- 为什么 Windows API 使用 stdcall 调用约定?
作者:知乎用户链接:https://www.zhihu.com/question/31453641/answer/52001143来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- AT&T汇编中系统调用和C函数调用的使用
我的博客:www.while0.com 区别: 系统调用的参数存储在寄存器中,函数调用的则存储在堆栈中. 系统调用使用中断方式,函数调用使用call指令 相同之处: 都有返回值和输入值 返回值都存储在 ...
- stdcall 函数调用过程(以delphi为例),还有负数的补码
以delphi下调用stdcall 函数为例,从右往左压栈:procedure TForm1.Button2Click(Sender: TObject);var i:integer;begin i:= ...
随机推荐
- Java 装饰器模式详解
转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...
- Python+Selenium笔记(三):使用unittest
#网络很慢可能会运行报错 (一) 前言 Selenium WebDriver是一个浏览器自动化测试的API集合.它提供了很多与浏览器自动化交互的特性,并且这些API主要是用于测试Web程序.如果仅 ...
- ECMAScript5新特性总结
虽然ECMAScript5早就成为标准推出来了,但之前因为一直用的是ECMAScript3,并且工作中总是要求兼容IE的低版本,所以用的比较少.如今市场上大多数浏览器都能兼容ECMAScript5(I ...
- Azure 虚拟机代理概述
Azure 虚拟机代理(AM 代理)是受保护的轻型过程,用于管理 VM 与 Azure 结构控制器的交互. VM 代理有一个主要角色,目的是启用和执行 Azure 虚拟机扩展. VM 扩展可用于对虚拟 ...
- 如何监视 Azure 中的虚拟机
通过收集.查看和分析诊断与日志数据,可以利用很多机会来监视 VM. 若要执行简单的 VM 监视,可以在 Azure 门户中使用 VM 的“概述”屏幕. 可以使用扩展在 VM 上配置诊断以收集更多指标数 ...
- 理解 Azure 平台中虚拟机的计算能力
虚拟化平台至今已经发展了十多年的时间.其中 Hyper-V 技术现在也已经是第三代版本.用户对于虚拟化计算也越来越接受,这也有了公有云发展的基础.然而在很多时候,用户在使用基于 Hyper-V 的 A ...
- Oracle EBS 银行账户API
创建银行 -- Create Bank DECLARE p_init_msg_list VARCHAR2(200); p_country_code VARCHAR2(200); p_bank_nam ...
- SQL Server复制入门(二)----复制的几种模式 (转载)
简介本系列文章的上一篇对复制是什么做了一个概述.本篇文章根据发布服务器,分发服务器和订阅服务器的组织方式和复制类型来讲述常用复制的几种模式. 模式的选择选择复制的模式取决于多个方面.首先需要考虑具体的 ...
- QT学习2
一.常用控件与常用的功能函数. QDialog.QMainWindow.QPushButton.QLabel.QLineEdit 构造函数指定父容器.setText,getText,size,res ...
- Android高级_第三方框架Xutils
xutils的功能主要包括有四个部分:(1)布局视图关联:(2)图片下载与缓存:(3)网络请求:(4)数据库: 1. 使用xutils进行视图注入: (1)在控件声明上方添加@ViewInject() ...