[英]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.