2011-05-18 171 views
1

我可以理解並在很大程度上使用Java/C++,但是對於我來說,組裝只是讓我困惑,有兩個函數我遇到了麻煩。第一:MIPS函數和數組

接收一個字符串並打印終端

和接收一個字符串,並將其轉換爲整數(考慮全部由一串數字),另一個在

一個功能。

任何想法從哪裏開始?

更新

關於第二個功能,到目前爲止,我得到這個:

main: 
atoi: 
    li  $v0, 8 
    la  $a0, tstr 
    li  $a1, 64 
    syscall 
    sub $sp, $sp,4 
    sw $ra, 0($sp) 
    move $t0, $a0 
    li $v0, 0 
next: 
    lb $t1, ($t0) 
    beqz $t1, endloop 
    mul $v0, $v0, 10 
    add $v0, $v0, $t1 
    sub $v0, $v0, 48 
    add $t0, $t0, 1 
    b next 

endloop: 
    lw $ra, 0($sp) 
    add $sp, $sp, 4 

更新後的代碼,仍然得到10是一個無效的操作錯誤。而關於sub $v0, $v0, 48我應該只是做sub $t1, $t1, 48

+0

你必須做出來嗎? – BlackBear 2011-05-18 17:32:23

+0

是的,但我仍然有點落後。我已經完成了一些部分,但我甚至不知道如何聲明一個主體,以及如何「調用」一個功能以使用,如果我可以讓自己清楚。 – Zein 2011-05-18 17:42:15

+0

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm你知道這些東西嗎? – BlackBear 2011-05-18 17:47:14

回答

1

對於輸入輸出的東西,你必須使用系統調用。對於寫入(零終止)的字符串,你會使用syscall#4,它需要$ a0中的緩衝區地址。現在只需將系統調用的地址放在$ v0中並執行即可。例如,這個片段讀取的字符串:

li  $v0, 8    # syscall number 
la  $a0, theString  # buffer 
li  $a1, 64    # length of buffer 
syscall      # read! 

Here你可以找到一些系統調用號。
對於第二個練習,這裏的C++代碼,儘量把它翻譯:P

int result = 0; 

while (*digit >= '0' && *digit <='9') {   // digit is char * 
    result = (result * 10) + (*digit - '0'); 
    digit++; 
} 

編輯:
好了,有幾個錯誤。首先,你並沒有檢查你是否已經到達了字符串的末尾(簡單地比較$ t1和0開頭)。你應該首先從$ t1減去'0',然後把它加到$ v0。

next: 
    lb $t1, ($t0) 
    # are there other character or this is the last one? 

    mul $v0, $v0, 10 
    add $v0, $v0, $t1 
    sub $v0, $v0, 48   # subtract 48 only from $t1, not from whole result 
    add $t0, $t0, 1 
    b next 
+0

非常感謝你,一個開始的好地方! – Zein 2011-05-18 18:13:26

+0

到目前爲止這麼好。在第二個練習現在工作 – Zein 2011-05-18 18:28:41

+0

因此,讓我們假設我想打印一個字符串,id拿這段代碼讀取一個字符串,然後添加 li $ v0,4 syscall ? – Zein 2011-05-18 18:32:38