所以我写了下面的代码来创建数组,我想创建一个动态数组,并把第3行元素放在其中,任何人都可以帮助
这就是整个问题:我只在6号房间有问题
使用MARS软件开发一个文档完备的MIPS装配程序,该程序:
1.在数据段中定义由6x 8元素组成的名为mymat的静态矩阵,并使用任何浮点值对其进行初始化;
1.输出数组mymat的元素每行8个值,用两个冒号分隔::;
1.提示用户从KBD 2中输入0到7范围内的整数col 1和col 2,表示矩阵mymat中的列号,验证输入的值,如果输入了错误的值,则打印正确的错误消息并提示用户再次输入。
1.交换由col 1和col 2的值指定的列的元素。
1.打印数组mymat的元素,每行8个值,用两个冒号$$分隔;
1.创建一个名为new的动态数组,并用mymat第3行中的元素填充它。
1.会在新行的开头打印数组new的元素,并以一颗星星 * 分隔。
.data
#array defined
mymat: .float 1.1,2,3,4,5,6,7,8
.float 9,10,11,12,13,14,15,16
.float 17,18,19,20,21,22,23,24
.float 25,26,27,28,29,30,31,32
.float 33,34,35,36,37,38,39,40
.float 41,42,43,44,45,46,47,48
LineOfColons:.asciiz "::::::::::::::::::"
LineOfDollars:.asciiz "$$$$$$$$$$$$$$$$$$"
newline:.asciiz "\n"
newline_space: .asciiz "\n "
newline_tab: .asciiz "\n \t"
newline_hastag: .asciiz "\n#"
comma: .asciiz "::"
.text
.globl main
main:
#$t0 like i
li $t0, 1
#$t1 =index of array
li $t1,0
#how many element has printed
li $t2,1
li $t4,8
addi $s0,$zero,9
sw $s0,mymat($t1)
#######################
while:
#while loop (if $t0>48) go to exit
bgt $t0,48,next
#to load the element at array mymat in position $t1
la $a0,mymat($t1)
#print the element
li $v0, 2
l.s $f12,($a0)
syscall
###
div $t2,$t4
mfhi $t3
#print ,
la $a0,comma
li $v0,4
syscall
#index=indrx+4 to move to next 4 byte
add $t1,$t1,4
#i++ loop
add $t0,$t0,1
##how many element has printed +1
add $t2,$t2,1
#while loop to print a line if $t2%8 true print line
beq $t3,0,PrintNewline
j while
PrintNewline:
la $a0,newline
li $v0,4
syscall
j while
#########################
next:
######## execute the code ############
li $v0,10
syscall
1条答案
按热度按时间svdrlsy41#
若要建立动态数组,您需要下列几项:
以及一个方法,用于为动态数组获取指向内存起始位置的指针/引用
位置可以是:
例如,在
.data
部分中放置一个标签作为最后一项,并使用该标签获取超出全局数据末尾的内存地址;(如果您没有同时执行堆分配,则可以使用此内存)。要从堆中分配内存,请使用syscall #9 -它会返回指向已分配块开头的指针。(MARS和QtSpim不支持释放内存,但可以在提供的syscall之上编写更复杂的malloc/free。)
要从堆栈中分配内存,请递减堆栈指针--堆栈指针的新值是新块的起始地址。如果您希望内存在某个函数返回后仍然存在,则堆栈内存并不合适--当函数返回时,它应该这样做,使堆栈保持入口时的状态。
每种方法都能为动态数组提供内存块的地址。如果你需要多个动态数组,所有这些方法都可以。不过,对于第一种方法,你必须跟踪空闲内存的位置(动态地),而对于其他方法,它们可以帮助你自己完成这一任务。