J'apprends l'arithmétique des ordinateurs. Le livre que j'utilise (Patterson et Hennessey) énumère la question ci-dessous.soustraction d'entier double précision avec registres 32 bits (MIPS)
Ecrire code mips pour conduire à double soustraction entier de précision pour données de 64 bits. Supposons que le premier opérande figure dans les registres $ t4 (hi) et $ t5 (lo), deuxième dans $ t6 (hi) et $ t7 (lo).
Ma solution à la réponse est
sub $t3, $t5, $t7 # Subtract lo parts of operands. t3 = t5 - t7
sltu $t2, $t5, $t7 # If the lo part of the 1st operand is less than the 2nd,
# it means a borrow must be made from the hi part
add $t6, $t6, $t2 # Simulate the borrow of the msb-of-low from lsb-of-high
sub $t2, $t4, $t6 # Subtract the hi's. t2 = t4 - t6
Cependant, l'auteur solutions proposées à ce problème sont comme ci-dessous
Pour doubles entiers de précision signés,
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
add $t6, $t6, $t2
sub $t2, $t4, $t6
Pour double non signé entiers de précision,
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
addu $t6, $t6, $t2
subu $t2, $t4, $t6
Ma compréhension de la différence dans le fonctionnement sub/add
et subu/addu
est que débordement exception est générée dans sub/add
et non subu/addu
. sub/add
et subu/addu
soustraient/ajoutent les bits des opérandes et l'interprétation des opérandes signés ou non signifient ne fait aucune différence avec le résultat contrairement aux instructions slt
et sltu
.
Question 1
Je déduis des solutions d'auteur étant donné que la détection de débordement est traitée alors que je ne pensais pas à la même chose dans ma solution. Ai-je raison? Y a-t-il autre chose qui me manque?
Question 2
En supposant que ma conclusion ci-dessus est juste, pourquoi la détection de débordement mis hors pour les solutions fournis par l'auteur dans le cas de soustraction de double précision non signé par l'utilisation de addu
et subu
?
Merci beaucoup pour cette réponse détaillée. Vous dites: "Pour les arithmétiques non signées, ils ne veulent aucune exception". Y a-t-il une raison particulière pour laquelle l'exception ne devrait pas être soulevée pendant l'arithmétique non signée? –
En C, l'arithmétique non signée implique une troncature silencieuse: c'est ce que dit la norme. Un _could_ voudrait avoir des nombres de 64 bits non signés avec des exceptions sur débordement, mais pour un 'long long non signé de 64 bits, vous avez besoin d'une troncature silencieuse. Patterson et Hennessey veulent également imiter ce que le MIPS fournit pour l'arithmétique 32 bits, c'est-à-dire non signée, sans exception, et les arithmétiques signées avec des exceptions sur débordement. –
Oh, d'accord. Je reçois l'image entière maintenant. Merci encore une fois pour votre réponse détaillée. Appréciez-en beaucoup. –