c语言如何实现全部参数加9,从C语言到汇编(九)函数参数
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语言到汇编(九)函数参数相关推荐
- 宏定义不是c语言语句 行末不必加分号,模拟C语言试题-02(2).doc
精通教育集团-软件学院专业课集训营资料 PAGE PAGE 1 2016年天津市大学软件学院高职升本专业课模拟试题-02 考场号 考生号 姓名 第一部分 C语言部分 100分 一.单项选择题(共25小 ...
- c语言浮点型自变量能自加自减,C语言中自加++自减--运算的数据类型可以是Float和Double么?...
自加++自减--运算的数据类型可以是Float和Double. 在c语言中,并不是所有变量都可以使用自增自减操作符:可以使用自增自减操作符的数据类型有:int.float.double .char.l ...
- c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版
最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...
- 以太坊智能合约函数参数ABI编码,动态类型string编码,函数参数的ABI编码, 含c++代码
官方文档讲得不全也不是很清楚,特别是动态类型string.这里补充. 以太坊的智能合约ABI编码,官方文档和说明:https://solidity.readthedocs.io/en/v0.6.8/a ...
- 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针
之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针.今天来看看二维数组的情形 文章目录 1 为什么C语言中的数组作为函数参数会退化为指针? 2 二维数组作为函数参数如 ...
- C语言 main 函数参数 main(int argc, char *argv[]) - C语言零基础入门教程
目录 一.main 函数写法 二.main 函数参数简介 三.使用 main 函数参数 1.打印 main 函数参数 a.直接运行 exe 文件 b.打开 cmd 命令行窗口执行 exe 文件 c.打 ...
- 【C语言】函数参数试探:传指针与传引用——以队列为例
首先,实现一个简单的队列: #define Maxsize 100 #define ElemType int//队列 typedef struct Queue{ElemType data[Maxsiz ...
- C语言多维数组做函数参数退化原因大剖析
多维数组做函数参数退化原因 多维数组做函数参数退化原因大剖析 多维数组做函数参数退化原因大剖析 //证明一下多维数组的线性存储 //线性打印 void printfArray411(int *arra ...
- python函数定义与参数_Python函数的定义方式与函数参数问题实例分析
本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...
最新文章
- linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...
- 机房合作--驼峰命名法
- Systick 延时函数详解
- sysdig案例分析 - 哪些文件正在被进程访问
- qt tableview修改表格内容_如何修改一次代码就可以完成多种类型 cell 的 UITableView 增删修改
- OpenShift 4 - OpenShift是如何升级RHCOS的
- 你自认为理解了JavaScript?
- WSL:vi 的使用、只读下的修改操作
- 管家婆A8 TOP V9.5.1版本安装需知!
- 使用Chrome谷歌浏览器打开Axure原型图
- 本特利传感器9200-01-05-10-00
- python记录鼠标和键盘操作并重复_鼠标和键盘操作
- 高仿QQ举报网页和举报成功网站页源码
- CAD关于文字样式删除文字样式操作(com接口c#语言)
- ASP站内搜索代码#
- 【BLE】跳频算法实例分析
- solidworks装配体改为柔性_Y型钣金通风管道用SolidWorks怎么建模?溪风实战讲解
- 计算机使用方法的书,是否知道飞鸽传书软件的详细使用方法?查看介绍
- 来个大佬帮看下这个密文如何解密
- yum安装iostat命令时,提示No package iostat available. 错误:无须任何处理
热门文章
- 02 ARM11 时钟初始化后的跑马灯程序
- 错误提示:error LNK2001: unresolved external symbol public: static int person::weight (?weight@person@@
- Mail.Ru Cup 2018 Round 1 virtual participate记
- Python实例:11~20例
- sql server 碎片整理——DBCC SHOWCONTIG
- 15_http响应相关概念
- Getting Started with STM32 in Segger Embedded Studio
- Visual C# 2008+SQL Server 2005 数据库与网络开发--第13章 使用菜单和对话框
- 力荐iReaper/as a Weekend Systems Admin...为何我从来没用过GHOST?
- Unknown symbol platform_driver_unregister (err 0)