2012-12-15 130 views
1

我們的團隊正在嘗試創建一個編譯器,該編譯器提供了代碼並從中生成MIPS彙編。在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 

回答

2

最後一條指令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個字節的內存持有的存儲內容的地址基址。對於好的做法重要的是要取消分配分配回OS的內存,

li  $v0,10  # return back to OS 
syscall  
+0

感謝您的答覆。我嘗試了你所建議的代碼,但「st」似乎不是一個有效的MIPS操作。 http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf – Tagc

+0

我嘗試使用 LA $ S0,編曲 SW $ V0,$ S0 但是這似乎並沒有改變任何事情。我已經用更多的信息更新了這個問題。 – Tagc