/*支持变长栈帧
一般的代码在编译的时候编译器事先就能知道需要为栈帧分配多大的空间,但有的时候我们需要用到动态分配,即在运行的时候才知道需要多大的空间*/
#include<iostream>
using namespace std;
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];
}
一般的代码在编译的时候编译器事先就能知道需要为栈帧分配多大的空间,但有的时候我们需要用到动态分配,即在运行的时候才知道需要多大的空间*/
#include<iostream>
using namespace std;
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];
}
/*这个函数接受3个参数,n idx *q
创建一个局部变量i
创建一个指针数组p,有n个元素
p[0]设为i的地址
p[1]到p[n-1]的值设为q
返回p[idx]的值
创建一个局部变量i
创建一个指针数组p,有n个元素
p[0]设为i的地址
p[1]到p[n-1]的值设为q
返回p[idx]的值
vframe:
1 pushq %rdp
2 moveq %rsp,%rdp 设置基指针
3 subq $16, %rsp 分配16字节的空间来储存i,i为long,只需要8个字节,但这里分配了16个字节,是为了内存16位对齐的原因,多余的8个字节将不被使用
4 leaq 22(,%rdi,8),%rax %rax=8n+22
5 andq $-16,%rax %rax=(8n+22
1 pushq %rdp
2 moveq %rsp,%rdp 设置基指针
3 subq $16, %rsp 分配16字节的空间来储存i,i为long,只需要8个字节,但这里分配了16个字节,是为了内存16位对齐的原因,多余的8个字节将不被使用
4 leaq 22(,%rdi,8),%rax %rax=8n+22
5 andq $-16,%rax %rax=(8n+22