2013-10-10 3 views
2

Это только мой второй раз, когда речь идет о сборке MIPS (например, какой-либо сборки), поэтому, пожалуйста, будьте осторожны. Поэтому я сделал многократную функцию для MIPS с нуля. Это было проще, чем я думал - я тестировал его, и он отлично работает для одной ценности. К сожалению, я ПОЛНОСТЬЮ потерял, когда в картину попали массивы.Как перемещаться по массиву в MIPS?

Я даже не знаю, с чего начать. Я чувствую отсталость, потому что я не могу задать конкретный вопрос, потому что я не понимаю большой идеи. Я выделил пространство, имел постоянные значения для массивов, но на самом деле не знаю, как:

A.) Загрузите постоянные значения (например, 5,2,3,10,7) в массивы.

B.) Получите мой внешний цикл.

Мой код ниже и все, что мне нужно, это способ получить мой внешний цикл. Есть идеи??

/* 
Name: MrPickl3 
Date: October 10, 2013 
Purpose: Program creates a multiply function from scratch. Uses two arrays to 
     test the program. 
*/ 

#include <xc.h> 

. data 

X: .space 80 
Y: .space 80 
N: .space 4 
MAC_ACC .word 0x00000000 

    .text 
    .globl main 

main: 
    li t0, 0x00000000 //i = 0 
    li t1, 0x00000005 //Offset of array 
    li t2, MAC_ACC //Mac_acc (i.e. product register) 
    lw t9, 0(t2) //Refers to MAC_ACC's data 
    la t3, X //Address of X[0] 
    lw t4, 0(t3) //Data of X 
    la t5, Y //Address of Y[0] 
    lw t6, 0(t5) //Data of Y 

loop: 
    addiu t0, t0, 4 //i++ 

//t4 = x[i] 
//t6 = y[i] 
//t7 = counter 

mult: 
    beq t6, 0, loop //Check if y = 0. Go to loop, if so. 
    andi t7, t6, 1 /*We want to know the nearest power of two. 
         We can mask the last bit to 
         test whether or not there is a power of two 
         left in the multiplier.*/ 
    beq t7, 0, shift //If last bit is zero, shift 
    addu t9, t9, t4 //Add multiplicand to product 

shift: 
    sll t3, t3, 1 //Multiply x[i] by 2 
    srl t4, t4, 1 //Multiply y[i] by 2 

lab2_done: 
    j lab2_done 
    nop 

.end main 

X_INPUT: .word 5,2,3,10,7 
Y_INPUT: .word 6,0,8,1,2 
N_INPUT: .word 5 
+0

Что вы подразумеваете под «загрузкой в ​​массивы»? Значения 5,2,3,10,7 уже находятся в массиве 'X_INPUT', потому что вы помещаете их там при объявлении массива. Возможно, вы имели в виду "loading _from_ the arrays"? – Michael

ответ

2

Это звучит, как вы пытаетесь выяснить, как получить доступ к i-й элемент массива, когда синтаксис вы видите это lw $t4, 0($t3). Я думаю, вы уже знаете, что вы можете получить следующее слово с lw $t4, 4($t3), но вы застряли в том, как сделать этот индекс динамическим.

Фокус в том, что вы не меняете непосредственное значение (0, 4, 8 и т. Д.). Вместо этого вы меняете содержимое регистра, которое в приведенных выше примерах указывает на первое слово в массиве.

Вот код, который я написал для задания в классе CompArch, для реализации простого цикла do-while, который инициализирует элементы массива до нуля. Нам говорят, что $ s0 загружен адресом первого слова в массиве.

Я получаю смещение к элементу, который я хочу, умножьте на 4 (сдвиг влево дважды), а затем добавьте это смещение в $ s0 (первое слово). Теперь $ t1 указывает на int, который я хочу установить. Все, что мне нужно сделать, это сохранить значение ($ zero) в адресе, на который указывает $ t1.

 .text 
partC: # Implement a do-while loop (0-100) 
     add $t0, $zero, $zero # i=0 
Cstart: # Get offset to current int 
     sll $t1, $t0, 2 # *4 
     add $t1, $s0, $zero 
     sw $zero, ($t1) 
     add $t0, $t0, 1 # i++ 
     blt $t0, 100, Cstart # i < 100 
Cdone: add $v0, $zero, 10 # terminate program 
     syscall 

Обратите внимание, что синтаксис sw $zero, ($t1) просто псевда-оп для sw $zero, 0($t1)

Надеется, что это помогает с основной концепцией!

Смежные вопросы