MIPS函数和数组

时间:2011-05-18 17:29:10

标签: arrays string assembly mips

我可以在很大程度上理解和使用Java / c ++,但是对于我的生活而言,装配让我感到困惑的是我有两个功能我遇到了麻烦。第一:

一个接收字符串并在终端上打印的函数

另一个接收字符串并将其转换为整数的字符串(字符串全部由数字组成)。

关于从哪里开始的任何想法?

更新

关于第二个功能,到目前为止我得到了这个:

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吗?

1 个答案:

答案 0 :(得分:1)

对于输入输出内容,您必须使用系统调用。对于写入(零终止)字符串,您将使用系统调用#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开头比较)。你应该首先减去0&#39; 0&#39; 0从$ t1开始,然后将其添加到$ 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