Labels, macros et répétitions [Résolu]

Signaler
Messages postés
53
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
10 mars 2010
-
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
-
Bonjour à tous !

Je programme en asm depuis 3 semaines seulement, mais j'ai déjà eu le temps de voir quelques trucs...
Etme voici confronté à mon premier gros problème :

Je cherche à faire un librairie graphique 2D pour fasm
(qui s'appellera 2D4Fasm), pour cela j'ai fait des macros:
-verticale
-horizontale
-pixel
-rect vide
-rect plein
...
et...
-LIGNE

L'algo pour dessiner une ligne oblique en asm est au point ^^, c'est celui de Bresenhams
un seul problème, c'est une M-A-C-R-O !!!
et j'ai des labels, donc quand je dessine 2 lignes, ca bug !

-> symbol already defined...

Et oui... on ne peut pas mettre deux labels identiques...

mes questions :

Ais-je bien fais d'utiliser des macros pour un librairie ?
Comment éviter le problème des labels ?
Aimez vous les bananes ?
Quelle est la marque de votre voiture ?
D'autres librairies éxistent-elles déjà ?

Merci d'avance

-----------------
only Rock'n'Roll
-----------------

8 réponses

Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

Salut,

je sais qu'en assembleur GAS (Gnu ASsembler), il y a une syntaxe pour nommer les labels de manière générique, ex :

jmp  1f # sauter vers le 1er label "1" "forward" -> en avant
:1
jmp  1b # sauter vers le 1er label "1" "backward" -> en arrière

Et le fait d'utiliser cette notation de la label (uniquement des numéros suffixés de "f" ou de "b") permet donc d'utiliser des labels dans des macros, car le compilo sait à quel label tu fais référence.

Ce n'est pas une réponse car je ne connais pas fasm, mais une piste sur la manière dont fasm pourrait l'implémenter.

Gentoo... que du bonheur ...
Messages postés
570
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
18 janvier 2021
2
Salut,
Ce genre de librairie existe déja,voir GDI.


Pour créer une librairie,on est obliger de passer par des fonctions pouvant utiliser des macros.
Messages postés
53
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
10 mars 2010

J'ai trouvé une solution potable,

> fichier.asm
> ...
> ...
> line 20,30,20,30,128
> ...
>
>
> macros.inc
> ...
> macro line x1,y1,x2,y2,color
> push x1
> push y1
> push x2
> push y2
> push color
> call drawLine
>
>
> fichier2.asm
> ...
> ...
> drawLine proc near
< <mon code>
> endp
> ...

Après, faut voir si ca marche

Et j'ai un autre pb :
> push al
> pop al
Ca génère un bug, parceque pop m'envoie deux bits (faible ET fort)
comment puis-je récupérer UNIQUEMENT le bit de poids faible avec pop ?

-----------------
only Rock'n'Roll
-----------------
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

salut,

ha ouai .. ben moi j'ai encore plus optimisé que vous !

drawline(x1,y1,x2,y2,color);

... c'est plus simple à écrire, aussi rapide ... et bien plus lisible ....

Gentoo... que du bonheur ...
Messages postés
53
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
10 mars 2010

nimportnawak !!

Au lieu de me dire que ton système est mieux, lit mes messages...

"> fichier.asm
> ...
> ...
> line 20,30,20,30,128
> ..."

C'est le code de l'utisiateur ca, donc je pense que
drawline(x1,y1,x2,y2,color);
et
line x1,y1,x2,y2,color
sont aussi simples et lisibles

J'ai trouvé les réponses a mes problèmes, merci

-----------------
only Rock'n'Roll
-----------------
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

salut,

Ce que je voulais juste dire en te mettant que j'avais une fonction qui allait aussi vite,
c'est que faire de l'assembleur :
> macro line x1,y1,x2,y2,color
> push x1
> push y1
> push x2
> push y2
> push color
> call drawLine
pour appeler une fonction du gdi32, ... autant faire du C pour une meilleure lisibilité ... d'où mon "drawline(x1,y1,x2,y2,color);".

Je pense que dans bien des cas, l'utilisation de l'assembleur à outrance n'est pas une solution efficace. D'une part car on se substitut au rôle du compilateur C, et on passe donc à coté de tas d'optimisations que le compilateur C connait bien mieux que nous ! Et d'une autre part, car la relecture du code est bien plus exigente et le risque d'erreur bien plus grand !

L'utilisation d'assembleur inline est à mon avis, aujourd'hui, le meilleur moyen de tirer le maximum du compilo C pour ce qui est des appels de fonctions standards, et de l'assembleur pour les parties critiques uniquement. De cette manière, le code reste facilement lisible et débuggable, tout en conservant des parties de forte optimisation ASM là où le compilo n'aurait pas fait le bon choix (instructions SIMD, astuce de codage, streaming ... etc).
C'est pourquoi je me suis un emporté au vu de la macro qui réalise un simple appel à la fonction "drawline", quelle est la raison du choix du langage assembleur ??

Gentoo... que du bonheur ...
Messages postés
53
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
10 mars 2010

Pourquoi l'assembleur et pas le C ???
aaaaaaaaaaaaaaaaaah !! ^^

Quatres raisons :
- J'ai des projets à faire en asm, et en asm UNIQUEMENT !
- C'est un très bon language pour développer des algorithme (complexe, certes, mais j'aime ca ^^)
- C'est un language que tout bon informaticien se doit de connaitre (puisqu'il est la base de la programmation), et je voudrais précisément devenir programmeur-développeur
- Du C ??? Ben... j'en fait déjà ^^

