首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

堆栈是怎么被使用的?

2012-03-05 
堆栈是如何被使用的???#includestring.hintmain(){charstr1[10]strcpy(str1,okhaha123456789012345678

堆栈是如何被使用的???
#include   <string.h>
int   main()
{
      char   str1[10];
      strcpy(str1,   "okhaha12345678901234567890123456789 ");
      return   0;
}
以上源程序,以下是反汇编的代码
编译使用gcc   3.4.2
gcc   -c   test.c   -g  
反汇编使用IDA   Pro

public   _main
_mainproc   near

var_38=   dwordptr   -38h
var_34=   dwordptr   -34h
var_1C=   dwordptr   -1Ch
var_18=   dwordptr   -18h

pushebp
movebp,   esp
subesp,   38h     //这里为什么是38呢???
andesp,   0FFFFFFF0h
moveax,   0
addeax,   0Fh
addeax,   0Fh
shreax,   4
shleax,   4
mov[ebp+var_1C],   eax   //为什么这里从1C开始???
moveax,   [ebp+var_1C]
call__alloca
call___main
mov[esp+38h+var_34],   offset   aOkhaha12345678   ;   "okhaha12345678901234567890123456789 "
leaeax,   [ebp+var_18]   //18里面到底有什么?
mov[esp+38h+var_38],   eax
call_strcpy
moveax,   0
leave
retn
_mainendp

详细问题见上面注释中的。
那个esp   -   38h然后在与上一个FFFFFF0h我一直不明白,为什么这么搞??
还有从ebp-4开始,到ebp-1C之前,还有很多的堆栈空间呢,为什么都不用,正好要用ebp-1C呢?
还有就是后面调strcpy的时候,需要传两个参数,一个参数是常量字符串,没什么疑问,那个参数在data段,而另一个,目的地址到底在哪里呢?
为什么正好在ebp-18h那个地方呢?
那个里面有什么呢?

我想从反汇编代码中看出strcpy的两个参数的实际长度,也就是要依此判断是否产生缓冲区溢出,上面给出的是最最简单的情况,但是那个ebp-18h让我百思不得其解啊~~

[解决办法]
你先把下面一行去掉,编译一下,看看是什么情况?嵌套的函数共享程序的堆栈,所以情况就负责了。
strcpy(str1, "okhaha12345678901234567890123456789 ");

热点排行