2012-03-10 616 views
2

我正在爲一個問題編寫代碼,我必須從文件讀取整數並將它們存儲到數組中以執行其他操作。到目前爲止,我已經能夠從文件讀取並將它們存儲到緩衝區中。MIPS:將整數數據從文件中存儲到數組中

#### Read Data from File 
li $v0, 14    # system call for read from file 
move $a0, $s6  
la $a1, buffer   # address of buffer from which to read 
li $a2, 1000   # hardcoded buffer length 
syscall     # read from file 

當我做到這一點:它sucessfuly顯示它們是在不同的行整數文件的內容。

li $v0, 4   # syscall for printing a string 
la $a0, buffer   # load read data in $a0 
syscall 

我被困在這一點,我必須將這些整數在緩衝區中存儲到數組中。這是如何完成的?

回答

4

你沒有給我們提供了很多的信息去,所以我會假設你的文件看起來是這樣的:

1234 523 54326 7131 

(可以線分隔,這個概念是一樣的)

將數字讀入字符串後,必須將其解析爲整數。然後將其存儲在整數數組中。你的陣列應該是這個樣子:

 .align 2 # word-aligned 
array: .space 40 # a word array of 10 elements 

爲了解析字符串爲整數,你可以手推車從C,它具有的atoi(),它看起來是這樣的概念:

# 
# int atoi (const char *str); 
# 
# Parse the cstring str into an integral value 
# 
atoi: 
    or  $v0, $zero, $zero # num = 0 
    or  $t1, $zero, $zero # isNegative = false 
    lb  $t0, 0($a0) 
    bne  $t0, '+', .isp  # consume a positive symbol 
    addi $a0, $a0, 1 
.isp: 
    lb  $t0, 0($a0) 
    bne  $t0, '-', .num 
    addi $t1, $zero, 1  # isNegative = true 
    addi $a0, $a0, 1 
.num: 
    lb  $t0, 0($a0) 
    slti $t2, $t0, 58  # *str <= '9' 
    slti $t3, $t0, '0'  # *str < '0' 
    beq  $t2, $zero, .done 
    bne  $t3, $zero, .done 
    sll  $t2, $v0, 1 
    sll  $v0, $v0, 3 
    add  $v0, $v0, $t2  # num *= 10, using: num = (num << 3) + (num << 1) 
    addi $t0, $t0, -48 
    add  $v0, $v0, $t0  # num += (*str - '0') 
    addi $a0, $a0, 1   # ++num 
    j .num 
.done: 
    beq  $t1, $zero, .out # if (isNegative) num = -num 
    sub  $v0, $zero, $v0 
.out: 
    jr  $ra   # return 

(只就像C atoi()函數一樣,它沒有錯誤檢查機制,你可能想補充一下)。

從文件解析每個單獨的數字(通過傳遞給atoi())並將其作爲整數存儲在數組中。

+0

非常感謝幫助! :) – Amjad 2012-04-13 10:51:02

相關問題