Une version en x86_64, pour Linux. À assembler avec FASM.
Pour l'ASCII étendu, suit l'ISO 8859-15 (aka Latin-9), et donc pas l'UTF-8. Limites en dur pour la longueur de la ligne et des mots.
formatELF64executable3entry_startTAILLE_BUF=256TAILLE_MOT=64segmentreadableexecutable_start:XORRAX,RAX; 0 (sys_read)XORRDI,RDI; 0 (stdin)MOVRSI,bufin; adresse du tampon d'entréeMOVRDX,TAILLE_BUF; taille du tamponSYSCALL; lectureMOV[longueur],RAX; nombre d'octets lusXORRDI,RDIteste_nouveau_caractere:; on teste le nouveau caractèreCALLnature_caractereCMPAL,0JNEnouveau_mot; ponctuation et divers : on l'écrit tel quelMOV[bufout+RDI],DLJMPsuivantnouveau_mot:; lettre : début d'un nouveau motXORRBX,RBX; compteur des caractères du motMOVRSI,RDI; mémorise la position (offset) du début du mot; on recherche la fin de ce nouveau mot en enregistrant pour chaque lettre son typecontinue_mot:MOV[mot+RBX],DLMOV[type_car+RBX],ALMOV[casse_car+RBX],AHINCRDICALLnature_caractereCMPAL,0JEfin_motINCRBXJMPcontinue_motfin_mot:pushRDXXORRCX,RCXinverse_mot:; quelle casse faut-il ?MOVAL,[casse_car+RCX]; casse du caractère d'origineCMPAL,0JNEminuscule; majusculeMOVAL,[casse_car+RBX]; casse du nouveau caractèreCMPAL,0JNEmonter_casse; déjà en majuscule, il faut juste copierMOVAL,[bufin+RSI+RBX]MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motmonter_casse:MOVAL,[type_car+RBX]CMPAL,1JNEpas_min_stdMOVAL,[mot+RBX]ADDAL,"A"MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motpas_min_std:CMPAL,2JNEpas_min_accMOVAL,[mot+RBX]ADDAL,0xC0; "À"MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motpas_min_acc:; e dans l'omov[bufout+RSI+RCX],0xBC; "Œ"JMPfin_corps_boucle_motminuscule:MOVAL,[casse_car+RBX]; casse du nouveau caractèreCMPAL,1JNEbaisser_casse; déjà en minuscule, il faut juste copierMOVAL,[bufin+RSI+RBX]MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motbaisser_casse:MOVAL,[type_car+RBX]CMPAL,1JNEpas_maj_stdMOVAL,[mot+RBX]ADDAL,"a"MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motpas_maj_std:CMPAL,2JNEpas_maj_accMOVAL,[mot+RBX]ADDAL,0xE0; "à"MOV[bufout+RSI+RCX],ALJMPfin_corps_boucle_motpas_maj_acc:; E dans l'Omov[bufout+RSI+RCX],0xBD; "œ"fin_corps_boucle_mot:INCRCXDECRBXJNSinverse_mot; on copie le dernier caractère que l'on vient de trouverpopRDXMOV[bufout+RDI],DLsuivant:INCRDICMPRDI,[longueur]JLteste_nouveau_caractereMOVRDI,1; 1 (stdout)MOVRSI,bufout; adresse du message à afficherMOVRDX,[longueur]; nombre d'octets à écrireMOVRAX,1; 1 (sys_write)SYSCALL; écriture; ExitMOVRDI,0; status de sortie = SUCCESSMOVRAX,60; 60 (sys_exit)SYSCALL; exécution de la sortie;; === ROUTINE nature_caractere ===;; entrée :;; rdi : index caractère dans le tampon bufin;; sorties :;; al : type du caractère :;; 0 : ponctuation, divers;; 1 : lettre standard;; 2 : lettre accentuée;; 3 : e dans l'o;; ah : 0 : majuscule;; 1 : minuscule;; dl : rang du caractère dans le type;; ===nature_caractere:MOVDL,[bufin+RDI]test_majuscule:CMPDL,"A"JBautresCMPDL,"Z"JAtest_minuscule; majuscule standardMOVAL,1MOVAH,0SUBDL,"A"RETtest_minuscule:CMPDL,"a"JBautresCMPDL,"z"JAtest_edanlo; minuscule standardMOVAL,1MOVAH,1SUBDL,"a"RETtest_edanlo:CMPDL,0xBC; "Œ"JBautresJNEtest_edanlo_min; e dans l'o majusculeMOVAL,3MOVAH,0SUBDL,0xBC; "Œ"RETtest_edanlo_min:CMPDL,0xBD; "œ"JAtest_majuscule_accentuee; e dans l'o minusculeMOVAL,3MOVAH,1SUBDL,0xBC; "Œ"RETtest_majuscule_accentuee:CMPDL,0xC0; "À"JBautresCMPDL,0xDD; "Y'"JAtest_minuscule_accentuee; majuscule accentueeMOVAL,2MOVAH,0SUBDL,0xC0RETtest_minuscule_accentuee:CMPDL,0xE0; "à"JBautresCMPDL,0xFD; "y'"JAautres; minuscule accentueeMOVAL,2MOVAH,1SUBDL,0xE0RETautres:MOVAX,0RET;; === FIN nature_caractere ===segmentreadablewriteablebufinRBTAILLE_BUFbufoutRBTAILLE_BUFmotRBTAILLE_MOTtype_carRBTAILLE_MOTcasse_carRBTAILLE_MOTlongueurDQ0
Pas spécialement propre (je dois écrire en moyenne 50 lignes d'assembleur par an...), ni documenté, ni optimisé (mais vus les langages d'urbains épilés présentés dans la plupart des autres propositions, ce programme (binaire de 1364 octets) devrait avoir fini son exécution avant que les autres n'aient fini leur chargement en mémoire). Ne gère pas pas correctement les signes « multiplication » et « division » (pas envie de m'embêter pour ce cas particulier « intelligemment » placé au beau milieu des majuscules accentuées).
# Avec du poil aux pattes
Posté par gnx . En réponse au journal Esod mumixam !. Évalué à 9.
Une version en x86_64, pour Linux. À assembler avec FASM.
Pour l'ASCII étendu, suit l'ISO 8859-15 (aka Latin-9), et donc pas l'UTF-8. Limites en dur pour la longueur de la ligne et des mots.
Pas spécialement propre (je dois écrire en moyenne 50 lignes d'assembleur par an...), ni documenté, ni optimisé (mais vus les langages d'urbains épilés présentés dans la plupart des autres propositions, ce programme (binaire de 1364 octets) devrait avoir fini son exécution avant que les autres n'aient fini leur chargement en mémoire). Ne gère pas pas correctement les signes « multiplication » et « division » (pas envie de m'embêter pour ce cas particulier « intelligemment » placé au beau milieu des majuscules accentuées).