2011-05-18 169 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