【问题标题】:Dynamic allocation for arrays in MIPSMIPS 中数组的动态分配
【发布时间】:2012-12-15 19:49:26
【问题描述】:

我们的团队正在尝试创建一个编译器,它输入代码并从中生成 MIPS 程序集。

为了在全局范围内处理数组声明,我们在 .text 中为数组创建一个标签,并保留 4 个字节来保存指向内存中数组开头的地址。

    .text
arr:    .space 4
    .data
...
li $t0, N         # (where N = number of elements in arr)
li $v0, 9         # Load system instruction to allocate dynamic memory
li $t1, 4         # 4 bytes per element
mult $t0, $t1     # Calculates how big the allocated memory has to be in bytes.
mflo $a0          # Loads this value into $a0
syscall           # Allocates memory and returns address into $v0
la $s0, arr       # load address of arr into $s0
sw $v0, ($s0)     # Save allocated memory address into the space reserved in .text

但是,最后一条指令似乎对我们不起作用。

This image 准确显示错误发生的位置以及当时寄存器的状态。我不确定它为什么会导致错误。

编辑:关于产生的错误的更多信息,更新以包含最后修改的指令

[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
[00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit) 
[00400024] 34080003  ori $8, $0, 3            ; 9: li $t0, 3 # Load immediate value into register $t0 
[00400028] 34020009  ori $2, $0, 9            ; 10: li $v0, 9 
[0040002c] 34090004  ori $9, $0, 4            ; 11: li $t1, 4 
[00400030] 01090018  mult $8, $9              ; 12: mult $t0, $t1 
[00400034] 00002012  mflo $4                  ; 13: mflo $a0 
[00400038] 0000000c  syscall                  ; 14: syscall 
[0040003c] 3c101001  lui $16, 4097 [arr0]     ; 15: la $s0, arr0 
[00400040] ae020000  sw $2, 0($16)            ; 16: sw $v0, ($s0)


PC       = 400040
EPC      = 40003c
Cause    = 1c
BadVAddr = 1004002f
Status   = 3000ff12

【问题讨论】:

    标签: arrays assembly mips


    【解决方案1】:

    最后一条指令 sw $v0, arr0($0) = MEM[$0 + arr0] = $v0 不正确。但是,您将获得请求的内存量,并且需要将该内存指针保存在寄存器中,直到程序范围。作业可能如下所示,

    arr:    .space 4
    
    syscall             # Allocates memory and returns address into $v0
    la     $s0, arr     # arr is pointer address
    st     $v0, 0($s0)  # start base address of array
    

    现在arr 是 4 字节内存的基地址,用于保存内存内容的地址。为了获得良好的实践,重要的是取消分配给操作系统的内存,

    li      $v0,10      # return back to OS
    syscall     
    

    【讨论】:

    • 感谢您的回复。我尝试了您建议的代码,但“st”似乎不是有效的 MIPS 操作。 mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf
    • 我尝试使用 la $s0, arr sw $v0, $s0 但这似乎并没有改变任何东西。我已经用更多信息更新了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2014-04-30
    • 1970-01-01
    • 2013-11-05
    • 2020-03-06
    • 2020-09-13
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多