目前,我正在解决一个需要在调用堆栈中输出一些值的问题。这是我做的:
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
另一个问题是如果我这样做了:
printf("%x", ebp-4);
出局是
ff7f78
任何人都能解释为什么输出不是ff7f84吗?
提前谢谢大家!
答案 0 :(得分:1)
不,编译器可以做任何想做的事。
不,编译器可以做任何想做的事。
您可能将ebp
声明为char *
以外的其他内容。你看到了指针运算的结果。在这种情况下,它看起来像是一个指向4字节类型的指针。您不应该使用%x
来打印指针。这就是%p
的用途。