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