首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈比它的需要多8字节

堆栈比它的需要多8字节
EN

Stack Overflow用户
提问于 2015-02-14 20:32:12
回答 1查看 165关注 0票数 0

我用c语言编写了非常简单的程序如下:

代码语言:javascript
复制
include<stdio.h>
#include<string.h>
main(int argc,char **argv)
{
char buffer[80];
getchar();
strcpy(buffer,argv[1]);
return 1;
}

当我拆开它时,它看起来如下所示:

代码语言:javascript
复制
0x08048414 <+0>:    push   %ebp
   0x08048415 <+1>: mov    %esp,%ebp
   0x08048417 <+3>: sub    $0x58,%esp
   0x0804841a <+6>: call   0x8048320 <getchar@plt>
   0x0804841f <+11>:    mov    0xc(%ebp),%eax
   0x08048422 <+14>:    add    $0x4,%eax
   0x08048425 <+17>:    mov    (%eax),%eax
   0x08048427 <+19>:    mov    %eax,0x4(%esp)
   0x0804842b <+23>:    lea    -0x50(%ebp),%eax
   0x0804842e <+26>:    mov    %eax,(%esp)
   0x08048431 <+29>:    call   0x8048330 <strcpy@plt>
   0x08048436 <+34>:    mov    $0x1,%eax
   0x0804843b <+39>:    leave  
   0x0804843c <+40>:    ret

我的问题是为什么它低于0x58从%,特别是,而不是0X50美元?我以80 "A“作为参数运行程序,这是一个接一个的堆栈(缓冲器,argv1)的结果;

代码语言:javascript
复制
x/24xw $esp

    0xbffff290: 0xbffff298  0xbffff51e  0x41414141  0x41414141
    0xbffff2a0: 0x41414141  0x41414141  0x41414141  0x41414141
    0xbffff2b0: 0x41414141  0x41414141  0x41414141  0x41414141
    0xbffff2c0: 0x41414141  0x41414141  0x41414141  0x41414141
    0xbffff2d0: 0x41414141  0x41414141  0x41414141  0x41414141
    0xbffff2e0: 0x41414141  0x41414141  0x00000000  0xb7e3f4d3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-14 22:40:40

额外的8个字节用于strcpy的参数。由于某些原因,编译器选择在堆栈中预分配它们,并使用esp作为索引寄存器直接存储它们的值,而不是使用通常使用的push指令。

因此,如果指令mov %eax,0x4(%esp)push %eax替换,指令mov %eax,(%esp)也被push %eax替换,编译器可以在堆栈上只分配80字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28520003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档