Assembleur [les nombres]

biloute555 Messages postés 21 Statut Membre -  
kilian Messages postés 8854 Statut Modérateur -
Bonjour,
Voila, je débute en assembleur.
Je comprend pas comment le microprocesseur représente les nombres? En fait, comment différencie-t-il les nombres signés des nombres non signés?
J'espère que la question est assez clair.

Merci d'avance pour votre aide.

4 réponses

le père
 
comment, en tant que programmeur, je peux le dire
A qui veux-tu le dire ?
Le microprocesseur n'a à aucun besoin ce cette information.
Quand tu définis une variable qui va contenir, par exemple, un compteur, tu ne dis pas au microprocesseur que cette variable contient un compteur. TU décides que ça représente un compteur et TU le programmes comme un compteur (initialisation, instruction LOOP peut-être). Tu as fait ça parce que tu avais besoin d'un compteur.

Même chose quand tu te poses la question des variables signées ou non. Si tu manipules des températures en degrés celsius, tu as sûrement besoin de variables signées, si tu comptes des objets tu n'as besoin que de variables non signées.

Si tu compares des températures avec 1 degré dans AX et -1 degré dans BX, tu as :
MOV AX,1
MOV BX,0FFFH ;-1
CMP AX,BX

Si tu compare des nombres d'objets, avec 1 pomme dans AX et 65535 pommes dans BX, tu fais :
MOV AX,1
MOV BX,0FFFH ;65535
CMP AX,BX

Jusqu'ici c'est exactement la même chose dans les deux cas.
Mais dans le premier cas, TU vas ensuite tester le flag overflow parce que TU sais qu'il s'agissait de nombres signés
Dans le second, TU vas ensuite tester le flag carry parce que TU sais qu'il s'agit de nombres non signés.

C'est uniquement TOI qui prends la décision de tester carry ou overflow, le microprocesseur n'y est pour rien.
1
le père
 
Bonjour

Le microprocesseur ne distingue pas les nombres signés des nombres non signés.
C'est au programmeur de décider si la valeur qu'il met dans une mémoire ou un registre représente un nombre signé ou pas, et d'utiliser ensuite les bonnes instructions en fonction de ce choix.
0
biloute555 Messages postés 21 Statut Membre
 
d'accord, merci, mais comment, en tant que programmeur, je peux le dire?
J'ai appris que le Carry flag et l'overflow flag se positionne si il y a eu un dépassement de capacité, à la différence que le pour le carry il faut que les nombres sois non signé, et pour le OF les nombre doivent être signé.
Si je dois donné un exemple, comment faire pour dire, dans ce cas ci j'utilise des nombres signé, et dans ce cas-ci non?
0
biloute555
 
ok, je vois, merci beaucoup pour vos réponses.
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Pour le processeur, les choses n'ont pas de différences en soi. Un entier signé ou pas, un caractère..bof toutes ces choses ne sont que des valeurs.

La différence se joue dans les instructions.

Par exemple sur x86, l'addition et la soustraction sont les mêmes pour les deux. Par contre la multiplication et la division diffèrent si le nombre est signé ou pas (instructions div/idiv et mul/imul).

De même pour les sauts conditionnels. On utilisera jg pour (jump if greater than) avec des signés et ja (jump if above) pour des non-signés par exemple.
0