这是我第二次处理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 :(得分:2)
当你看到的语法是lw $t4, 0($t3)
时,听起来你正试图弄清楚如何访问数组的第i个元素。我想你已经知道你可以用lw $t4, 4($t3)
获得下一个单词,但你仍然坚持如何使该索引动态化。
诀窍是你不要改变立即值(0,4,8等)。相反,您可以更改寄存器的内容,在上面的示例中,它指向数组中的第一个单词。
这是我为CompArch类中的赋值编写的代码,用于实现一个简单的do-while循环,将数组成员初始化为零。我们被告知$ s0已经加载了数组中第一个字的地址。
我得到了我想要的元素的偏移量,乘以4(左移两次),然后将该偏移量添加到$ s0(第一个单词)。现在,$ t1指向我想要设置的int。我所要做的就是将值($ 0)存储在$ 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)
希望这对基本概念有所帮助!