IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Vitesse de transfert en mode VESA 800*600 256 couleurs


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Vitesse de transfert en mode VESA 800*600 256 couleurs
    Bonjour
    Je cherche à utiliser les mode VESA pour créer un jeu en c++ et assembleur 16 bits.Je peux configurer le mode sans pb mais j'ai de gros problèmes de vitesse. Je n'obtient que un peu plus de 10 images par seconde rien qu'en affichant un écran uni avec cette fonction (lancée en boucle):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
                    push es
    	mov ax,0xa000
    	mov es,ax
    	xor dx,dx
    	boucle:
    	mov ax,0x4f05
    	xor bx,bx
    	int 0x10
    	xor di,di
    	mov al,1
    	mov cx,0xffff
    	rep stosb
    	inc dx
    	cmp dx,8
    	jb boucle
                    pop es
    Je trouve que c'est un peu lant pour un pentium 3, pourtant ce n'est pas si long que ça comme code...

    Chep

    --
    Balises code ajoutes par Smortex

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Je n'ai pas le temps d'en parler, je reviendrai ce soir, mais il ne faut pas utiliser rep stos, à éviter, sur mon proc à moi c'est trois fois plus lent qu'une boucle développée avec des inc/dec/jnz/mov. De plus arrange toi pour que les transferts se fassent par dword et non pas par byte, la mémoire vidéo ne passe pas dans la cache (heureusement)

  3. #3
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    le "rep stos" plus lent qu'une combinaison d'instructions inc/dec/jnz/mov, ah bon ? je croyais justement qu'on devait utiliser le plus souvent possible ces instructions à la place d'une autre méthode, tu aurrais de la doc la dessus ?
    Il ne va pas pouvoir faire des transfert en dword car il travaille en 16bits.
    D'ailleurs, pourquoi tu n'utiliserais pas du 32bits? c'est quand même bien plus rapide.

  4. #4
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Je viens de faire une recherche sur les "rep stos", et voilà ce qu j'ai trouvé dans la doc d'intel:

    When copying large blocks of data on the Pentium Pro and Pentium II processors, you can
    improve the speed of the copy by enabling the advanced features of the processor. In order to
    use the special mode your data copy must meet the following criteria:
    · The source and destination must be 8 byte aligned
    · The copy direction must be ascending
    · The length of the data must require greater than 64 repetitions
    When all three of these criteria are true, programming a function using the rep movs and rep
    stos instructions instead of a library function will allow the processor to perform a fast string
    copy. Additionally, when your application spends a large amount of time copying you can
    improve overall speed of your application by setting up your data to match these criteria.
    Cette doc est un peu vieille mais je pense que c'est la même chose pour les pentiums III et +.
    Donc si on à les 3 conditions satisfaites:

    - la source et la destination doivent avoir un alignement de 8bytes (donc leur adresse doivent être égale à 0 modulo 8).
    - On doit copier les données d'une adresse inférieure à l'adresse de destination.
    - On doit boucler plus de 64 fois (cx > 64)

    l'instruction rep stos est plus rapide que toute combinaison de inc/dec/jnz/mov sinon je ne vois pas l'intéret d'avoir créer une telle instruction. (car "rep stos" ne forme qu'une seule instruction).

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je n'utilise pas le 32 bits parceque j'ai apris avec le 16 bits et que j'ai les outils. Si tu as de la bonne doc (tout ce que je trouve est brouillon et compréhensible uniquement par l'auteur) et des liens pour trouver les outils nécessaires...
    J'ai bien Masm32 mais en fait cette partie en assembleur va être intégrée dans un prog en c++ (je peux pas tout faire en assembleur, j'utilise les classes etc) et quand sous borland 4.5 je compile en 32 bits, il ne trouve pas TASM32...

    Merci pour tout
    Chep

  6. #6
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Je compile un programme en assembleur 32 bits avec nasm, il suffit d'écrire au début de son fichier [BITS 32]. Ensuite je compile mon programme en fichier objet (*.o) et je le lie avec gcc ou directement ld avec mon fichier écrit en c.
    Si tu veux des liens, en voici:
    http://kos.enix.org/pub/plainbin.pdf.gz
    http://inferno.cs.univ-paris8.fr/~am.../os/nasmC.html
    Amuse toi bien !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Pour programmer en 32 bits tu fais pareil qu'en 16, sauf que tu rajoute des e, devant tous les noms des registres. Ca te va comme cours acceléré ?

    Citation Envoyé par Albus
    - On doit copier les données d'une adresse inférieure à l'adresse de destination.
    lol tu es sûr de ta traducion ?

    En fait, je vais te donner ce que j'ai dans ma donc qui sera un peu plus explicite :

    Citation Envoyé par Intel
    * direction must be forward (direction flag cleared)
    Donc, que le début de la copie soit à une adresse inférieure à la fin, il n'y a pas de destination ni de source la dedans.


    Citation Envoyé par Albus
    l'instruction rep stos est plus rapide que toute combinaison de inc/dec/jnz/mov sinon je ne vois pas l'intéret d'avoir créer une telle instruction. (car "rep stos" ne forme qu'une seule instruction).
    Parce qu'avant, le nombre d'instruction était important, mais qu'aujourd'hui on raisone en µops. Mais effectivement, ils ont optimisé la copie. Si tu lis bien, il doit être écrit pas loin de ton article que le goulot d'étrangelement est la copie, pas les instructions. Sur mon AMD, la série d'instruction est aussi rapide pour du 32 bits. Pour de l'octet à octet, le développement est bien plus rapide.

    Seulement, il y a un truc qui m'inquiète un peu plus loin :

    Citation Envoyé par Intel
    the memory type for both source and destination must be either writeback or write-combining (you can normally assume this).
    Pas sûr que ce soit vérifié ça :/ Ecriture en mémoire vidéo, ce n'est pas le même type de mémoire. Mais c'est une condition pour les movs pas pour les stos. Alors je ne sais pas, il va falloir tester.

    En tout cas, chez moi, il est 8 fois plus rapide de copier par dword. Donc déjà la première chose à faire est d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
      push es 
      mov ax,0xa000 
      mov es,ax 
      xor dx,dx 
     
    boucle: 
      mov ax,0x4f05 
      xor bx,bx 
      int 0x10 
      xor di,di 
      mov al,1 
      mov cx, 0x3fff 
    [b]  rep stosd[/b] 
     
      inc dx 
      cmp dx,8 
      jb boucle 
     
      pop es
    Il est possible que le passage en 32 bits provoquant l'utilisation d'un prefixe crée une pénalité également. Il faudrait vérifier tout cela.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour les liens et le reste (surtout votre temps) je vais continuer de chercher....

    Chep

  9. #9
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    YOUPI !!! JE VIENS DE TERMINER MON TIPE !!!!

    Désolé pour la traduction de la doc intel mais je suis pas très bon en anglais... C'est vrai que sinon comme condition c'est un peu bizare...

    Si tu lis bien, il doit être écrit pas loin de ton article que le goulot d'étrangelement est la copie
    Heu... déja que j'arrive même pas à traduire une petite phrase d'anglais à français, n'imagine pas que je vais réussir à traduire les mots "goulot" et "étrangelement" en anglais !?

    << ce message ne sert à rien >>

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    bottleneck je crois, ou un truc du genre ^^ Mais je le sais parce que AMILIN parlait de goulots d'étranglement et qu'il y avait ce mot qui ressemblait à bouteille là, un peu partout dans la doc intel ^^

Discussions similaires

  1. Réponses: 11
    Dernier message: 13/01/2006, 22h54
  2. Couleurs et texture 800*600
    Par JuLiOoOoO dans le forum DirectX
    Réponses: 6
    Dernier message: 26/08/2005, 00h06
  3. Informations sur un mode VESA
    Par Arnaudv6 dans le forum Assembleur
    Réponses: 6
    Dernier message: 05/04/2005, 21h46
  4. Mise en page 800*600
    Par bolo dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 17/11/2004, 19h30
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 31/05/2002, 00h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo