C语言函数参数入栈的汇编理解汇编.docxVIP

  • 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

文档评论(0)

1亿VIP精品文档

相关文档