У меня проблемы с этой программой MIPS

Моя цель — перевести приведенный ниже код 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

person user977154    schedule 07.02.2012    source источник


Ответы (2)


Ну, во-первых, вы не загружаете байт из myStr внутри цикла.

Ваш lbu загружает символ 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, вы можете просто получить копию компилятора MIPS gcc и запустить его через gcc -S и, возможно, в -O0, чтобы вы могли понять вывод :-)

Это, наверное, самый быстрый способ. Конечно, если вы намерены научиться делать это вручную, вы можете проигнорировать этот совет, хотя, на мой взгляд, он все равно будет полезен для обучения.

person paxdiablo    schedule 07.02.2012
comment
хорошо, так что я просто добавил это в цикл, зачем мне это в цикле? - person user977154; 07.02.2012
comment
И вы также не проверяете нулевой символ. - person Richard Pennington; 07.02.2012
comment
Нет, ЭТО можно не вмешиваться — это загрузка символа из myStr, который должен быть в цикле. - person Scott Hunter; 07.02.2012
comment
Не s, вам нужно загрузить тестируемый символ, например. lbu $t2, 0($t0) и сравнить $t2 с $t1. - person Richard Pennington; 07.02.2012
comment
Не забудьте beq $zero,$t2,продолжить - person Richard Pennington; 07.02.2012
comment
Спасибо, @Richard и др., я тоже добавил это. - person paxdiablo; 07.02.2012

Вы также не загружаете байты из A/myStr вне цикла — вы загружаете адрес и увеличиваете его в цикле, но сравниваете адрес с символом «s», а не с символом по этому адресу.

И вы никогда не сравниваете этот символ с 0.

person Scott Hunter    schedule 07.02.2012