繁体   English   中英

将结构从 c 转换为 mips

[英]Translate struct from c to mips

如何将此 C 代码转换为 Mips? 我有一个 List 的结构,List 由一个数组组成,数组中的每个索引都包含一个字符和一个 integer,如何翻译 Mips in.data 中的列表以及如何访问条目类型数组的优先级和数据主要吗?

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

typedef struct{
   int priority;
   char data;
}entry;

typedef struct{
  entry arr[MAX];
  int Size;
}List;

int main()
{
   List l1;
   entry array[5];
   int priority=array[0].priority;
   char ch=array[0].data;
}

通过为每个字段指定偏移量和大小以及 alignment,为entry指定大小和 alignment。 我将在开头添加一个额外的char字段,以便您更好地了解这是如何完成的。

场地 类型 尺寸 对齐 软垫 开始 最后的 下一个 评论
extra char 1 1 0 0 0 1 第一个字段
priority int 4 4 3 4 7 8 第二个字段:为int填充 3 以便起始偏移量向上舍入为align =4 的倍数(从下一个=1 到前一个字段的左侧)
data char 1 1 0 8 8 9 第三场
最终填充 0 4 3 9 11 12 对齐=前面的最大值
总计 entry 12 4 0 0 11 12 整个结构的总结

每个字段都有一个类型,该类型有一个大小和 alignment 要求。 对于基本类型,alignment 要求通常与字段的大小相同,对于结构,alignment 是其所有字段的最大值。

第一个字段的偏移量为 0,不需要填充。

对于第一个字段之后的每个字段,在字段的起始偏移量之前放置足够的填充,以便其起始偏移量与其数据类型正确对齐。

还有最终填充,我们可以(或不)将其视为除了填充之外的零长度的隐藏最后一个字段。 最后一个字段和整个结构的 alignment 要求是所有其他字段的 alignment 要求的最大值。

现在我们知道entry的大小,所以我们可以为下一个结构添加到表中(或做一个单独的表)。 由于第一个字段是一个 20 的数组,我们将其大小乘以 20。

场地 类型 尺寸 对齐 软垫 开始 最后的 下一个 评论
arr entry 240=12*20 4 0 0 239 240 第一个字段
size int 4 4 0 240 243 244 第二场
最终填充 0 4 0 不需要
总计 List 244 4 0 0 243 244 整个结构的总结

好的,现在我们知道List的大小为 244,alignment 要求为 4。

如果您将List l1作为全局变量(推荐),那么:

    .data
    ...
    .align 2  # asking for 2^2=4 byte alignment
l1: .space 244
    ...

    .text
    ...
    la $a0, l1         # $a0 = & l1;
    lw $t0, 36($a0)    # $t0 = l1.arr[3].priority
    ...

您的 C 代码将List l1作为局部变量(而不是作为.data部分中的全局变量)。 局部变量的 size 和 alignment 的计算是相同的,但是这个变量将存在于堆栈中,这意味着您必须为其分配堆栈空间并计算其相对于堆栈指针的初始偏移量。

    .text
    ...
main:
    addiu $sp, $sp, -244 # allocate space for List l1 as local variable
    ...
    addiu $a0, $sp, 0    # $a0 = & l1; List l1 is lives at sp+0 .. sp+243
    lw $t0, 36($a0)      # $t0 = l1.arr[3].priority
    ...
    addiu $sp, $sp, 244  # release stack space
    ...

堆栈指针可以假定为至少 4 字节 alignment,在某些系统上可能为 8 字节(例如 64 位)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM