gpt4 book ai didi

c - 可变大小栈帧的汇编(关于局部变量的栈)

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:55 28 4
gpt4 key购买 nike

long vframe(long n, long idx, long *q){
long i;
long *p[n];
p[0] = &i;
for(i=1; i<n; i++)
p[i]=q;
return *p[idx];
}

我有 vframe 函数并生成了这样的汇编代码

1: vframe:
2: pushq %rbp
3: movq %rsp, %rbp
4: subq $16, %rsp
5: leaq 22(, %rdi, 8), %rax # I think the number 22 is vary from machine and OS
6: andq $-16, %rax
7: subq %rax, %rsp
8: leaq 7(%rsp), %rax
9: shrq $3, %rax
10: leaq 0(, %rax, 8), %r8
11: movq %r8, %rcx
................................
12: L3:
13: movq %rdx, (%rcx, %rax, 8)
14: addq $1, %rax
15: movq %rax, -8(%rbp)
16: L2:
17: movq -8(%rbp), %rax
18: cmpq %rdi, %rax
19: jl L3
20: leave
21: ret

如果我们看到第 8 行到第 11 行,我们没有将 p 的地址压入堆栈,但程序集已经假定 &p[0] 在 %rsp 中,因为 leaq 0(, %rax, 8),%r8 表示指令将 %r8 设置为 &p[0](实际上我通过检查我自己的编译器来检查变量 i 是否被移动到堆栈像 movq $0x1,-0x8(%rbp) 但我找不到关于 &p[0])

如果我们想要一些参数不被破坏,我们压入一些寄存器并将被调用者保存的寄存器移动到压入的寄存器。但是,在这种情况下,似乎不是。 这段代码中是否还有其他关于局部变量的约定,如 i 和 &p[0] ?我的意思是,即使我们没有将 &p[0] 压入堆栈,为什么 &p[0] 仍在 %rsp 中?

最佳答案

编译器在内部跟踪每个局部变量的偏移量,包括 p。它不需要将局部变量的地址存储在堆栈上。在这种情况下,它知道 p 在 (%rsp)。

除了 rbp,此代码不使用任何调用保留寄存器,因此它只保存了一个。

关于c - 可变大小栈帧的汇编(关于局部变量的栈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53241386/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com