c - 为什么这里的堆栈/基指针不改变?
问题描述
我编写了以下函数来使用内联汇编并打印出各种寄存器:
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 编写时,你真的无法控制它?
解决方案
推荐阅读
- python - 如何检查 Docker 容器微服务中的 python 日志记录
- python - 从两个字符串中删除常用术语
- tomcat - 用于多个 Tomcat 实例的单个 Tomcat GUI 或管理器
- java - MySQL DATEDIFF 和 TO_DAYS 返回非常大且不正确的值
- python - 如何在 Python 中更改光标图像
- spring - 访问 Spring Boot 指标端点的问题
- django - Django 尝试在 save() 上插入而不是更新
- php - 如何每两个值对数组进行切片和分组?
- c# - 在运行时从调试可视化工具中检测源语言
- xamarin.forms - 有没有办法使用 Xamarin.Forms PCL 项目中的 Devexpress.Xamarin.Android.Charts