2009-10-22 32 views
1

因此,舉例來說,會是什麼這樣的事情:lw如何用C或C++表示?

LW $ T1,0($ T0)

LW $ T2,8($ T0)

轉換爲C或C++?我的意思是我從地址加載一個單詞到一個寄存器中,我明白了。是一個類似的概念,或者,是什麼?

在此先感謝。

回答

2

這是「加載字」指令。它將地址存儲在寄存器$ t0中的位置的內存中的4字節字加載到寄存器$ t1中。

c/C++中沒有等效的構造。該指令是很受歡迎,在需要的內存訪問最多的建築中,例如:

int *p; 
// p = ... 
*p += 10; 

可以轉化爲類似(定的$ T0包含指針「P」)

lw $t1, 0($t0) 
addi $t1, $t1, 10 
sw $t1, 0($t0) 

這裏所述第一指令加載變量到寄存器中,第二修改它與第三並將其寫回到存儲器

0

對於第一行:

int t1, *t0; ... t1 = *t0t1 = t0[0]或甚至int t0, t1; ... t1 = t0

對於第二個:

int t2 = t0[2],也許,也許int t2 = t0.thirdThing

struct { 
    int a,b,thirdThing; 
} t0; 

但是你無法確定。它可能是char *x, **y; x = y[2];如果我們看到地址如何進入寄存器,它可能會在原始代碼上顯示更多的信息。

0

我認爲你不能寫出完全相似的代碼。你可以做到以下幾點:

int* wordAddress = ... + 8; // 8 or any offest 
// assuming int is a word on MIPS wich I never worked with personally 
int word = *wordAddress; 

檢索值時,還您可以應用偏移:

int* wordAddress = ... + 0; 
int word = *(wordAddress + 8); 

有一張紙條:你不能指定的語言要求register。你可以做的是給一個提示,編譯器將wordregister

// it is just a hint. The compiler is free to put it in memory. 
register int word = *wordAddress; 
0

假設你正在使用MIPS32(因此有32位內存尋址),那麼它很容易他們做什麼。

lw $t1, 0($t0) 

這是做什麼加載在內存地址t0字節偏移量0的值到t1寄存器。

lw $t2, 8($t0) 

這是幹什麼加載字節偏移8從內存地址t0到t2寄存器的值。

讓我們假設你有一個內存地址0x12345678。然後,MIPS組件基本上執行以下操作:

int t0 = 0x12345678; 
// ... 
int t1 = *(int*)(t0 + 0); 
int t2 = *(int*)(t0 + 8);