今天有点郁闷,学校开学前例行的电路检查,从早上8点到下午3点停电。 开机,进入LINUX,打开我的BLOG,发现居然有人看过并评论之,心中窃喜,我可是第一次写这玩意儿呀:) 于是赶紧把昨天的“实验报告“写出来,可是我惊奇的发现,在MOZILLA下无法“写”字:( 没办法,在得到那个C程序的汇编码后只好切换了系统。 还是闲话少说,怨气少发,把昨天的结果弄出来(请点击阅读全文): 先是最简单一段代码 #include void main() { char buf[10]; char *p; p = alloca(sizeof(buf)); buf[9] = 'A'; p[9] = 'a'; return; } 汇编码就不贴了,把它的栈分配情况贴出来: 这里为了简化,假设了外部环境调用时的esp的低四位是全0的。 
当buf大小为1时,分配了8个内存单元,但实际buf地址是位于ebp-1,这时buf越界必定造成错误。 当buf大小为2时,分配情况同上,buf地址位于ebp-2处。 sizeof(buf) == 3,分配24个内存单元,buf地址位于ebp-24处,所以buf越界不一定是程序死掉。 从4到7,情况和3一样。 sizeof(buf) == 8,分配8个内存单元,刚好排满,。 从9到16,情况和3相同, 从17开始,分配40个内存单元,buf地址都是等于栈未对齐时esp. ......... 这里面的对应关系看起来似乎是8的倍数关系和取了某个数的模,但我还不知道是哪个数学表达式。 这和WINDOWS下用TCC做的16位汇编代码有很大区别,不用看它的汇编代码也能完全正确的画出栈的分配情况,和GCC相比要简单的多。 |