Assembly 我的MIPS程序有问题
我的目标是将下面的C代码翻译成MIPS程序集。我觉得我的代码缺少了一个关键部分。有人能解释一下我做错了什么,我需要做什么来解决问题吗 下面是C代码:Assembly 我的MIPS程序有问题,assembly,mips32,mars-simulator,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"
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
首先,您没有从循环中的
myStr
加载字节
在循环开始之前,您的lbu
将s
字符加载到$t1
中,但在循环内部,您将其与地址$t0
进行比较
您需要做的是每次通过循环lbu
从$t0
中提取字节,并将其与$t1
进行比较
虽然我已经有一段时间没有做任何MIPS了,但我认为这将是一个解决方案
更改:
loop: beq $t0, $t1, continue
addi $t0, $t0, 1
j loop
进入:
如果您的目标是简单地将C代码转换为MIPS,那么您可以只获取一个MIPS
gcc
编译器的副本,并通过gcc-S
运行它,可能在-O0
上运行它,这样您就可以理解输出:-)
这可能是最快的方法。当然,如果您的目的是学习如何手工操作,您可能希望忽略此建议,尽管在我看来,这对于学习还是很方便的。好吧,首先,您没有在循环中从
myStr
加载字节
在循环开始之前,您的lbu
将s
字符加载到$t1
中,但在循环内部,您将其与地址$t0
进行比较
您需要做的是每次通过循环lbu
从$t0
中提取字节,并将其与$t1
进行比较
虽然我已经有一段时间没有做任何MIPS了,但我认为这将是一个解决方案
更改:
loop: beq $t0, $t1, continue
addi $t0, $t0, 1
j loop
进入:
如果您的目标是简单地将C代码转换为MIPS,那么您可以只获取一个MIPS
gcc
编译器的副本,并通过gcc-S
运行它,可能在-O0
上运行它,这样您就可以理解输出:-)
这可能是最快的方法。当然,如果您的目的是学习如何手工操作,您可能希望忽略此建议,尽管在我看来,这对学习仍然很方便。您也不是从循环外部加载/myStr的字节--您加载地址,并在循环中递增,但是,将地址与字符“s”进行比较,而不是与该地址处的字符进行比较
您也不会将该字符与0进行比较。您也不会从循环外的/myStr加载字节——您加载地址,并在循环中递增地址,但会将地址与字符“s”进行比较,而不是与该地址处的字符进行比较
你也不会将该字符与0进行比较。好吧,我只是将其放入循环中,为什么我必须将其放入循环中?而且你也不会检查nul字符。不,该字符可以不在循环中——它是从myStr加载一个需要在循环中的字符。不是s,你需要加载要测试的字符,例如,lbu$t2,0($t0)并将$t2与$t1进行比较。别忘了beq$zero,$t2,continueokay,所以我只是将其放入循环中,为什么我必须将其放入循环中?而且你也没有检查nul字符。不,可以不进入循环——这是从myStr加载的字符需要进入循环中。不是s,您需要加载要测试的字符,例如lbu$t2,0($t0),并将$t2与$t1进行比较。不要忘记beq$zero,$t2,继续