Comment est cette conversion d’assemblage MIPS de ce programme C?

Je pose une question simple pour un cours de Comp Sci dont la tâche consiste à convertir une fonction en langage assembleur MIPS. Je pense avoir une réponse correcte mais je veux la vérifier.

C’est la fonction C

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

Merci!

 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 

Oui, vous avez une version asm correcte, et j’aime bien le fait que vous travailliez autant que possible avant de tester la valeur de t0 pour donner le plus de temps possible au chargement depuis la mémoire.

Je pense que la boucle while n’est pas correcte dans le cas de s = 0. Cela devrait ressembler à ceci:

  ... lbu $t0, 0($a0) loop: beq $t0, $zero, s_end # * ... b loop s_end: ... 

* Vous pouvez utiliser une instruction macro (beqz $ t0, s_end) à la place de l’instruction beq.