2012-02-02 101 views
2

我想一個C程序翻譯成MIPS彙編代碼的Mips:變量保存在另一個變量

在我的C代碼,我有這樣一行:

int base; 
int count; 

count = base; 

在MIPS,怎麼會我在計數中存儲基數的值?我看到的用於加載和存儲的唯一指令是lwsw,它們的原型僅來自寄存器源 - > RAM目標或RAM源 - >註冊目標。

任何幫助,將不勝感激。

編輯 我希望這可以在一個單一的指令來完成,像

move base acc

但顯然這是不可能的(至少我發現類似的無指令的例子),我選擇了這一點:

lw $t0, base //load base into $t0 
sw $t0, count //store the value of $t0 in count 

如果有一個行指令可以做到這一點會更好,如果有人知道的。

回答

8

MIPS不支持直接從內存到內存的移動。 (實際上最常見的CPU也不是 - 甚至x86也不是。)您需要使用lw/sw來移動數據。在架構上,這是因爲MIPS被設計爲每個週期只執行一次內存訪問 - 執行內存到內存移動需要兩次訪問(一次讀取,一次寫入),或者阻塞管道。

+0

「base」和「counter」的值不在寄存器中,它們存儲在RAM中。所以當我這樣做時,我只會收到一條錯誤消息。 – 2012-02-02 04:25:25

+0

哦,如果它們不是寄存器,那就不一樣了。更新。 – duskwuff 2012-02-02 04:33:12

+0

它可以很好,它可以優化這條指令,即使它是「lw/sw」等價的一行,我花了1個小時尋找指令。 – 2012-02-02 04:36:52

4

這裏是如何做到這一點的MIPS

la $t0, base  // load the address of "base" 
la $t1, count // load the address of "count" 
lw $t2, 0($t0) // load the data at location "base" 
sw $t2, 0($t1) // store that data at location "count" 

做存儲器移動存儲在一個單一的指令這是不可能的。

+0

實際上,你可以只用2條指令:'lw $ t0,base'然後'sw $ t0,count' – 2012-02-02 23:28:13

+0

'lw $ t0,base'就是'lui $ at,%hi(base)的MIPS彙編縮寫, '接着是'lw $ t0,%lo(base)(at)'。加載然後存儲序列總共仍然是4條機器指令。 – markgz 2012-02-02 23:37:27

+0

但只有兩條物理指令。 – 2012-02-03 00:01:57

相關問題