因此,舉例來說,會是什麼這樣的事情:lw如何用C或C++表示?
LW $ T1,0($ T0)
或
LW $ T2,8($ T0)
轉換爲C或C++?我的意思是我從地址加載一個單詞到一個寄存器中,我明白了。是一個類似的概念,或者,是什麼?
在此先感謝。
因此,舉例來說,會是什麼這樣的事情:lw如何用C或C++表示?
LW $ T1,0($ T0)
或
LW $ T2,8($ T0)
轉換爲C或C++?我的意思是我從地址加載一個單詞到一個寄存器中,我明白了。是一個類似的概念,或者,是什麼?
在此先感謝。
這是「加載字」指令。它將地址存儲在寄存器$ t0中的位置的內存中的4字節字加載到寄存器$ t1中。
c/C++中沒有等效的構造。該指令是很受歡迎,在需要的內存訪問最多的建築中,例如:
int *p;
// p = ...
*p += 10;
可以轉化爲類似(定的$ T0包含指針「P」)
lw $t1, 0($t0)
addi $t1, $t1, 10
sw $t1, 0($t0)
這裏所述第一指令加載變量到寄存器中,第二修改它與第三並將其寫回到存儲器
對於第一行:
int t1, *t0; ... t1 = *t0
或t1 = 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];
如果我們看到地址如何進入寄存器,它可能會在原始代碼上顯示更多的信息。
我認爲你不能寫出完全相似的代碼。你可以做到以下幾點:
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
。你可以做的是給一個提示,編譯器將word
在register
:
// it is just a hint. The compiler is free to put it in memory.
register int word = *wordAddress;
假設你正在使用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);