Je m'intéresse à pas mal de languages, et j'en vois d'autres encore à l'IUT... En ce moment je maitrise parfaitement le Basic Casio, le MLC (language Casio/TI), je maitrise plutôt bien le C/C++, et j'apprend l'asm 80x86, le Java, (le XHTML et le CSS si on peut appeler ca des languages), le BrainFuck, le PHP et le SQL !!!
En plus, on voit le fonctionnement de la console Linux (ce qui n'est pas rien) et la méthode MERISE (qui est notre plus gros module)

Comme on n'a pas tant de temps que cela en cours, on passe plutot vite sur certains languages... Donc j'en apprend plus chez moi encore, pour parfaire ma culture !

Et même si certaines choses ne me serviront plus après, c'est toujours sympa de découvrir ^^

L'union de l'asm et du C m'était inconnue par exemple, tu m'apprend qqchose la... je regarderais cela de plus près.

-----------------
only Rock'n'Roll
-----------------
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

re,

"L'union de l'asm et du C m'était inconnue par exemple, tu m'apprend qqchose la... je regarderais cela de plus près."

J'en apprends moi aussi tous les jours encore ;) c'est comme cela qu'on progresse ;)

Pour parler un peu de l'asm inline, l'interêt est d'avoir la simplicité du C (ou C++) pour le "main" ainsi que les appels classique de printf et autres fonctions courantes de la stdlib. Et de pouvoir se concentrer là où l'assembleur prend tout son interêt. Ainsi, on apprend beaucoup plus de choses interessantes que de choses rébarbatives ;)

ex :

toto.c :

#include <stdlib.h>

#define DATA_SIZE 256

int main(int argc, char **argv)
{
    unsigned char A[DATA_SIZE];
    unsigned char R[DATA_SIZE];
    unsigned char G[DATA_SIZE];
    unsigned char B[DATA_SIZE];
    unsigned int ARGB[DATA_SIZE];

    // conversion du buffer ARGBARGB.. en 4 buffer AA.. , RR.., GG.., BB..
    _asm
    {
        ... là tu mets ton code asm pour la conversion ...
    }

    return 0;
}

-> bilan, seule la fonction réalisant la conversion sera en asm, ce qui rend ton programme facilement lisible car la partie interessante n'est pas noyé dans dans le code assembleur du "return" ou du "main" voir d'autres fonctions si y-a ...

Gentoo... que du bonheur ...