- 6
- 0
- 约7.46千字
- 约 6页
- 2017-04-12 发布于湖北
- 举报
C语言函数参数入栈的汇编理解汇编
先来看这样一段程序:[cpp]view plaincopyprint?#include?string.h??#include?stdlib.h??#include?stdio.h????void?print1(int?a,int?b,int?c)??{??????printf(%p\n,a);??????printf(%p\n,b);??????printf(%p\n,c);??}????int?main(void)??{?????print1(1,2,3);?????exit(0);??}??#include string.h#include stdlib.h#include stdio.hvoid print1(int a,int b,int c){ printf(%p\n,a); printf(%p\n,b); printf(%p\n,c);}int main(void){ print1(1,2,3); exit(0);}它的输出是:[cpp]view plaincopyprint?0022FF40??0022FF44??0022FF48??0022FF400022FF440022FF48发现a,b,c的地址是逐渐增大的,差值是4个字节。这和我所知道的:C函数参数入栈的顺序是从右到左是相匹配的,而且地址的增大值也与变量所占的字节数相匹配。不过当把程序稍微做一下修改,如下:[cpp]view plaincopyprint?#include?string.h??#include?stdlib.h??#include?stdio.h????void?print2(char?a,char?b,char?c)??{?????printf(%p\n,a);?????printf(%p\n,b);?????printf(%p\n,c);??}????int?main(void)??{?????print2(1,2,3);?????exit(0);??}??#include string.h#include stdlib.h#include stdio.hvoid print2(char a,char b,char c){ printf(%p\n,a); printf(%p\n,b); printf(%p\n,c);}int main(void){ print2(1,2,3); exit(0);}再观察一下它的输出:[cpp]view plaincopyprint?0022FF2C??0022FF28??0022FF24??0022FF2C0022FF280022FF24怎么和上面的效果是相反的!虽然我知道这肯定编译器的一个技巧,不过参数入栈的顺序是从右到左的概念却动摇了。为了弄清楚其中的道理,必须观察程序生成的中间.s文件,为此,我执行了以下一条命令:[cpp]view plaincopyprint?gcc?-S?test.c(当前C文件中保存的程序是文章一开始的那个)?在当前目录下生成test.s文件??gcc -S test.c(当前C文件中保存的程序是文章一开始的那个) 在当前目录下生成test.s文件使用vim打开test.s文件(只截取主要内容了):esp是指向栈顶的指针,ebp是用来备份这个指针的。栈的形状如下:espebp|____________________________________________________栈的最大值 ?? 栈的最小值每压入一个参数入栈,就执行 ?esp = esp - sizoeof(参数)。不过在esp值变之前,先备份一下ebp = esp,这样不管最后esp指到哪里去了,函数结束时就用这个ebp就能顺利回到调用者了。[cpp]view plaincopyprint?print1:?????pushl?%ebp//6.先把ebp压栈,保存这个指针?????movl??%esp,?%ebp//7.使ebp这个指针保存着esp这个指针指向的地址值?????subl??$8,?%esp//8.使esp?-?8,也就是说空下8个字节以便实现某个功能?????leal???8(%ebp),?%eax//9.把(ebp?+?8)的地址给eax?这个地方为什么要+8?因为这个函数在经历第5,6步的时候存在着压了两个4字节入栈的操作。此时+8就指向了实参1?????movl??%eax,?4(%esp)//10.这个时候就用到第8步空下来的8个字节中的4个了,原来是保存值,原理就是用C语言写两个数交换值时的那个第三个变量,即缓冲区?????movl??$.LC0,?(%esp)span?style=white-space:pre????/span//1
您可能关注的文档
- C数据类型汇编.ppt
- C入门教程汇编.ppt
- C控件使用汇编.doc
- C区混凝土专项施工方案汇编.doc
- C程序设计23对文件的输入输出汇编.ppt
- C程序设计基础4基本输入输出汇编.ppt
- c程序设计基础3数据类型常量和变量汇编.ppt
- c第三章处理机调度与死锁汇编.ppt
- cyberspace汇编.pptx
- C入门经典教程汇编.ppt
- 小区绿化施工协议书.docx
- 墙面施工协议书.docx
- 1 古诗二首(课件)--2025-2026学年统编版语文二年级下册.pptx
- (2026春新版)部编版八年级道德与法治下册《3.1《公民基本权利》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《4.3《依法履行义务》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《6.2《按劳分配为主体、多种分配方式并存》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《6.1《公有制为主体、多种所有制经济共同发展》PPT课件.pptx
- 初三教学管理交流发言稿.docx
- 小学生课外阅读总结.docx
- 餐饮门店夜经济运营的社会责任报告(夜间贡献)撰写流程试题库及答案.doc
最近下载
- Q_LNKJ06-2020中负荷车辆齿轮油GL-4.pdf
- SJ∕T 10460-2016 太阳光伏能源系统图用图形符号.pdf
- 新求精德语强化教程(第4版)初级1课后练习答案(改进版) .pdf VIP
- 北师大版三年级下册数学全册教学设计(配2026年春改版教材).docx
- (2026年)跌倒坠床护理综合指南PPT课件.pptx VIP
- 工程设计应急响应方案(3篇).docx VIP
- 征信简版电子版PDF个人信用报告最新版2024年可编辑带水印模板.pdf VIP
- ntvf调试资料解读.doc VIP
- 电影《色.戒》的叙事伦理.doc VIP
- 上海大学2023-2024学年第1学期《高等数学(上)》期末考试试卷(A卷)附参考答案.pdf
原创力文档

文档评论(0)