我正在为一次考试学习Mips32,最近我在探索如何在mips中翻译c结构。总的来说,我对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中表示结构的适当方式,让我知道是否有更好的解决方案。
发布于 2020-02-07 15:46:54
但是我有一个问题,我如何跟踪所有的学生?也许是用画框指针?
你不需要一个框架指针来跟踪所有的学生。而且,跟踪他们的问题并不是他们的结构所独有的--你会遇到同样的问题来跟踪许多整数。而且,跟踪许多项目的问题也不仅仅是装配的问题。
您需要的要么是为每个项单独设置一个变量(通常不切实际,尤其是如果项目数是可变的),要么是数据结构:某种类型的集合,例如数组或链接列表。
C中有一个独立的局部变量,每个变量都需要不同的名称,而在程序集中,每个变量在堆栈帧中都有不同的偏移量/位置。所有变量的堆栈空间都将在一条指令中分配,它们都通过堆栈指针中各自的偏移量引用。
如果您愿意,可以使用框架指针,但是由于使用MIPS,函数的堆栈帧的堆栈空间都在功能序言中的一条指令中分配,所以堆栈指针在函数的主体过程中不会移动--这意味着各个变量保持在堆栈指针的常量偏移位置。
如果下列任何一种方式之一,帧指针可能会有所帮助:
alloca。一般来说,前两个不适用于MIPS,因此函数通常不需要框架指针。
或者,您也可以使用类似数组的数据结构来跟踪许多项。该数组本身需要由一个变量(在C中,名称和集合中的偏移量)引用--但不管要跟踪的项目有多少,至少只有一个变量。然后,您就需要索引来访问各个元素。(索引需要计算元素的地址,并取决于元素的大小,但对于int数组和struct数组的操作则是相同的。)
发布于 2020-02-07 11:49:32
您的数据可以是本地的、静态的或动态分配的。没有一条规则。请参阅:https://godbolt.org/z/gfDVD8
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
typedef struct
{
int x;
int y[4];
char name[23];
}MYSTRUCT_t;
MYSTRUCT_t my_global_struct[10];
void my_global_struct_foo(void)
{
for(size_t pos = 0; pos < 10; pos++)
{
my_global_struct[pos].x = rand();
my_global_struct[pos].y[0] = my_global_struct[pos].x / 2;
my_global_struct[pos].name[4] = my_global_struct[pos].y[0];
}
}
void my_static_struct_foo(void)
{
static MYSTRUCT_t my_static_struct[10];
for(size_t pos = 0; pos < 10; pos++)
{
my_static_struct[pos].x = rand();
my_static_struct[pos].y[0] = my_static_struct[pos].x / 2;
my_static_struct[pos].name[4] = my_static_struct[pos].y[0];
}
}
void my_local_struct_foo(void)
{
volatile MYSTRUCT_t my_local_struct[10];
for(size_t pos = 0; pos < 10; pos++)
{
my_local_struct[pos].x = rand();
my_local_struct[pos].y[0] = rand();
my_local_struct[pos].name[4] = rand();
}
}发布于 2020-02-07 18:11:48
这里的一个好主意是使用.space分配一些空间,然后通过.align n指令对齐它(小心MIPS需要字对齐),然后在"main:“中加载这个内存区域的地址。
假设您希望为10名学生分配空间:
std_struct: .align 2
.space 40 # 10students, 1 word=4 bytes each
.text
main:
la $s0, std_struct #now everything should be parsable via $s0 registerhttps://stackoverflow.com/questions/60112137
复制相似问题