// frame_manager.c #include "frame_manager.h" #include #include struct frame_manager { int shadow_space; // 影子空间大小(字节) int saved_reg_size; // 已分配的保存寄存器区域大小 int local_size; // 已分配的局部变量区域大小 int align; // 栈对齐要求 }; void frame_manager_init(frame_manager_t *fm, int shadow_space, int align) { fm->shadow_space = shadow_space; fm->saved_reg_size = 0; fm->local_size = 0; fm->align = align; } int frame_alloc_slot(frame_manager_t *fm, int size) { int offset = fm->local_size; fm->local_size += size; return offset; // 返回虚拟偏移(从0开始) } int frame_alloc_saved_reg(frame_manager_t *fm, int reg_width) { int offset = fm->saved_reg_size; fm->saved_reg_size += reg_width; return offset; } int frame_total_size(frame_manager_t *fm) { int total = fm->shadow_space + fm->saved_reg_size + fm->local_size; // 对齐到 align 字节 return (total + fm->align - 1) & ~(fm->align - 1); } int frame_slot_offset(frame_manager_t *fm, int slot_idx) { // 布局: RBP 指向保存的 RBP,向下依次是: // [影子空间] [保存寄存器区] [局部变量区] // 局部变量区的起始地址 = RBP - (8 + shadow_space + saved_reg_size) // 其中 8 是 push rbp 占用的空间(返回地址在 RBP+8,但 RBP 本身指向保存的 // RBP) int base = 8 + fm->shadow_space + fm->saved_reg_size; return base + slot_idx; // 返回正数,表示从 RBP 向下的字节数 } int frame_shadow_space(frame_manager_t *fm) { return fm->shadow_space; } int frame_saved_reg_size(frame_manager_t *fm) { return fm->saved_reg_size; }