Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我的MIPS程序有问题_Assembly_Mips32_Mars Simulator - Fatal编程技术网

Assembly 我的MIPS程序有问题

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"

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

首先,您没有从循环中的
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,继续