簡體   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