Je suis confus à propos de la différence entre Add et Addu.
La référence de l'instruction MIPS indique:
Ma compréhension consiste à utiliser Ajouter avec des opérandes signés et Addu avec des opérandes non signés.
Mais considérons cet exemple (avec seulement 6 bits):
Overflow [.____] | [.____] V 1 | 1 1 1 <- porter | 1 1 1 1 0 1 + | 1 1 1 1 1 0 = [.____] ------------------ | 1 1 1 0 1 1
Et c'est mon raisonnement:
Maintenant, mes questions sont:
Les noms d'instruction sont trompeurs. Utilisez addu
pour les opérandes signés et non signés, si vous le faites non Vous voulez un piège sur le débordement.
Utilisez add
si vous avez besoin d'un piège sur le débordement pour une raison quelconque. La plupart des langues ne veulent pas un piège sur le débordement signé, alors add
est rarement utile.
Si vous utilisez des numéros signés, vous devez utiliser add
si vous souhaitez que un piège soit généré lorsque le résultat déborde.
Si vous utilisez des numéros non signés, vous devez toujours utiliser addu
et vérifier le débordement de l'addition en comparant le résultat avec les deux chiffres (si le résultat est inférieur à celui des opérandes, l'addition a fait trop de débordement).
Voici un extrait pour montrer comment vous voulez vérifier le débordement de l'addition non signée:
li $a1, 0xFFFF0FFF
li $a2, 0x00010000
addu $a3, $a1, $a2 # This unsigned addition overflows (set $a3 to $a1+$a2)
bgt $a1, $a3, overflowed
bgt $a1, $a2, overflowed
# If you get here, unsigned addition did not overflow
# your code goes here...
overflowed:
# If you get here, unsigned addition overflowed
# your code goes here...
Overflow est NON Comme déclaré comme déclaré dans la question, ce bit de transport n'est pas un débit de débordement, dans l'exemple donné, il n'y a pas de débordement, le débordement est quand:
MSB1 = 1 && MSB2 = 1 && MSBofRESULT = 0
OR
MSB1 = 0 && MSB2 = 0 && MSBofRESULT = 1
alors, stick avec add
Il signalera le débordement et le bit de transport dans votre exemple (ce qui n'est pas un débordement) ne vous dérangera pas. addu
fait la même chose sauf aucune exception n'est jamais soulevée.
Fondamentalement, les deux opcodes sont ajout signés. Donc, dans MIPS, ils utilisent 31 bits pour stocker des données, le nombre maximal est (2 relance à 31) -1 et 1 bit est réservé pour stocker le panneau pour les chiffres. Comme défini ci-dessus, la différence de base entre "Ajouter" et "Addu" est que le premier jette une exception lorsque le numéro de résultat est supérieur au nombre maximal de 31 bits occupant. Ce dernier exécute sans montrer aucun avertissement.
Par exemple, un nombre maximum d'addition 3 bits = (2 ** (N-1)) - 1 Minumem Num = - (2 ** (N-1)), donc dans notre cas max = 3 et min = -4
li $t1,3
li $t2,1
add $t3,$t1,$t2 -----> throws an arthimetic overflow exception
addu $t3,$t1,$t2 ------> t3 = -4
c'est ça.
Ce n'est en fait pas un débordement dans votre exemple. Un débordement survient lorsque la maintien dans le bit de signalisation n'est pas égal à la mord de signalisation. Dans votre exemple, bien que le bit de signalisation soit "1" (le débordement apparemment), le bit de la prise en charge est également "1". Par conséquent, dans cette condition, MIPS ne le considérera pas comme un débordement. Le motif de la manière dont le débordement se produit est en fait correspondant à savoir si le résultat est correct. C'est-à-dire que si le résultat est en dehors de la plage, vos bits peuvent représenter, un débordement survient. Par exemple, si vous ajoutez deux numéros de 4 bits 0111 (7) et 0010 (2) ensemble, vous obtenez un débordement car le résultat (9) est en dehors de la plage d'un nombre à 4 bits peut représenter (-8 à 7). . Si vous regardez l'arithmétique:
0111 (7) + 0010 (2) = 1001 (-7)
vous pouvez voir que même s'il n'y a pas de mord de signalisation, le résultat est toujours incorrect. Par conséquent, il s'agit d'un débordement (et des mips le détecteront).