我的目标是将下面的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
答案 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进行比较。