2

我正在尝试理解我从 gdb disassemble 获得的 c 程序的汇编代码,你能帮帮我吗?

我的 C 代码:

#include <unistd.h>



int main(int argc, char *argv[])

{

char buff[100];

/*if no argument…*/

if(argc <2)

{

   printf("Syntax: %s <input string>\n", argv[0]);

   exit (0);

     }

  strcpy(buff, argv[1]);

  return 0;

}

我的主要功能的汇编代码是:

函数 main 的汇编代码转储:

    0x08048424 <+0>:    push   %ebp
    0x08048425 <+1>:    mov    %esp,%ebp
    0x08048427 <+3>:    and    $0xfffffff0,%esp
    0x0804842a <+6>:    add    $0xffffff80,%esp
    0x0804842d <+9>:    cmpl   $0x1,0x8(%ebp)
    0x08048431 <+13>:    jg     0x8048454 <main+48>
    0x08048433 <+15>:    mov    0xc(%ebp),%eax
    0x08048436 <+18>:    mov    (%eax),%eax
    0x08048438 <+20>:    mov    %eax,0x4(%esp)
    0x0804843c <+24>:    movl   $0x8048544,(%esp)
    0x08048443 <+31>:    call   0x8048344 <printf@plt>
    0x08048448 <+36>:    movl   $0x0,(%esp)
    0x0804844f <+43>:    call   0x8048354 <exit@plt>
    0x08048454 <+48>:    mov    0xc(%ebp),%eax
    0x08048457 <+51>:    add    $0x4,%eax
    0x0804845a <+54>:    mov    (%eax),%eax
    0x0804845c <+56>:    mov    %eax,0x4(%esp)
    0x08048460 <+60>:    lea    0x1c(%esp),%eax

分配 buff[100] 大小的部分在哪里?

4

3 回答 3

4

这里:

add    $0xffffff80,%esp

这将 128 个字节(加 -128)减去 ESP(堆栈指针寄存器)。

于 2013-04-13T10:17:12.880 回答
4

以下代码

int main(int argc, char *argv[])
{

char buff[100];

请求在堆栈上创建一个 char[100] 缓冲区。这是实际发生的事情:

;// 1. pushing the base pointer register on the stack
0x08048424 <+0>:    push   %ebp

;// 2. Creating the stack frame. Copying the stack pointer register to the base pointer 
;// register creates a stack frame: an area on the stack where a subroutine
;// can store local data.  
0x08048425 <+1>:    mov    %esp,%ebp

;// 3. Making sure that the stack is aligned to 16 bytes.
0x08048427 <+3>:    and    $0xfffffff0,%esp

;// 4. Making room for 128 bytes (100 as requested would throw off the alignment).
;// 128 is compatible with your requests and is optimized.
0x0804842a <+6>:    add    $0xffffff80,%esp

因此,这是您正在创建的缓冲区,位于 16 字节对齐的堆栈上。你要求 100,编译器至少给你 100,同时优化速度。

于 2013-04-13T10:32:04.110 回答
3

I guess it's this one add $0xffffff80,%esp. Moving the stack pointer to make space available inside the function.

于 2013-04-13T10:17:56.753 回答