J'ai laissé passer une erreur dans ma routine de soustraction 8 bits signés visible ici.
Je déclare impossible toute soustraction de le forme op1-(-128) sous prétexte que -128 n'a pas d'opposé (sur 8 bits !).
En fait, c'est l’algorithme mis en oeuvre qui ne doit l'être que si op2 diffère de -128.
Cette soustraction est évidemment possible si op1 est strictement négatif
Je propose donc le correctif suivant :
Code : Tout sélectionner
sub_8bits_signé
; réalise la soustraction de deux entiers 8 bits signés
; entrée :
; op1 opérande 1
; op2 opérande 2
; sortie :
; op1 inchangé
; op2 remplacé par son opposé
; result contient op1 - op2
; STATUS,C armé si débordement
; STATUS,Z armé si résultat nul
; remarque :
; utilise un niveau de pile
; la banque mémoire contenant op1, op2 et result
; doit être sélectionnée
; chaîne sur add_8bits_signé pour gagner un octet de code
call opposé_8bits_signé
btfsc STATUS,C
goto sub_8bits_signé_1
call add_8bits_signé
return
sub_8bits_signé_1
; ici on calcule op1-(-128) ce qui n'est possible que si
; op1<0
btfsc op1,7
goto sub_8bits_signé_2
bsf STATUS,C
return
sub_8bits_signé_2
movf op1,w
addwf op2,w
movwf result
bcf STATUS,C
return
Comment le mettre à sa place ?
Avec mes plus plates excuses
Cordialement

