У меня проблемы с этой программой MIPS - PullRequest
0 голосов
/ 07 февраля 2012

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

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Ну, для начала, вы не загружаете байт из 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, чтобы вы могли понять вывод: -)

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

1 голос
/ 07 февраля 2012

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

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

...