Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在MIPS中遍历数组?_Assembly_Mips - Fatal编程技术网

Assembly 如何在MIPS中遍历数组?

Assembly 如何在MIPS中遍历数组?,assembly,mips,Assembly,Mips,这只是我第二次处理MIPS组件(即,或任何类型的组件),因此请保持温和。所以我从头开始为MIPS做了一个乘法函数。这比我想象的要容易——我测试了它,它对一个值非常有效。不幸的是,当数组出现在图片中时,我完全不知所措 我甚至不知道如何开始。我觉得自己很迟钝,因为我不能问一个具体的问题,因为我不理解这个大主意。我分配了空间,为数组设置了常量值,但不知道如何: A.)将常量值(例如5,2,3,10,7)加载到阵列中 把我的外环打开 下面是我的代码,我需要的是一种让我的外循环运行的方法。有什么想法吗 /

这只是我第二次处理MIPS组件(即,或任何类型的组件),因此请保持温和。所以我从头开始为MIPS做了一个乘法函数。这比我想象的要容易——我测试了它,它对一个值非常有效。不幸的是,当数组出现在图片中时,我完全不知所措

我甚至不知道如何开始。我觉得自己很迟钝,因为我不能问一个具体的问题,因为我不理解这个大主意。我分配了空间,为数组设置了常量值,但不知道如何:

A.)将常量值(例如5,2,3,10,7)加载到阵列中

把我的外环打开

下面是我的代码,我需要的是一种让我的外循环运行的方法。有什么想法吗

/*
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
/*
姓名:MrPickl3
日期:2013年10月10日
用途:程序从头开始创建乘法函数。使用两个数组
测试程序。
*/
#包括
. 数据
X:.空格80
Y:.空格80
N:空格4
MAC_附件字0x00000000
.文本
格洛博梅因酒店
主要内容:
li t0,0x00000000//i=0
li t1,0x00000005//数组的偏移量
li t2,MAC_ACC//MAC_ACC(即产品注册)
lw t9,0(t2)//表示MAC_ACC的数据
la t3,X//X的地址[0]
lw t4,0(t3)//X的数据
la t5,Y//Y的地址[0]
lw t6,0(t5)//Y的数据
循环:
addiu t0,t0,4//i++
//t4=x[i]
//t6=y[i]
//t7=计数器
mult:
beq t6,0,循环//检查y=0。如果是,请转到循环。
andi t7,t6,1/*我们想知道二的最近幂。
我们可以把最后一点掩盖起来
测试是否有二的幂
左边是乘数*/
beq t7,0,移位//如果最后一位为零,则移位
添加t9、t9、t4//将被乘数添加到乘积
班次:
sll t3,t3,1//x[i]乘以2
srl t4,t4,1//y[i]乘以2
lab2_完成:
j lab2_完成
不
.尾干管
X_输入:。字5,2,3,10,7
Y_输入:。字6,0,8,1,2
N_输入:。字5

听起来您好像在试图找出如何访问数组的第i个元素,而您看到的语法是
lw$t4,0($t3)
。我想你已经知道,你可以用
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 
.text
partC:#实现do while循环(0-100)
加上$t0、$0、$0#i=0
Cstart:#获取当前整数的偏移量
sll$t1、$t0、2*4
加上$t1、$s0、$0
sw$0,($t1)
加上$t0,$t0,1#i++
blt$t0,100,Cstart#i<100
Cdone:添加$v0,$0,10#终止程序
系统调用
注意,语法
sw$zero,($t1)
只是
sw$zero,0($t1)


希望这对基本概念有所帮助

“加载到阵列”是什么意思?值5,2,3,10,7已经在
X_INPUT
数组中,因为您在声明数组时将它们放在了那里。你的意思是“从数组加载”吗?你不需要移位和加法就可以在循环内重新建立索引,只需增加一个指针(和
bne
相对于循环外计算的结束指针)。此外,您每次都在执行
t1=s0+0
,覆盖
i