stdcall和cdecl

红色部分为不同之处。代码编译  在x86_64的机器上  选择了32位模式 gcc -S 1.c -m32

默认cdecl

int add(int a,int b,int c){

 int sum = a+b+c;
 return sum;
};

int main(void){
 int c=add(1,2,3);
}

add:

pushl %ebp
 movl %esp, %ebp
 subl $16, %esp
 movl 8(%ebp), %edx
 movl 12(%ebp), %eax
 addl %eax, %edx
 movl 16(%ebp), %eax
 addl %edx, %eax
 movl %eax, -4(%ebp)
 movl -4(%ebp), %eax
 leave
 ret
main:
 pushl %ebp
 movl %esp, %ebp
 subl $16, %esp
 pushl $3
 pushl $2
 pushl $1
 call add
 addl $12, %esp
 movl %eax, -4(%ebp)
 movl $0, %eax
 leave
 ret

stdcall:

int __attribute__((__stdcall__)) add(int a,int b,int c){
 int sum = a+b+c;
 return sum;
};

int main(void){
 int c=add(1,2,3);
}

add:
 pushl %ebp
 movl %esp, %ebp
 subl $16, %esp
 movl 8(%ebp), %edx
 movl 12(%ebp), %eax
 addl %eax, %edx
 movl 16(%ebp), %eax
 addl %edx, %eax
 movl %eax, -4(%ebp)
 movl -4(%ebp), %eax
 leave
 ret $12
main:
 pushl %ebp
 movl %esp, %ebp
 subl $16, %esp
 pushl $3
 pushl $2
 pushl $1
 call add
 movl %eax, -4(%ebp)
 movl $0, %eax
 leave
 ret

时间: 2024-10-09 18:00:50

stdcall和cdecl的相关文章

stdcall、cdecl、fastcall、thiscall 、naked call的汇编详解

函数调用规范 当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个.什么样的参数.即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调.为此,计算机提供了一种被称为栈的数据结构来支持参数传递. 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算.函数计算结束以后,或者调用者.或者函数本身修改堆栈,使堆栈恢复原装.在参数传递中,有两个很重要的问题必须得到明确说明: 1) 当参数个

stdcall与cdecl的区别

1 区别 VC++的C/C++函数有两种基本的调用约定:__stdcall.__cdecl.它们有什么区别呢?请参考下表:     __stdcall __cdecl 函数代码 C int __stdcall addS(int a,int b) { return a + b; } int __cdecl addC(int a,int b) { return a + b; } ASM32 push    ebp mov    ebp,esp sub    esp,40h push    ebx p

C++函数调用方式 stdcall pascal cdecl 总结

__stdcall:       _stdcall 调用约定相当于16位动态库中经常使用的PASCAL调用约定.在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall.除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定.两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)._stdcal

DWORD WINAPI?stdcall?

在网络编程实验2_(4)基于流式套接字的服务器程序设计中,创建了以下这个函数: DWORD WINAPI ClientThread(LPVOID lpParameter) 以前我只学过类似: int swap(int x,int y) 这样的函数,而这个函数看起来就很诡异,如何理解这个函数呢? DWORD是数据类型,在这里是返回值,返回32位数据. 在visual studio中WINAPI转到定义可以看到: #define WINAPI __stdcall 也就是说WINAPI是一个宏,所代表

64位BASM学习随笔(一)

?? Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,因为C/C++的内联汇编只能是或插入式的汇编代码,函数花括号背后隐藏的函数框架,限制了汇编代码的发挥,如无论有无参数和局部变量,总是有个栈框架,更烦人的是只要你在函数中使用了esi,edi,ebx寄存器,就自动给你保存和恢复,使得这些寄存器没法在函数之间传递信息等:而Delphi的BASM可以是插入式的汇编代码,也可是完全的汇编方法,在完全的汇编方法下,怎么发挥就是自己的事了.    De

<微软面经>2017上海APGC CSS实习共四面回忆录

原创博客,转载请联系博主! 今年微软在线笔试坑了,东拼西凑一共140分,心想哎自己和微软肯定无缘了的时候,忽然收到了微软的email问我愿不愿意接受调剂去CSS部门,抱着“既然笔试坑爹了,那好歹得去微软看两眼”的心态就去接受了调剂,然后就是一面二面三四面,遂作回忆录如下(由于我写下这篇博客的时候,时间已经过去了一周,所以有些问题可能会有遗漏):   (前三面为SQL Server组) 第一面技术面: 1. “首先用英语做一次自我介绍吧”,于是我就用我的蹩脚的英语勉强完成了个自我介绍,这里应该扣了

IDA.Pro权威指南 读书笔记

http://www.pediy.com/kssd/pediy12/142766.html 标 题:IDA.Pro权威指南 读书笔记[Made By C_lemon] 作 者:Dstlemoner 时 间:2011-11-14 11:56:17 链 接:http://bbs.pediy.com/showthread.php?t=142766    IDA为反汇编 和逆向破解的 静态分析利器 ! 虽然是利器,但是你不会用的话~那就另当别论了. →     唉.对于刚入门的新手来说,看前人走过的路程

变量那些事

1.局部变量 第一次提出局部变量,是在1960年的 ALGOL 60 语言,现在广泛使用的C语言就继承与它(语言图谱).局部变量让一段代码相对独立,让给纸带打孔的码农从全局变量中解脱.说到与局部变量,一定会想到子程序.从现代语言看,子程序和局部变量就如前门大少与杀毒哥,如胶似漆♂形影不离.有趣的是这两个概念并不是同时出现,子程序早于局部变量,是1958年由 FORTRAN II 语言提出.当时计算机硬件还没有栈的概念,子程序的返回地址不是通过压栈,而是通过一个固定地址存储.历史上除了现在熟悉的寄

调用约定CALLBACK

VC中涉及到调用约定的概念,特别是回调函数CALLBACK,WinAPI等. 这些其实都归结到调用约定上,VC中默认使用的时cdecl的C语言调用约定,而CALLBACK,WINAPI为stdcall即PASCAL调用约定.这两种约定在定义参数传递顺序及堆栈清楚方面有些差异.DELPHI采用的也是PASCAL约定,因此用DELPHI封装的函数在VC中调用时最好指定其约定是stdcall,否则容易造成程序崩溃. 同时,可以在IDE中设置工程默认使用的约定是stdcall还是cdecl.