我在使用这个MIPS程序时遇到了麻烦

时间:2012-02-07 02:25:26

标签: assembly mips32 mars-simulator

我的目标是将下面的C代码翻译成MIPS程序集。我觉得我错过了我的代码中的关键部分。有人可以解释我做错了什么以及我需要做些什么来解决这个问题吗?

这是C代码:

char str[] = "hello, class";
int len = 0;
char *ptr = str;
while (*ptr && *ptr != ’s’)
   ++ptr;
len = ptr - str;

到目前为止,这是我的代码:

.data
    myStr: .asciiz "hello, class"
    s: .asciiz "s"
main:
    la $t0, myStr
    la $t1, s
    lbu $t1, 0($t1)

loop:
    beq $t0, $t1, continue
    addi $t0, $t0, 1
    j loop

continue:
    sub $v0, $t0, $t1

2 个答案:

答案 0 :(得分:3)

好吧,首先,你没有在循环中加载来自myStr的字节。

您的lbu在循环开始之前将s字符加载到$t1但是在循环内部,您将其与地址 {{1}进行比较}}

您需要做的是每次$t0 lbu来自$t0的字节,然后将 $t1进行比较。

我认为这可以解决问题虽然我已经有一段时间了,因为我已经完成了任何MIPS。

变化:

loop:   beq    $t0, $t1, continue
        addi   $t0, $t0, 1
        j      loop

成:

loop:   lbu    $t2, 0($t0)            ; get character at current string location.
        beq    $t1, $t2, continue     ; exit loop is it matches.
        beq    $0, $t2, continue      ; exit loop if it's null.
        addi   $t0, $t0, 1            ; continue loop with next character.
        j      loop

如果您的目标是简单地将C代码转换为MIPS,您只需获取MIPS gcc编译器的副本并通过gcc -S并可能在-O0运行它,以便您可以理解输出: - )

这可能是最快的方式。当然,如果你的目的是学习如何手工完成,你可能想忽略这个建议,虽然在我看来它仍然可以方便学习。

答案 1 :(得分:1)

你也没有从循环外的A / myStr加载字节 - 你加载地址,然后在循环中递增它,但是将地址与字符's'进行比较,而不是在该地址处的字符

您也不会将该字符与0进行比较。