Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Commentez, partagez et proposez des Tutos en langage ASM !
Menu de routines ASM à disposition
JJE
Débutant
Débutant
Messages : 91
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#11 Message par JJE » dim. 15 avr. 2018 08:04

bonjour F6FCO,
je crois que dans ces affaires, il faut séparer les arithmétiques signées ou non.
En arithmétique non signée (pas de négatifs), la soustraction n'est définie que si le premier opérande est >= au deuxième, sinon erreur autrement ça marche toujours.
En arithmétique signée, ça se complique un peu, ton exemple marche parce qu’il est dans les limites de la machine, remarque que le résultat est à interpréter en arithmétique signée. Mais j'ai suivi le même algorithme en tentant de retrancher 0x00000003 à 0x80000000 (le plus petit négatif en 32 bits signés), j'ai obtenu 0x7FFFFFFD qui est un nombre positif , pas cool.
Je crois qu'une méthode efficace est d'ajouter un octet en haut poids de chaque opérande, de lui étendre le bit de signe d'opérer comme tu fais sur les 5 octets, Si les 9 bits de haut poids du résultat sont égaux, c'est tout bon sinon il y a dépassement de capacité de la machine. le résultat ne s'écrit pas sur 32 bits. C'es le cas de l'exemple donné plus haut, en fait, le résultat sur 40 bits est 0xFF7FFFFFFD qui est la bonne valeur sur 40 bits signés.
En fait, en info, on est en arithmétique finie, il faut toujours craindre cette finitude et informer l'utilisateur, le programmeur, qu'il demande à la machine des chose qu'elle ne peut pas faire. Il pourra toujours augmenter la précision qu'il a choisie pour ses nombres.
Cordialement
JJE

Menu de routines ASM à disposition
JJE
Débutant
Débutant
Messages : 91
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#12 Message par JJE » dim. 15 avr. 2018 11:54

Rebonjour F6FCO,
je ferais bien la même observation pour la routine de soustraction 16 bits, essaye 0x8000 - 0x0003, mêmes causes mêmes effets.
En fait, je suis bien ennuyé, car je travaillais sur ce même sujet quand j'ai trouvé tes posts, en témoigne celui que j'ai écrit sur l'arithmétique 8 bits signés. J'ai le même étendu à 16 bits que je n'ose plus poster.
Cordialement
JJE

Menu de routines ASM à disposition
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 315
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#13 Message par F6FCO » mer. 18 avr. 2018 22:26

Bonsoir JJE,
Je réponds avec du retard mais je ne suis pas à la maison tous les débuts de semaine. Et pas de pot j'ai oublié sur mon chantier la clé USB qui me suit partout et qui contient mes programmes.
Je ferai l'opération que tu préconises pour voir le résultat et mieux comprendre ton propos. Je précise que mes routines sont destinées à des nombres non-signés, j'ai développé ces opérations parce que j'avais besoin d'une soustraction 16 bits pour mes recherches sur les rampes d'accélération
JC, petit programmeur à 16heures

Menu de routines ASM à disposition
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 315
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#14 Message par F6FCO » jeu. 19 avr. 2018 15:55

JJE a écrit :Rebonjour F6FCO,
J'ai le même étendu à 16 bits que je n'ose plus poster.
Cordialement

Bonjour JJE,
Je ne comprends pas bien le sens de ta phrase, si tu n'oses pas poster ta routine parce que j'ai posté la mienne juste avant, no problem il n'y a pas de compétition entre nous :wink:, au contraire le but est de contribuer pour se faire une belle caisse à outils et plusieurs membres peuvent bien poster chacun leurs routines concernant le même problème. Perso dans ma vraie caisse à outils je dois bien avoir au moins 3 clés plates 15x17. :lol:

Les routines d'additions et soustractions que j'ai postées sont pour des calculs non signés parce que j'en avais besoin telles quelles, sur une cnc il n'y a pas de pas négatifs. Je ne me suis pas encore penché sur les nombres signés et tes routines seront les bienvenues.

JJE a écrit :bonjour F6FCO,
En arithmétique non signée (pas de négatifs), la soustraction n'est définie que si le premier opérande est >= au deuxième, sinon erreur autrement ça marche toujours.

Heuuu ! ben non çà colle dans les deux sens, je viens de refaire l'expérience en vérifiant les résultats avec la calculatrice de Windows:

Soustraction 16bits:
0x00F1 - 0x001F = 0x00D2
0x001F - 0x00F1 = 0xFF2E

Soustraction32bits:
0x0000 00F1 - 0x0000001F = 0x0000 00D2
0x0000 001F - 0x000000F1 = 0xFFFF FF2E

Pour ton exemple j'obtiens:
0x0003 - 0x8000 = 0x8003 en 16 bits
0x0000 0003 - 0x8000 0000 = 0x8000 0003 en 32bits
0x8000 0000 - 0x0000 0003 = 0x7FFF FFFD (ce qui est normal en non signé)

Je plaisante mais je comprends parfaitement ce que tu veux dire (FF peut aussi bien valoir -1 que 255 ), si on se retrouve dans cette configuration c'est sur qu'il faut partir avec des calculs en nombres signés. Il faut déterminer avant de commencer à coder si l'on risque de se retrouver avec des nombres négatifs sinon çà peut vite devenir problématique.
JC, petit programmeur à 16heures

Menu de routines ASM à disposition
JJE
Débutant
Débutant
Messages : 91
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#15 Message par JJE » jeu. 19 avr. 2018 21:09

Salut F6FCO,
Imagine la situation d'un titulaire de compte bancaire dont le solde est à 100 (peu importe l'unité), il émet un chèque de 120, deux situations se présentent :
    il dispose d'une autorisation de découvert
    ou non
dans le premier cas, son compte est à découvert de 20 (si son autorisation de découvert dépasse 20) les matheux disent son compte à -20
dans le deuxième cas, le chèque est refusé, souvent avec pénalité, ce qui complique la chose.
dans le premier cas, 100-120 a un sens, dans le second non.
dans le premier cas, on dispose de nombres négatifs, on est en arithmétique signée, dans le deuxième cas non, on ne peut pas effectuer l'opération 100-120 tout simplement parce qu’il n'existe pas de nombre entier qui ajouté à 120 donne 100.
Je crois que Basic traite tous les entiers comme signés (avec des étendues différentes) mais C fait la distinction et si tu déclare trois variables 8 bits signées r, a et b, que a vaut -128 (plus petit signé 8 bits) et b vaut 3 (ou n'importe quoi d'ailleurs sauf 0), écrire r = a+b t'envoie aux pelotes.
En assembleur, on n'a pas de variable typée. Toutes représentent des octets et c'est au programmeur de savoir ce qu'il met dans ces octets sachant que s'il ne s'intéresse pas aux valeurs négatives, tout simplement parce que pour son sujet elles n'ont pas de sens, il faut qu'il s'interdise les opérations impossibles comme a-b si b>a, mais c'est bien qu'il en prévienne l'utilisateur (en général par un STATUS,C à 1).
Cordialement.
JJE

Menu de routines ASM à disposition
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 315
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#16 Message par F6FCO » jeu. 19 avr. 2018 21:31

A nous de prévoir toutes les parades dans nos programmes et demander à nos chères et tendres de faire le test du singe :wink:
JC, petit programmeur à 16heures


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité