2

これはプログラムです:

#include <stdio.h>

void test_function(int a, int b, int c, int d){

    int flag;   
    flag = 31337;

}

int main(){

    test_function(1,2,3,4);
}

GDB から:

    Breakpoint 1, main () at stack_example.c:14
    14      test_function(1,2,3,4);
    (gdb) i r esp ebp eip
    esp            0xffffcf88   0xffffcf88
    ebp            0xffffcf98   0xffffcf98
    eip            0x8048402    0x8048402 <main+6>
    (gdb) cont
    Continuing.

    Breakpoint 2, test_function (a=1, b=2, c=3, d=4) at stack_example.c:8
    8       flag = 31337;
    (gdb) i r esp ebp eip
    esp            0xffffcf70   0xffffcf70
    ebp            0xffffcf80   0xffffcf80
    eip            0x80483f3    0x80483f3 <test_function+6>
    (gdb) 

Dump of assembler code for function test_function:
   0x080483ed <+0>: push   ebp
   x080483ee <+1>:  mov    ebp,esp
   0x080483f0 <+3>: sub    esp,0x10
=> 0x080483f3 <+6>: mov    DWORD PTR [ebp-0x4],0x7a69
   0x080483fa <+13>:    leave  
   0x080483fb <+14>:    ret    

GDB から、EBP が main() の ESP と同じ値を持たないのはなぜですか? mov ebp, esp EBP == にするべきではありません0xffffcf88か? これにより、EBP が ESP に設定されると思いました。

編集:

私は自分の質問に答えたかもしれないと思います。私を修正してください。ESP は、リターン アドレスと保存されたフレーム ポインターがスタックにプッシュされるときに移動されます。

このESP値は0xffffcf88、2 つの値 (両方とも 4 バイト) がスタックにプッシュされる前のものです。その後、その値は0xffffcf88 - 0x8==0xffffcf80です。これがEBPの現在の価値です。次に ESP -= 0x10 です。

ESP の値はどのように変更されますか? のようなものmov ESP, ESP - 0x8ですか?

4

1 に答える 1