簡體   English   中英

GDB為一個簡單的程序進行反匯編

[英]GDB disassemble for a simple program

這是C中的一個簡單程序,我使用gdb對其進行反匯編以了解發生了什么。

#include <stdio.h>
#include <string.h>
int main(){
    printf("%d", sizeof(foo("HELLOWORLD")));
}

int foo(char* c)
{
   printf("%s\n",c);
}

以下是反匯編主要的相應匯編代碼

0x08048414 <+0>:    push   %ebp
   0x08048415 <+1>: mov    %esp,%ebp
   0x08048417 <+3>: and    $0xfffffff0,%esp
   0x0804841a <+6>: sub    $0x10,%esp
   0x0804841d <+9>: mov    $0x8048520,%eax
   0x08048422 <+14>:    movl   $0x4,0x4(%esp)
   0x0804842a <+22>:    mov    %eax,(%esp)
   0x0804842d <+25>:    call   0x8048320 <printf@plt>
   0x08048432 <+30>:    leave  
   0x08048433 <+31>:    ret   

以下是拆解foo

0x08048434 <+0>:    push   %ebp
   0x08048435 <+1>: mov    %esp,%ebp
   0x08048437 <+3>: sub    $0x18,%esp
   0x0804843a <+6>: mov    0x8(%ebp),%eax
   0x0804843d <+9>: mov    %eax,(%esp)
   0x08048440 <+12>:    call   0x8048330 <puts@plt>
   0x08048445 <+17>:    leave  
   0x08048446 <+18>:    ret  

我對這些說明感到困惑:

  1. 0x08048417 <+3> and $0xfffffff0,%esp為什么堆棧指針在未被修改之前需要對齊?

  2. 0x0804841a <+6>:sub $0x10,%esp這條指令究竟對程序有什么影響?

  3. 0x0804841d <+9>:mov $0x8048520,%eax這個指令對程序有什么影響?

  4. mov %eax,(%esp) %esp周圍的括號是什么意思?

如果有人解釋了這個會很有幫助。

  1. 屬於(function-)序言,它通過對SP進行位掩碼將SP與16字節邊界對齊。

  2. 創建堆棧幀的內存,因為您的指針需要傳遞給函數。 地址將從堆棧傳遞給函數。 然而,似乎表達式在編譯時被清除,因此不需要實際的調用。

  3. 0x8048520可能是字符串“%d”的地址。 它被放入eax,從那里它使用stackpointer放在堆棧上。

周圍有很多材料,像這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM