Oui mais il dit qu'il est en informatique de gestion. Je pense donc que ce dont tu parles n'est pas dans son projet.
-----
Oui mais il dit qu'il est en informatique de gestion. Je pense donc que ce dont tu parles n'est pas dans son projet.
Rien ne sert de penser, il faut réfléchir avant - Pierre Dac
C'est en fait ça, JPL a compris ma situation
L'assembleur ou autre chose.... Moi j'avais commencé par du pascal, abandonné 4 mois après, pour passer sur du C. Bon, y'avait une raison pédagogique (approche douce à travers la syntaxe simple ET précise du pascal), et celle de l'assembleur doit plutot se trouver dans la compréhension HW d'un CPU, base 16, base 2, et ne continuera sans doute pas longtemps.
Donc qu'il y ait un TP ou 2 dessus me semble acceptable, après tout
Faire un peu de tout aide à mieux comprendre le tout
J'ai un autre probleme avec ce tout nouveau code tout frais
Le but est d'ecrire dans le fichier "result" pair si le nbr introduit l'est, et impair si celui-ci l'est aussi.
Dans mon cas quelque soit le nombre introduit il me met pair ( voir asterix dans mon code: zone sensible)
Code:global main section .data result DB `result`, 0 section .rodata msg1 DB `Pair\n` lgrMsg1 DD lgrMsg1 - msg1 msg2 DB `Impair\n` lgrMsg2 DD lgrMsg2 - msg2 section .bss nbr RESB 1 section .text main: mov eax, 3 ; service read mov ebx, 0 ; stdin (clavier) mov ecx, nbr mov edx, 256 int 0x80 ; * je doit trouver le moyen de mettre la nbr introduite dans le registre edx. Le code qui suit est correcte, si erreur il y a alor elle sera en haut bt edx, 0 jc _impair mov eax, 5 ; service open mov ebx, result mov ecx, 1q | 2000q int 0x80 mov ebx, eax ; service write mov eax, 4 mov ecx, msg1 mov edx, [lgrMsg1] int 0x80 jmp _fin _impair: mov eax, 5 ; service open mov ebx, result mov ecx, 1q | 2000q int 0x80 mov ebx, eax ; service write mov eax, 4 mov ecx, msg2 mov edx, [lgrMsg2] int 0x80 _fin: mov eax, 1 mov ebx, 0 int 0x80
Quelle est la taille exacte de ton buffer de saisie clavier ?
A l'économie tu peux juste analyser le dernier chiffre tapé.
Sinon il faut convertir une chaîne en valeur numérique, et là tu n'échappes pas à l'algo et le programme d'une dizaine de lignes.
La conversion vérifiera en même temps que la saisie est valide.
Je ne sais pas te répondre.
Si je veux introduire un nombre et non un chiffre alors je devrai analysé l’entièreté. En plus de ça j'ai mis 256 octet pour nbr, ca devrais suffir, non? à moins que je suis à coté de la plaque
Ou c'est moi car en fait je n'ai jamais fait d'asm Intel sur Linux, je lis juste les docs
Je disais quelle est la taille de ton tampon recevant les données ?
http://www.gladir.com/LEXIQUE/INTR/int80f03.htm
Pour moi un nombre pair à son dernier chiffre pair, et j'ai bu que du café
Merci mais je crois qu'il ne s'agit pas du tampon.
et d’après la documentation que tu as trouvé je suis dans le bon "car nombre d'octets à lire dans le tampon"
Ce qui m'intéresse c'est l'adresse du tampon que tu mets dans ecx, et c'est nbr.
La ligne "nbr resb 1" signifie que ton tampon fait 1 octet. Donc des que tu vas taper 2 octets ou va t-il mettre le 2ème, et le 255ème ?
Normalement ton programme devrait planter, c'est pourquoi je suis pas sur.
Je viens d'essayer avec un autre code ce que tu soulève concernant "RESB 1" et il se trouve qu'il fonctionne.
ah! j'allais oublier dans RESB 1 (1=> 1 Byte=1 octect= 8 bits =>nbr max=01111111)
tandis que edx, 256 est exprimé en bit
Il faut que tu lises un tuto sur les bases de l'asm, les directives, les formats de données. Elles te manquent. Il y en a de très bons sites en français, je sais pas si on peut les citer ici.
Dans ton lien, il montre code permettant d'afficher ce qu'on écrit au clavier, mais dans mon cas je ne veux pas l'afficher, mais mettre ce que j'ai ecrit au clavier dans un registre afin de faire un test de parité sur celui-ci.
Ma réponse n'a pas changé depuis mon premier message de la journée.
Où je te signalais aussi déjà que ton buffer n'étais pas bon. Il faut écrire "nbr resb 256" et pas autres chose. Ca plantait pas car l'OS est très tolérant dans la protection des segments.
ok je vais essayé alors, croisons les doigts
ça n'a pas fonctionné.
Mon code ne plante pas, mais il marche que pour pair, donc pour n'importe quelle valeur il me met pair dans le fichier result.
J'ai essayé mon code on donnant une valeur fixe pour edx, et cela fonctionnait à la perfection, le seul hic c'est que je n'arrive pas à faire fonctionner l'enregistrement de la lecture clavier dans edx donc edx variable.
Merci encore Satinas pour ton acharnement
Montre nous ton code qui permet de prendre les (nombreux) caractères tapés et stockés dans le (très grand) buffer nbr, et les transformer en valeur numérique 32 bit que tu mettras dans edx, avant de tester sa parité.
Si c'est trop dur, tu dois pouvoir trouver ça sur le net, même dans un autre langage et le transposer en asm. Faut traiter les puissance de 10 dans une boucle.
Là je dis pus rien, c'est la sieste
lol Je suis aussi fatigué, donc ca sera mon dernier message tu pourras dormir en paix apres avoir vu ce fameux code que voici: (et je t'assure qu'il fonctionne tres bien à condition que les nombres ne dépasse pas 8bit=>1 byte RESB 1)
Code:global main section .bss affich RESB 1 section .text main: mov eax,3 ; lire mov ebx,0 ; clavier mov ecx,affich ; adresse du resultat mov edx,256 ;nbr d'octet lu int 0x80 mov edx,eax; nbr d'octet lu mov eax,4 ; write mov ebx,1 ; ecran mov ecx,affich ; le message int 0x80 mov eax,1 mov ebx,0 int 0x80 ; on quitte
Ton code affiche tout ce qui a été tapé dans la limite des 256 caractères. A partir du 2ème caractère il stocke dans un endroit indéterminé, mais ça passe car il n'y a rien derrière le buffer affich.
je te propose de tester ce code qui affiche la même chose, suivi du caractère '1'. Tu verras qu'il se comporte pas du tout pareil avec "affich resb 1" et "affich resb 256".
Dans le premier cas, il écrase le contenu de ndata car il a le malheur de suivre le buffer affich que tu exploses allègrement.
Code:global main section .bss affich RESB 1 ndata RESB 1 section .text main: mov byte [ndata],'1' mov eax,3 mov ebx,0 mov ecx,affich mov edx,256 int 0x80 mov edx,eax mov eax,4 mov ebx,1 mov ecx,affich int 0x80 mov edx,1 mov eax,4 mov ebx,1 mov ecx,ndata int 0x80 mov eax,1 mov ebx,0 int 0x80
J'ai posé ma question à un professeur et voila ca réponse, j'espere que quelqu'un pourra trouver réponse à mon problème :
Re: [LMC1] TD4 - EX4
Message nvs Aujourd'hui à 02:44
Ce que tu fais, c'est lire quelques caractères au clavier et les stocker dans la variable nbr. ce que tu ne fais pas c'est convertir cette suite de caractères en un nombre binaire puis placer celui-ci dans edx... ce qui n'est pas trivial !