Как это преобразование сборки MIPS этой программы C? - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть простой вопрос для класса Comp Sci, который я беру, где моя задача - преобразовать функцию в язык ассемблера MIPS.Я верю, что у меня правильный ответ, но я хочу проверить его.

Это функция C

int strlen(char *s) {
     int len;

     len=0;
     while(*s != '\0') {
          len++;
          s++;
     }
     return len;
}

Спасибо!

strlen: 
    add $v0, $zero, $zero       
loop:
    lbu $t0, 0($a0)             
    addi $a0, $a0, 1            
    addi $v0, $v0, 1            
    bne $t0, $zero, loop        
s_end:
    addi $v0, $v0, -1           
    j $ra 

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Я думаю, что цикл while неправильный в случае s = 0. Это должно быть примерно так:

    ...
    lbu    $t0, 0($a0)

loop:
    beq    $t0, $zero, s_end    # *
    ...
    b   loop

s_end:
    ...

* Вы можете использовать макро-инструкцию (beqz $ t0, s_end) вместо инструкции beq.

1 голос
/ 22 апреля 2011

Да, у вас правильная версия asm, и мне нравится тот факт, что вы выполняете как можно больше работы перед тестированием значения t0, чтобы дать как можно больше времени для загрузки из памяти.

...