首页 > 解决方案 > 为什么这里的堆栈/基指针不改变?

问题描述

我编写了以下函数来使用内联汇编并打印出各种寄存器:

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, rbp;
    asm("mov %%rsp, %0;" "mov %%rbp, %1;" : "=r" (rsp), "=r" (rbp));
    printf("Start\n%%rsp = %#lx\n" "%%rbp = %#lx\n", rsp, rbp);

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

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

它打印出以下内容:

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

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

标签: cassemblyx86inline-assemblystack-frame

解决方案


推荐阅读