assembly 如何在mips中创建动态数组

dw1jzc5e  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(135)

所以我写了下面的代码来创建数组,我想创建一个动态数组,并把第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
svdrlsy4

svdrlsy41#

若要建立动态数组,您需要下列几项:

  • 大小(元素数,然后转换为字节数)
  • 位置(全局、堆、堆栈)

以及一个方法,用于为动态数组获取指向内存起始位置的指针/引用
位置可以是:

  • 在较大的未使用内存块中

例如,在.data部分中放置一个标签作为最后一项,并使用该标签获取超出全局数据末尾的内存地址;(如果您没有同时执行堆分配,则可以使用此内存)。

  • 已分配堆

要从堆中分配内存,请使用syscall #9 -它会返回指向已分配块开头的指针。(MARS和QtSpim不支持释放内存,但可以在提供的syscall之上编写更复杂的malloc/free。)

  • 已分配堆栈

要从堆栈中分配内存,请递减堆栈指针--堆栈指针的新值是新块的起始地址。如果您希望内存在某个函数返回后仍然存在,则堆栈内存并不合适--当函数返回时,它应该这样做,使堆栈保持入口时的状态。
每种方法都能为动态数组提供内存块的地址。如果你需要多个动态数组,所有这些方法都可以。不过,对于第一种方法,你必须跟踪空闲内存的位置(动态地),而对于其他方法,它们可以帮助你自己完成这一任务。

相关问题