为什么这里的堆栈/基指针没有改变?

问题描述

我编写了以下函数来稍微玩弄内联汇编并打印出各种寄存器:

void run(void)
{
    long rsp,rbp;
    asm("mov %%rsp,%0;" "mov %%rbp,%1;" : "=r" (rsp),"=r" (rbp));
    printf("Middle\n%%rsp = %#lx\n" "%%rbp = %#lx\n",rsp,rbp);
}
int main(void)
{
    long rsp,"=r" (rbp));
    printf("Start\n%%rsp = %#lx\n" "%%rbp = %#lx\n",rbp);

    run();
    long a,b,c;
    char* d = "Hello";
    char e[10];

    asm("mov %%rsp,"=r" (rbp));
    printf("End\n%%rsp = %#lx\n" "%%rbp = %#lx\n",rbp);
}

它打印出以下内容

Start
%rsp = 0x7ffeec93bf60
%rbp = 0x7ffeec93bf90
Middle
%rsp = 0x7ffeec93bf40
%rbp = 0x7ffeec93bf50
End
%rsp = 0x7ffeec93bf60 * same as start
%rbp = 0x7ffeec93bf90 * same as start

因此,在上述情况下,堆栈/基指针在进入另一个函数(中间)时会发生变化,但为什么在 main 函数中间定义这 5 个变量时它没有变化?除了调用函数之外,还有哪些类型的操作会导致堆栈发生变化?或者这完全取决于编译器,而当不直接在 asm 中编写时,您真的没有任何控制权?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)