C语言参数依照从右到左的顺序依次传入栈中。有几个参数就传入几个参数。

int fun(int a,int b)

{

return a-b;

}

int main(void)

{

fun(5,-1);

return 0;

}

汇编代码

fun:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax

subl 12(%ebp), %eax

popl %ebp

ret

main:

pushl %ebp

movl %esp, %ebp

pushl $-1

pushl $5

call fun

addl $8, %esp

movl $0, %eax

leave

ret

当参数为char ,unsigned char,short,unsigned short时会自动扩展为int。

int fun(char a,unsigned char b,short c,unsigned short d)

{

return 0;

}

int main(void)

{

char a=-1;

unsigned char b=1;

short c=-2;

unsigned short d=2;

fun(a,b,c,d);

return 0;

}

汇编代码

fun:

pushl %ebp

movl %esp, %ebp

pushl %ebx

subl $16, %esp

movl 8(%ebp), %ebx

movl 12(%ebp), %ecx

movl 16(%ebp), %edx

movl 20(%ebp), %eax

movb %bl, -8(%ebp)

movb %cl, -12(%ebp)

movw %dx, -16(%ebp)

movw %ax, -20(%ebp)

movl $0, %eax

addl $16, %esp

popl %ebx

popl %ebp

ret

main:

pushl %ebp

movl %esp, %ebp

pushl %ebx

subl $16, %esp

movb $-1, -10(%ebp)

movb $1, -9(%ebp)

movw $-2, -8(%ebp)

movw $2, -6(%ebp)

movzwl -6(%ebp), %ebx

movswl -8(%ebp), %ecx

movzbl -9(%ebp), %edx

movsbl -10(%ebp), %eax

pushl %ebx

pushl %ecx

pushl %edx

pushl %eax

call fun

addl $16, %esp

movl $0, %eax

movl -4(%ebp), %ebx

leave

ret

以上fun函数都是在一个文件内写的,如果fun函数在另一个文件中,函数参数调用会有什么区别呢?

extern int fun(int a);

int fun2(void)

{

fun(123);

}

int main(void)

{

fun2();

}

汇编代码

fun2:

pushl %ebp

movl %esp, %ebp

subl $8, %esp

subl $12, %esp

pushl $123

call fun

addl $16, %esp

nop

leave

ret

看到subl $12, %esp了吗,12字节+传入的参数123(4字节)=16字节。如果是调用外部函数参数占用的空间大小都会变为16的倍数。

还有subl $8, %esp,8字节+%ebp(4字节)+返回地址(4字节)=16字节。这也是为了数据对齐操作。

c语言如何实现全部参数加9,从C语言到汇编(九)函数参数相关推荐

  1. 宏定义不是c语言语句 行末不必加分号,模拟C语言试题-02(2).doc

    精通教育集团-软件学院专业课集训营资料 PAGE PAGE 1 2016年天津市大学软件学院高职升本专业课模拟试题-02 考场号 考生号 姓名 第一部分 C语言部分 100分 一.单项选择题(共25小 ...

  2. c语言浮点型自变量能自加自减,C语言中自加++自减--运算的数据类型可以是Float和Double么?...

    自加++自减--运算的数据类型可以是Float和Double. 在c语言中,并不是所有变量都可以使用自增自减操作符:可以使用自增自减操作符的数据类型有:int.float.double .char.l ...

  3. c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版

    最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...

  4. 以太坊智能合约函数参数ABI编码,动态类型string编码,函数参数的ABI编码, 含c++代码

    官方文档讲得不全也不是很清楚,特别是动态类型string.这里补充. 以太坊的智能合约ABI编码,官方文档和说明:https://solidity.readthedocs.io/en/v0.6.8/a ...

  5. 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

    之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针.今天来看看二维数组的情形 文章目录 1 为什么C语言中的数组作为函数参数会退化为指针? 2 二维数组作为函数参数如 ...

  6. C语言 main 函数参数 main(int argc, char *argv[]) - C语言零基础入门教程

    目录 一.main 函数写法 二.main 函数参数简介 三.使用 main 函数参数 1.打印 main 函数参数 a.直接运行 exe 文件 b.打开 cmd 命令行窗口执行 exe 文件 c.打 ...

  7. 【C语言】函数参数试探:传指针与传引用——以队列为例

    首先,实现一个简单的队列: #define Maxsize 100 #define ElemType int//队列 typedef struct Queue{ElemType data[Maxsiz ...

  8. C语言多维数组做函数参数退化原因大剖析

    多维数组做函数参数退化原因 多维数组做函数参数退化原因大剖析 多维数组做函数参数退化原因大剖析 //证明一下多维数组的线性存储 //线性打印 void printfArray411(int *arra ...

  9. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...

最新文章

  1. linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...
  2. 机房合作--驼峰命名法
  3. Systick 延时函数详解
  4. sysdig案例分析 - 哪些文件正在被进程访问
  5. qt tableview修改表格内容_如何修改一次代码就可以完成多种类型 cell 的 UITableView 增删修改
  6. OpenShift 4 - OpenShift是如何升级RHCOS的
  7. 你自认为理解了JavaScript?
  8. WSL:vi 的使用、只读下的修改操作
  9. 管家婆A8 TOP V9.5.1版本安装需知!
  10. 使用Chrome谷歌浏览器打开Axure原型图
  11. 本特利传感器9200-01-05-10-00
  12. python记录鼠标和键盘操作并重复_鼠标和键盘操作
  13. 高仿QQ举报网页和举报成功网站页源码
  14. CAD关于文字样式删除文字样式操作(com接口c#语言)
  15. ASP站内搜索代码#
  16. 【BLE】跳频算法实例分析
  17. solidworks装配体改为柔性_Y型钣金通风管道用SolidWorks怎么建模?溪风实战讲解
  18. 计算机使用方法的书,是否知道飞鸽传书软件的详细使用方法?查看介绍
  19. 来个大佬帮看下这个密文如何解密
  20. yum安装iostat命令时,提示No package iostat available. 错误:无须任何处理

热门文章

  1. 02 ARM11 时钟初始化后的跑马灯程序
  2. 错误提示:error LNK2001: unresolved external symbol public: static int person::weight (?weight@person@@
  3. Mail.Ru Cup 2018 Round 1 virtual participate记
  4. Python实例:11~20例
  5. sql server 碎片整理——DBCC SHOWCONTIG
  6. 15_http响应相关概念
  7. Getting Started with STM32 in Segger Embedded Studio
  8. Visual C# 2008+SQL Server 2005 数据库与网络开发--第13章 使用菜单和对话框
  9. 力荐iReaper/as a Weekend Systems Admin...为何我从来没用过GHOST?
  10. Unknown symbol platform_driver_unregister (err 0)