2

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

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);
    

输出是

ff7f78

谁能解释为什么我的输出不是 ff7f84 ?

谢谢大家!

4

1 回答 1

1
  1. 不,编译器可以为所欲为。

  2. 不,编译器可以为所欲为。

  3. 您可能声明ebpchar *. 您正在看到指针运算的结果。在这种情况下,它看起来像是一个指向 4 字节类型的指针。无论如何,您不应该使用%x打印指针。这%p就是为了。

于 2013-02-09T20:59:44.917 回答