首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示mips32中的结构

表示mips32中的结构
EN

Stack Overflow用户
提问于 2020-02-07 11:02:20
回答 3查看 1.2K关注 0票数 0

我正在为一次考试学习Mips32,最近我在探索如何在mips中翻译c结构。总的来说,我对mips和汇编代码相当陌生,但是我已经尝试收集我所有的知识,想出一个解决方案。

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

代码语言:javascript
复制
struct Student
{
    int id;
};

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

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

代码语言:javascript
复制
sub $sp,$sp,4
li  $t1,111111
sw  $t1,($sp)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-07 15:46:54

但是我有一个问题,我如何跟踪所有的学生?也许是用画框指针?

你不需要一个框架指针来跟踪所有的学生。而且,跟踪他们的问题并不是他们的结构所独有的--你会遇到同样的问题来跟踪许多整数。而且,跟踪许多项目的问题也不仅仅是装配的问题。

您需要的要么是为每个项单独设置一个变量(通常不切实际,尤其是如果项目数是可变的),要么是数据结构:某种类型的集合,例如数组或链接列表。

C中有一个独立的局部变量,每个变量都需要不同的名称,而在程序集中,每个变量在堆栈帧中都有不同的偏移量/位置。所有变量的堆栈空间都将在一条指令中分配,它们都通过堆栈指针中各自的偏移量引用。

如果您愿意,可以使用框架指针,但是由于使用MIPS,函数的堆栈帧的堆栈空间都在功能序言中的一条指令中分配,所以堆栈指针在函数的主体过程中不会移动--这意味着各个变量保持在堆栈指针的常量偏移位置。

如果下列任何一种方式之一,帧指针可能会有所帮助:

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

一般来说,前两个不适用于MIPS,因此函数通常不需要框架指针。

或者,您也可以使用类似数组的数据结构来跟踪许多项。该数组本身需要由一个变量(在C中,名称和集合中的偏移量)引用--但不管要跟踪的项目有多少,至少只有一个变量。然后,您就需要索引来访问各个元素。(索引需要计算元素的地址,并取决于元素的大小,但对于int数组和struct数组的操作则是相同的。)

票数 2
EN

Stack Overflow用户

发布于 2020-02-07 11:49:32

您的数据可以是本地的、静态的或动态分配的。没有一条规则。请参阅:https://godbolt.org/z/gfDVD8

代码语言:javascript
复制
#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();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-02-07 18:11:48

这里的一个好主意是使用.space分配一些空间,然后通过.align n指令对齐它(小心MIPS需要字对齐),然后在"main:“中加载这个内存区域的地址。

假设您希望为10名学生分配空间:

代码语言:javascript
复制
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 register
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60112137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档