获取C中的%ebp,%esp和堆栈中的输出值

时间:2013-02-09 20:50:20

标签: c x86

目前,我正在解决一个需要在调用堆栈中输出一些值的问题。这是我做的:

int funcA() 
{ 
    int a = 1;
    int b = 2;
    char c = '3';
    asm("mov %ebp, ebp");
    asm("mov %esp, esp");
    printf("&a = %x\n", &a);
    printf("&b = %x\n", &b);
    printf("&c = %x\n", &c);
    printf("esp = %X  ebp = %X\n", esp, ebp);
}
esp和ebp已提前申报。上面代码的输出是:

&a = ff7f7c
&b = ff7f78
&c = ff7f77
esp = FF7F68  ebp = FF7F88
  1. 为什么& c = ff7f77?在堆栈中,每个块应该等于4个字节,无论其类型如何,对吧?
  2. 为什么esp = ff7f68?我认为它应该等于& c-4
  3. 另一个问题是如果我这样做了:

    printf("%x", ebp-4);
    
  4. 出局是

    ff7f78
    

    任何人都能解释为什么输出不是ff7f84吗?

    提前谢谢大家!

1 个答案:

答案 0 :(得分:1)

  1. 不,编译器可以做任何想做的事。

  2. 不,编译器可以做任何想做的事。

  3. 您可能将ebp声明为char *以外的其他内容。你看到了指针运算的结果。在这种情况下,它看起来像是一个指向4字节类型的指针。您不应该使用%x来打印指针。这就是%p的用途。