Que peux t-on faire avec l'assembleur que l'on ne peux pas faire avec d'autres l
Nixeus
Messages postés192Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention19 octobre 2020
-
15 déc. 2008 à 19:38
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
13 nov. 2009 à 10:34
Bonjour à tous,
Je sors de BTS Info, et suis développeur de logiciel depuis plus d'un ans dans une société. Ayant obtenu mon BTS l'an dernier, je n'ai jamais eu l'occasion de toucher à l'ASM, mais je dois avouer que ce monde me titille :) car j'adore tout ce qui est "bas niveau"
La majorité des langages "in" ( a la mode) comme JAVA et .Net sont gérés et regérés par les différentes couches framework. L'avantage de l'asm est le fait que nous puissons programmer très proche voir directement sur le matériel.
Une question me hante :)
Pourriez vous me donner s'il vous plait quelques "exemples" de choses réalisables en ASM et non réalisable ou réalisable difficilement dans d'autres langages ? ( meme si il s'agit d'une chose completement inutil, aboutissant a un big plantage processeur, peu importe)
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 17 déc. 2008 à 00:17
Le but en utilisant de l'ASM est l'optimisation maximale (emploi de SSE par exemple) car hormis le code d'initialisation d'un OS, on peut quasi tout faire en C.
cs_yex
Messages postés28Date d'inscriptionjeudi 3 octobre 2002StatutMembreDernière intervention31 mai 2010 20 déc. 2008 à 15:54
Les optimisateurs c/c++ sont très bon et génère du code aussi bien, voir plus optimisé, que du code asm fait à la main dans plus de 90% des cas.
L'asm est, pour moi, à réserver pour des actions très spécifiques
Il peut serveir
- au hooking, code auto modifiable (voir routine utilisée par les packers)
- pour optimiser des fonction multimédias en faisant directement appel aux instructions mmx et autres
pont
Messages postés198Date d'inscriptionsamedi 2 mai 2009StatutMembreDernière intervention16 novembre 20101 24 mai 2009 à 19:59
Bonjour Nixeus,
Je m'étonne que dès la seconde ou la classe de 1e, tu n'aies pas fait de l'assembleur, c'est assez abherrant; en fac on commence l'informatique par des cours théoriques divers, portant sur tout ce qui se passe dans l'ordinateur (pas spécialement le PC), et on fait des exercices en assembleur, l'épreuve finale étant de faire un jeu vidéo.
Pour essayer de répondre à ta question rapidement, car je crois que tant que tu n'auras pas manipulé de l'assembleur, tu ne pourras pas comprendre, car on te ment, Oui, on te ment. Des exemples il y en a partout, mais ça prend de la place, un seul, on te dit que l'assembleur est de bas niveau, c'est faux! Quand on dit qu'un ingénieur est de haut niveau, c'est parce qu'il a de grandes capacités; l'assembleur, c'est le langage de plus haut niveau possible, personne ne pourra jamais l'atteindre. Les fabricants de microprocesseurs connaissent très bien leur matériel et affichent fièrement sa puissance en MIPS (Méga Instructions par Seconde) mais ce sont des instructions en quoi, en C, ou en Java, ou en Delphi, hein, en quoi???
Et bien non car s'ils affichaient le résultat dans ces langages, le résultat serait très très minable, ces langages sont des brouettes, c'est affiché en ASSEMBLEUR, le langage le plus puissant possible.
Vous demandez un exemple simple infaisable en C ou autre, et seulement en assembleur:
Voilà avec un PIC, (je ne montre pas les déclarations de début de programme, seule, la partie active)
Loop CLRF PORTA ; met zéo sur le port A
. . . .DECF PORTA ; décrémente donc met 1 sur A
. . . .GOTO Loop ; reboucle
Le cycle va donc fabriquer 1 0 1 0 1 0 1 etc...
à une fréquence dépendant du nombre de MIPS, ici, je mets un quartz de 20MHz, le temps de cycle est de 200nS, la 1e instruction dure 1 cycle donc 200nS, la 2e 200nS, la 3e 400nS 2 cycles à cause du branchement, donc le temps de boucle est de 800nS, d'où une fréquence de 1/800nS = 1.250.000Hz, et on peut augmenter en mettant une série des pemières instructions pour un seul GOTO plus bas. Et bien, essayez-donc d'en faire autant avec n'importe lequel des langages épais, lourds comme des trains de marchandises de la SNCF. Leur boulot, comme ces trains, c'est le travail lourd, mais pas la performance, pas la puissance. Si Intel n'avait pas fait des processeurs ultrarapides, mais rien ne tournerait, alors qu'un petit PIC, en assembleur, va très bien, et il ne faut pas faire l'erreur de lui coller un gros langage, ne mélangeons pas. Et le microprocesseur ne connaît que l'assembleur, donc il faut transformer une instruction de gros langage en assembleur, tâche rude qui ne peut s'optimiser, il suffit de désassembler un travail compilé puor voir les catastrophes, on n'y comprend rien, c'est bourré de répétitions...
L'assembleur, son domaine, c'est la commande des machines, les liaisons à grande vitesse, une voiture, on programmera le moteur en assembleur pour plus de finesse. En C vous pouvez écrire, sortant d'une librairie standard, PAUSE(500) soit 500 millisecondes, mais en une milliseconde, le PIC a pu faire 1/200nS = 5 mille instructions, d'où l'indication du constructeur: 5MIPS (en 1S)
Comptez que l'assembleur est énormément plus rapide que les autres langages, mais c'est variable, les gros langages ne peuvent pas avoir de relation stricte avec le temps.
Au revoir
Il suffit de passer le pont.
Vous n’avez pas trouvé la réponse que vous recherchez ?
pont
Messages postés198Date d'inscriptionsamedi 2 mai 2009StatutMembreDernière intervention16 novembre 20101 24 mai 2009 à 20:07
Cet éditeur a complètement massacré la disposition de mon petit programme ci-dessus (post précédent), on n'y comprend plus rien, au secours les modérateurs, mettez cet éditeur à la poubelle cet mettez quelque chose de propre. Merci
pont
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 24 mai 2009 à 23:54
Les fabricants de microprocesseurs connaissent très bien leur matériel et affichent fièrement sa puissance...c'est affiché en ASSEMBLEUR...
Mais c'est vraiment du grand nimporte quoi. La puissance d'un CPU n'a rien à voir avec ce qui tournera dessus et encore moins en quels langages les softs sont faits, cette puissance est définie une fois pour toute à la fabrication.
...il faut transformer une instruction de gros langage en assembleur, tâche rude qui ne peut s'optimiser...
là on culmine ! Un compilo C moderne passe par des phases d'optimisation extrèmement poussées avant de délivrer le binaire exécutable.
Comptez que l'assembleur est énormément plus rapide que les autres langages, mais c'est variable, les gros langages ne peuvent pas avoir de relation stricte avec le temps.
NON, c'est entièrement dépendant de celui qui programmera et rien d'autre. J'évacue bien entendu les langages interprétés, ils ne sont pas faits pour être rapides.
pont
Messages postés198Date d'inscriptionsamedi 2 mai 2009StatutMembreDernière intervention16 novembre 20101 25 mai 2009 à 16:10
Bonjour Brunews,
Tes dires sont de quelqu'un qui ne manipule pas l'assembleur. Par exemple, tu crois qu'il y a des "phases successives d'optimisation", à la compilation; c'est en apparence, car le premier jet est tellement catastrophique, que des retouches sont faciles, mais ils ne peuvent pas "optimiser", je vais t'expliquer pourquoi.
. .Optimiser cela veut dire chercher l'optimum, ce n'est pas seulement améliorer, c'est faire qu'il ne soit pas possible de faire mieux, or celui qui programme en assembleur, et qui connaît son affaire, il ne programme pas par paquets de 100 lignes, mais ligne par ligne, et dans le temps, c'est µS par µS (quartz de 4MHz qui est le minimum utilisé) et donc il fait absolument ce qu'il veut, d'une ligne à l'autre, par ex pour une machine, alors que le gros langage va lancer un vérin et attendre qu'il soit arrivé au bout, l'assembleur a des milliers de lignes à sa disposition, pour contrôler un tas énorme de paramètres de la machine, mesurer toutes les températures, envoyer des comptes rendus, calculer des rendements, n'importe quoi de SPECIFIQUE à la machine considérée. Et comment voulez-vous que le gros langage sache ce qu'il faut mettre dans ses intructions pour les adapter à la machine à commander, qui n'est pas la même que celle du voisin?
. . Ce n'est pas de votre faute de penser cela, on vous ment dans les publicités, on vous ment partout, on vous bluffe commercialement, songez que dans la Rome antique, les commerçants et les voleurs adoraient le même dieu, Hermès ! ! !
. .Mais quand vous aurez eu à faire de la programmation en assembleur, vous serez étonné, comme tout le monde habitué au train habituel et qui passe au TGV. Et plus que la vitesse, c'est la finesse extrême de cette programmation qui est intéressante, regardez une instruction de RS232, vous y verrez une série de NOP (no opération) et bien, à la place sans changer les temps, on peut y mettre des instructions d'assembleur! Ce n'est qu'un modeste exemple, la réalité est bien plus grosse. Les gars qui font des virus très discrets, en quoi les font-ils d'après vous? C'est comme un serpent au milieu d'un troupeau de vaches.
. .On ne peut pas "optimiser" un code compilé.
Par ex, en assembleur, une instruction très courante, c'est DECFSZ, d'un coup elle décrémente une valeur dans une mémoire, et saute l'instruction suivante si le résultat de la décrémentation est zéro; comment allez-vous faire ça dans votre langage? Difficile? Et une fois compilé, il y aura 3 pages d'assembleur, de quoi rire!
De plus en plus de gens programment en assembleur, c'est en pleine expansion.Y=e^X
pont
Messages postés198Date d'inscriptionsamedi 2 mai 2009StatutMembreDernière intervention16 novembre 20101 25 mai 2009 à 18:13
Bonjour,
Je ne parle pas spécialement de Intel, je te parle de la fonction que fait le DECFSZ, et tu essaies de la faire avec ton matériel, et tu regardes le résultat, tu compares avec une seule instruction assembleur, c'est tout.
Que veux-tu que j'aie à demander? Quand on a le meilleur, on ne demande plus rien. Et on est sur un forum ASM, quoi de plus merveilleux? Le PC, c'est un terminal pour programmer en Assembleur.
Pour t'indiquer ce que peut faire l'assembleur: La société Télémécanique a fabriqué des Automates Programmables Industriels TSX17, très utilisés partout, considérés comme la star du genre.
Il y a un gros langage, "PL7-2" encore utilisé, et le programme peut être considéré comme ayant une vitesse de 20 millisecondes par instruction.
A l'intérieur, il y a un 8085, de chez Intel, un 8 bits ordinaire pas plus mauvais qu'un autre, i, les bits sont les mêmes pour tout le monde. Il n'est pas en cause, il est seulement mal utilisé, si son programme était écrit en assembleur, il serait égal à un PIC 8 bits de même horloge et tournerait à 1 microseconde par instruction, soit 20.000 fois plus rapide qu'avec le PL7-2.
Voilà la différence entre le gros langage qui n'avance pas, et le même bien performant. Et pour tous c'est pareil (Siemens, les Japonais, etc...), chaque fabricant se croit obligé de vendre son matériel avec un langage personnel; il faut ouvrir le boîtier et y remettre une carte à PIC en assembleur, pour enfin que ça marche.
pont
Messages postés198Date d'inscriptionsamedi 2 mai 2009StatutMembreDernière intervention16 novembre 20101 13 nov. 2009 à 09:20
Bonjour,
On parle d'assembleur, relis la question, on ne parle pas du PC qui n'est qu'une sorte de machine parmi des millions d'autres. Je vais te donner un autre exemple: dans les langages, même qu'ils sont écrits en assembleur, ne peuvent rien faire de plus que l'assembleur, ce qui supposerait des instructions qui n'existeraient pas en assembleur, mais il y a pire, il y a des limitations structurelles dans les boucles par exemple. Chaque structure ( exemple ''if...then...'') est codifiée et inchangeable. En assembleur, il n'y a pas de structure, c'est toi qui la fais et donc tu peux la faire aussi tordue que tu veux, pour optimiser le résultat du traitement, comment veux-tu qu'un compilateur en fasse autant? Par ex, les boucles ne peuvent jamais se croiser, mais seulement s'englober, en assembleur c'est possible, il s'agit de définir de façon claire la condition de sortie, et tu peux sortir d'une boucle inachevée, sans avoir de message d'erreur. Tu vas me dire "et la pile?" On la gère aussi! Tu n'es pas logique, tu sais très bien que c'est impossible qu'une optimisation puisse prévoir tous les cas sans les connaître d'avance. Si tu veux être convaincu de l'horreur d'un programme de haut niveau, regarde le code généré, quand il passe dans l'assembleur, avant que l'assembleur le code en hexadécimal, tu n'en croiras pas tes yeux. Voilà ce que j'ai vu: un programme que je fais en assembleur, sur 12 lignes, a été fait par un spécialiste formateur officiel en code C, il m'a envoyé le résultat, il y a 2.650 lignes assembleur !!! C'est du style par exemple multiplier X par 1.000, il te met mille lignes "ajouter X" tu appelles ça optimiser?
Tu comprends à travers cela qu'un PC, malgré des performances techniques extrêmes en terme de vitesse du processeur (3giga, c'est mille fois plus que 3MHz d'un PIC) et bien le PIC, en assembleur va le battre pour piloter quelque chose de rapide. Fais du PIC, en assembleur, tu vas voir!
Cordialement
pont