【发布时间】:2019-04-13 22:44:36
【问题描述】:
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 中?
【问题讨论】:
-
不清楚你在问什么。
标签: c assembly stack-frame