10
votes

Valeur absolue entier dans MIPS?

Avez-vous des moyens simples de faire une valeur dans un registre dans MIPS comme valeur absolue?


0 commentaires

5 Réponses :


1
votes

Le moyen le plus simple serait de faire un peu de mathématiques binaires sur les valeurs.

0 commentaires


14
votes

Voici un moyen assez simple de le faire.

#assume you want the absolute value of r1
        ori $2, $zero, $1      #copy r1 into r2
        slt $3, $1, $zero      #is value < 0 ?
        beq $3, $zero, foobar  #if r1 is positive, skip next inst
        sub $2, $zero, $1      #r2 = 0 - r1
foobar:
#r2 now contains the absolute value of r1


1 commentaires

Notez que c'est pour un MIPS sans Slots de délai de branche, comme Mars / Spim simulez par défaut. Sinon, vous voudriez réorganiser le déplacer ( ori ) dans le logement de délai de branche.




9
votes

moyen le plus simple de tous. Il y a une instruction pseudo qui fait: xxx

prendra la valeur absolue de la valeur dans le registre $ T1 et le placera en $ T1


1 commentaires

Cette pseudo-instruction est la séquence SRA / XOR / SUB affichée dans une autre réponse.



2
votes

Voici une version optimisée de taille. Il est plus lent que la réponse SRA / XOR / SUBU, en raison de problèmes de prédiction des succursales, mais c'est une instruction plus petite:

    bgtz $t0, label
label:
    subu $t0, $zero, $t0


0 commentaires