2012-02-07 46 views
0

我的目标是把C代码翻译下面MIPS汇编。我觉得我错过了我的代码中的关键部分。有人可以解释我做错了什么,我需要做什么来解决问题吗?我有这个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 

回答

3

嘛,一开始,你不加载从myStr里面的字节循环。

lbu负载了s字符到$t1在循环开始之前,但,在循环中,你比较,与地址$t0

你需要做的是从$t0每一次循环lbu字节,并与$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可以让你了解:-)

输出

这可能是最快的方法。当然,如果你的目的是要学会如何手工操作,你可能会忽略这个建议,尽管在我看来,它仍然很方便。

+0

好了,所以我只是把那进入死循环,为什么我必须有它的循环? – user977154 2012-02-07 02:33:21

+0

而你并没有检查nul字符。 – 2012-02-07 02:35:10

+0

不,可以避开循环 - 它是从myStr中加载一个需要在循环中的字符。 – 2012-02-07 02:35:46

1

你不加载从A/myStr的字节外循环,无论是 - 你加载地址,并在循环增加,但地址比较的字符“s”,因为在那个反对字符地址。

也不你有没有比较该字符为0