了解gdb生成的程序集

时间:2013-04-13 10:14:18

标签: c assembly gdb

我正在试图理解我从gdb反汇编中得到的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函数的汇编代码是:

转储函数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]大​​小的部分在哪里?

3 个答案:

答案 0 :(得分:4)

下面:

add    $0xffffff80,%esp

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

答案 1 :(得分: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,同时优化速度。

答案 2 :(得分:3)

我猜这是add $0xffffff80,%esp。移动堆栈指针以在函数内部提供空间。