0

我的目标是将下面的 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
4

2 回答 2

3

好吧,首先,您不是从myStr循环内部加载字节。

您在循环开始之前将字符lbu加载到其中,但是在循环内,您将其与address进行比较。s$t1 $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,您可以获取 MIPSgcc编译器的副本并运行它,gcc -S并且可能在-O0这样您就可以理解输出:-)

这可能是最快的方法。当然,如果您的目的是学习如何手工操作,您可能希望忽略此建议,尽管在我看来它仍然对学习很方便。

于 2012-02-07T02:29:08.940 回答
1

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

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

于 2012-02-07T02:34:45.413 回答