2013-10-12 55 views
0

我是MIPS的新手,對如何寫mips可能會遇到某些問題感到困惑,因爲我被要求在0xABCDABC0的內存位置寫入mips代碼以脈衝位6,共計2次* n + 74次,假設n在$ s1中。MIPS調整位和循環?

我不確定如何處理訪問給定地址的特定位,我知道我必須使用或立即專門打開1位,然後它打開位回到0使用1.循環(沒有乘法)我可以添加$ s2,$ s1,$ s1 然後addi $ s2,$ s2,74但是你如何循環它?

+0

脈衝在翻轉?您可以在您感興趣的位的位置(AND ... 11011111 - 將其關閉)與'AND'位掩碼之間進行切換,並在感興趣的位置用'1'或'OR'位掩碼(... 00100000 - 打開它)。 –

回答

2

這裏最簡單的部分是編寫循環,我可以幫助你。我很生鏽,但我會盡我所能讓你開始。

循環可以通過臨時值,添加即時值,分支指令和/或跳轉指令來實現。

你要找聽起來像基本流程:

  1. 創建一個計數變量(在I部分(INT I = ..;我< ...;我++),作爲一個例子)
  2. 標籤的循環的開頭指令(將類似於下面) LABEL_NAME: 循環指令
  3. 從步驟1
  4. 執行環路指令
  5. 增量的循環變量
  6. 用2 * n + 74填充$ s2(這是您現在擁有的零件)
  7. 如果您的計數器不等於您所需的迭代計數,則分支到循環的開始處 注意:如果您有足夠的循環指令,你可能不得不使用更復雜的分支/跳轉構造。

例循環代碼:

andi $t1, $t1, 0 # set a counter variable to 0 (t1) 
loop: 
    # do some work - whatever you want to accomplish by looping 
    addi $t1, $t1, 1 # increment the counter 
    add $s2, $s1, $s1 # this is the code you devised 
    addi $s2, $s2, 74 
    bne $s2, $t1, loop #branch to the beginning of the loop if you need more iterations 

你需要在內存地址被抓的值接下來的部分,也有一些方式去說。您應該查看MIPS中的加載/存儲說明。特別是,我想你會想要使用lw(加載詞)指令。

LW R1,標籤 - >加載從存儲在存儲尋址在「標籤」到寄存器r1

記憶單詞我用Google搜索了一點,http://pages.cs.wisc.edu/~cs354-2/cs354/karen.notes/MAL.instructions.html有一些合理的解釋,並和這些指令的示例。

訪問特定位需要利用一些位操作。特別是,我認爲你會發現位移和遮掩有幫助。
MIPS提供了一些說明你可能會喜歡:

SLL d,S1,S2 d = S2所地方

SRA d,S1,S2 d =算術右移s1的轉變S1的邏輯左移通過S2的地方

SRL d,S1,S2所地方

和d,S1,S2 d s1的S2 d =邏輯右移= S1 & S2;按位與

- 從源頭上我引用上述

我希望這是足以回答你的問題,並至少讓你去的問題。我不想只是把你的代碼給你,因爲它聽起來像功課。如果有什麼不清楚或需要澄清,請說清楚。

希望至少有一些可以幫助你!

+0

非常感謝Dylan S!我真的很感激你幫助給我很好的洞察力,更好地理解mips編碼 – SxMZ

+0

太棒了!我很高興能夠提供幫助。 – dylansturg