2013-09-30 36 views
0

我正在將以下C++代碼翻譯成MIPS(這只是我卡住的程序的一小部分),並且我理解如何設置$t寄存器以獲取給定的數組值的要點,但我完全停留在MIPS中的整數數組:將array [index]設置爲迭代值i?

pos[count] = i; 

我試過swlw,但每次我嘗試這些,我得到的地址超出範圍例外的/ etc。

有人可以向我解釋這裏出了什麼問題嗎?當循環達到pos[count] = i時,我需要將pos[count]0xffffffff更改爲(i)用於每個循環迭代。錯誤是因爲我需要調整-1的pos[]

我完全失去了,一直沒能找到足夠類似於這個問題的解釋。

(道歉的格式,因爲MIPS擁有如此多的標籤行,張貼在這裏的格式是非常古怪的)

.data 
x: .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
    .word 0 
pos: .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
     .word -1 
d:  .word 73 
     .word 47 
     .word 23 
     .word 26 
     .word 67 
     .word 99 
     .word 13 
     .word 53 
     .word 1 
     .word 97 

sp: .asciiz " " 
endl: .asciiz "\n" 

# $s0 count 
# $s1 key 
# $s2 i 

     .text 

main: addi $s0, $0, 0 # int count = 0; 
     addi $s1, $0, 24   # int key = 24; 
     addi $s2, $0, 0 
     la $s3, d 
     la $s4, pos 
     la $s5, x 
         # for (int i=0; i<10; i++) { 
loop: mul  $t0, $s2, 4 # if (d[i] >= key) { 
     add  $t0, $t0, $s3 
     lw $t0, ($t0) 

      blt  $t0, $s1, loop1 

      sll  $t1, $s0, 2  # $t1 = count * sizeof(int) 
      addu $t2, $s4, $t1 # $t2 = &pos[count]; 
      lw  $t2, ($t2) # $t2 = pos[count]; 

      add  $t3, $s5, $t1 # $t3 = &x[count]; 
      lw  $t3, ($t3) # $t3 = x[count]; 


      sw $s2, ($t2)   #  pos[count] = i; 
        #  x[count] = d[i]; 

loop1:  addi $s2, $s2, 1  # i++; 
      addi $s0, $s0, 1  # count++; 
        # } 
        # } 

這裏的C++代碼相當於:

#include <iostream> 
using namespace std; 

int x[10] = {0}; 
int pos[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; 
int d[10] = {73, 47, 23, 26, 67, 99, 13, 53, 1, 97}; 
int main() { 

int count = 0; 
int key = 24; 
for (int i=0; i<10; i++) { 
    if (d[i] >= key) { 
    pos[count] = i; 
    x[count] = d[i]; 
     count++; 
    } 
} 

for (int i=0; i<10; i++) { 
    if (pos[i] < 0) 
     break; 
    cout << pos[i] << " " << x[i] << endl; 
    } 

} 
+0

我無法制作此正面或反面。如果你展示了你想要複製的C++代碼,那麼這將會很有幫助,然後我們就會知道這個應該做什麼。 –

+0

Gotcha。我只是在帖子底部添加了C++等價物。 我的主要問題是翻譯pos [count] = i;和x [count] = d [i]; MIPS – blunatic

回答

2

這部分是錯誤的:

lw  $t2, ($t2) # $t2 = pos[count]; 
add  $t3, $s5, $t1 # $t3 = &x[count]; 
lw  $t3, ($t3) # $t3 = x[count]; 
sw $s2, ($t2) #  pos[count] = i; 

爲什麼要在寫入兩者時加載pos[count]x[count]?這不僅是不必要的,它會破壞$t2$t3,所以當你真的想寫的時候,它們將不再有效。

另外,循環結束是錯誤的,count++應該在條件內。爲此,您需要交換最後兩行(包括標籤)。

稍微清理版本可能看起來像:

.data 
x:  .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
pos: .word -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 
d:  .word 73, 47, 23, 26, 67, 99, 13, 53, 1, 97 

# $s0 count 
# $s1 key 
# $s2 i 

     .text 
.globl main 
main: addi $s0, $0, 0  # int count = 0; 
     addi $s1, $0, 24  # int key = 24; 
     addi $s2, $0, 0  # int i = 0; 
# for (int i=0; i<10; i++) { 
loop: sll  $t0, $s2, 2  # $t0 = i * sizeof(int) 
     lw  $t0, d($t0)  # $t0 = d[i] 
     blt  $t0, $s1, loop1 # if (d[i] < key) 

     sll  $t1, $s0, 2  # $t1 = count * sizeof(int) 
     sw  $s2, pos($t1) # pos[count] = i 
     sw  $t0, x($t1)  # x[count] = d[i] 
     addi $s0, $s0, 1  # count++; 

loop1: addi $s2, $s2, 1  # i++; 
     blt $s2, 10, loop 
+0

非常感謝,你不知道我有多感激。現在已經連續兩天修補這個問題。負載部分我是在問題設置中給出的,所以我認爲我僅僅使用該類型的加載地址卡住了:因此,例如,我不知道您可以執行d($ t0)。 – blunatic

+0

在清理靜脈時,我可以建議 'x:.word 0:10 y:.word -1:10' –

0

int count(int a[], int n, int x){ int res = 0; int i = 0; for(i = 0; i != n; i++) if(a[i] == x) res = res + 1; return res; }

寫MIPS彙編程序,這將使使用功能的數上面如下: 硬編碼以下10值列入陣列a: 128,10,23,12,128,9,220,46,128,5 硬編碼n = 10 提示用戶輸入如下值:「請輸入一個整數值「 閱讀整數值並存儲它(讓我們稱它爲x) 使用以下參數調用函數計數:count(a,10,x) 輸出結果如下:「x出現在列表中的次數是res次「 退出程序