首页 > 解决方案 > 在 mips32 中表示一个结构

问题描述

我正在为考试学习 Mips32,最近我在徘徊如何在 mips 中翻译 ac struct。一般来说,我对 mips 和汇编代码还很陌生,但我试图收集我所有的知识来制定解决方案。

假设我有一个简单的 C 结构:

struct Student
{
    int id;
};

int main()
{
    struct Student student;
    student={111111};
    return 0;
}

我的想法是将所有数据存储在堆栈中,如下所示:

sub $sp,$sp,4
li  $t1,111111
sw  $t1,($sp)

如果我有多个学生,我只需创建一个将参数存储在堆栈中的例程。但是我有一个问题,我怎样才能跟踪所有学生?也许有一个帧指针?

我不知道这是否是在 mips 中表示结构的适当方式,如果有更好的解决方案,请告诉我。

标签: cassemblystructmips32

解决方案


但是我有一个问题,我怎样才能跟踪所有学生?也许有一个帧指针?

您不需要帧指针来跟踪所有学生。此外,跟踪它们的问题并不是它们作为结构体所独有的——你在跟踪许多整数时也会遇到同样的问题。此外,跟踪许多项目的问题也不是组装所独有的。

您需要的是每个项目的单独变量(通常不切实际,特别是如果项目的数量是可变的),或者是数据结构:某种集合,例如数组或链表。


在 C 中使用单独的局部变量,每个变量都需要不同的名称,并且在汇编中,每个变量在堆栈帧中都有不同的偏移量/位置。所有的堆栈空间都将在一条指令中分配,并且它们都通过它们与堆栈指针的单独偏移量来引用。

如果您愿意,可以使用帧指针,但由于使用 MIPS,函数堆栈帧的堆栈空间都在函数序言中的一条指令中分配,因此堆栈指针在函数体期间不会移动 - 这意味着单个变量与堆栈指针保持恒定的偏移量。


在以下情况下,帧指针可能会有所帮助:

  • 机器不能很好地进行堆栈相对偏移,但可以轻松地进行帧指针相对偏移,或者,
  • 机器需要频繁的推送和弹出来移动堆栈指针,这会改变访问堆栈帧中相同位置所需的偏移量——无论推送和弹出如何,帧指针都保持不变。(如果 CPU 寄存器不足,例如在表达式求值期间,推送和弹出可用于参数传递和/或临时存储。)
  • 函数动态分配堆栈空间,例如通过 C's alloca

从广义上讲,前两个不适用于 MIPS,因此函数一般不需要帧指针。


或者,您可以使用像数组这样的数据结构来跟踪许多项目。数组本身需要由一个变量引用(在 C 中是一个名称,在汇编中是一个偏移量)——但无论要跟踪多少项,至少只有一个变量。然后您可以通过索引来访问各个元素。(索引涉及计算元素的地址,并且取决于元素的大小,但对于 int 数组与 struct 数组的操作相同。)


推荐阅读