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 ---
- 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 ---
Modérateur : Jérémy
Petite interrogation
Bonjour à tous,
mes premiers pas sur ce sous-forum, je fréquente plutôt le sous-forum ASM mais je me pose une question à propos du ou des compilateurs C utilisés pour générer du code pour ces pics.
Comment se comporte le code généré par les instructions suivantes :
Dans ma cuture,
Excusez moi de vous solliciter mais je n'ai pas encore installé de compilateur C et ce serait un trop gros travail pour répondre à une aussi petite question.
Merci d'avance
mes premiers pas sur ce sous-forum, je fréquente plutôt le sous-forum ASM mais je me pose une question à propos du ou des compilateurs C utilisés pour générer du code pour ces pics.
Comment se comporte le code généré par les instructions suivantes :
Code : Tout sélectionner
int i
i = 0x7fff (ou &h7fff ?)
i += 1
Dans ma cuture,
int i signifie que i est géré comme un entier signé (donc en complément à 2) 16 bits.
la déclaration peut être n'importe où dans le source, du moment que mon instruction est dans sa portée
l'initialisation est là pour l'exemple, i pouvant avoir atteint cette valeur d'une quelconque autre manière
Code : Tout sélectionner
int i
i = 0x8000
i = -i
Excusez moi de vous solliciter mais je n'ai pas encore installé de compilateur C et ce serait un trop gros travail pour répondre à une aussi petite question.
Merci d'avance
Petite interrogation
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
Je ne connais pas grand chose en Assembleur, mais je sais le reconnaitre c'est déjà ca !
J'ai rentré ton code dans mon compilateur mikroC . et voici le fichier ASM qu'il me donne pour une optimisation de code à 0 .
et avec une optimisation à 4 :
Est-ce que cela répond à ta question ?
Je ne connais pas grand chose en Assembleur, mais je sais le reconnaitre c'est déjà ca !
J'ai rentré ton code dans mon compilateur mikroC . et voici le fichier ASM qu'il me donne pour une optimisation de code à 0 .
Code : Tout sélectionner
_main:
;MyProject.c,1 :: void main() {
;MyProject.c,3 :: i = 0x7fff; // (ou &h7fff ?)
MOVLW 255
MOVWF main_i_L0+0
MOVLW 127
MOVWF main_i_L0+1
;MyProject.c,4 :: i += 1;
INCF main_i_L0+0, 1
BTFSC STATUS+0, 2
INCF main_i_L0+1, 1
;MyProject.c,5 :: }
L_end_main:
GOTO $+0
; end of _main
et avec une optimisation à 4 :
Code : Tout sélectionner
_main:
;MyProject.c,1 :: void main() {
;MyProject.c,5 :: }
L_end_main:
GOTO $+0
; end of _main
Est-ce que cela répond à ta question ?
Petite interrogation
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
int ,unsigned int , signed int
c'est surtout la façon dont on veut representer le mot de 16 bits
voir test ci dessous
avec
unsigned int Nb;
signed int i;
la preuve, est que le debugger mikroc nous demande si on veut visualiser la variable 16 bits en signed ou pas
via une case à cocher !
de meme mikroc propose :
IntToStr pour convertir un entier signé en texte
ou
WordToStr pour convertir un entier NON signé
c'est donc bien au programmeur de choisir SA REPRESENTATION du mot choisi
Là ou ça peut se gater ,c'est dans les operations mathematiques addition et soustraction ...
Le resultat est tres dependant de ce qui a été declaré en int ou Word
j'utilise d'ailleur preferablement Word pour un entier non signé
#define Word unsigned int
de meme pour les boucles
for (i=20;i>=0;i--) surprise avec un unsigned int qui repasse à 65535 en dessous de 0
int ,unsigned int , signed int
c'est surtout la façon dont on veut representer le mot de 16 bits
voir test ci dessous
avec
unsigned int Nb;
signed int i;
la preuve, est que le debugger mikroc nous demande si on veut visualiser la variable 16 bits en signed ou pas
via une case à cocher !
de meme mikroc propose :
IntToStr pour convertir un entier signé en texte
ou
WordToStr pour convertir un entier NON signé
c'est donc bien au programmeur de choisir SA REPRESENTATION du mot choisi
Là ou ça peut se gater ,c'est dans les operations mathematiques addition et soustraction ...
Le resultat est tres dependant de ce qui a été declaré en int ou Word
j'utilise d'ailleur preferablement Word pour un entier non signé
#define Word unsigned int
de meme pour les boucles
for (i=20;i>=0;i--) surprise avec un unsigned int qui repasse à 65535 en dessous de 0
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Petite interrogation
Bonjour Jérémy et Paulf jujo, d'abord Jérémy
pas exactement, elle était
et non
cependant, elle répond quand même à ma question, il s'en fout complètement du problème.
Dans ton programme, aucune déclaration de la variable i, c'est normal ? la prend-il par défaut comme un entier 16 bits signés ?
à Paul, mais ça peut intéresser Jérémy
et il a bien raison, les 16 bits ne se traduisant pas du tout de la même manière, si le bit 15 vaut 1
merci pour les copies d'écran qui éclairent très bien le problème. Il semble donc que le programmeur doive faire les pieds au mur pour assurer le non dépassement de capacité de son programme :
pour un signed, tester que le résultat reste positif s'il l'était avant l'encrémentation
pour un unsigned, tester que le résultat n'est pas nul, plus facile
En fait, je crois que tout le monde s'en fout, sauf les cas rares où ça pause problème et ce problème risque d'être délicat à trouver
Merci à vous deux
Jérémy a écrit :Source du message Est-ce que cela répond à ta question ?
pas exactement, elle était
JJE a écrit :Source du message Comment se comporte le code généré par les instructions suivantes :
et non
Quel est le code généré par les instructions suivantes :[
cependant, elle répond quand même à ma question, il s'en fout complètement du problème.
Dans ton programme, aucune déclaration de la variable i, c'est normal ? la prend-il par défaut comme un entier 16 bits signés ?
à Paul, mais ça peut intéresser Jérémy
, je ne suis pas entièrement d'accord, c'est un choix à faire en fonction de l'entité que va représenter une variable dans un programme. Par exemple un compteur qui ne peut pas dépasser 2^16-1 sera bien représenté par un unsigned integer, si on est sûr qu'il est cantonné à 256, un byte (qui est en général unsigned par défaut) fera bien l'affaire, mais une entité pouvant devenir négative, dans la plage -2^15, 2]15-1devra être représentée par un signed integer, en général le signed est optionnel dans les C que j'ai pratiquépaulfjujo a écrit :Source du message c'est surtout la façon dont on veut representer le mot de 16 bits
paulfjujo a écrit :Source du message IntToStr pour convertir un entier signé en texte
ou
WordToStr pour convertir un entier NON signé
et il a bien raison, les 16 bits ne se traduisant pas du tout de la même manière, si le bit 15 vaut 1
merci pour les copies d'écran qui éclairent très bien le problème. Il semble donc que le programmeur doive faire les pieds au mur pour assurer le non dépassement de capacité de son programme :
pour un signed, tester que le résultat reste positif s'il l'était avant l'encrémentation
pour un unsigned, tester que le résultat n'est pas nul, plus facile
En fait, je crois que tout le monde s'en fout, sauf les cas rares où ça pause problème et ce problème risque d'être délicat à trouver
Merci à vous deux
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 15 invités