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 :

Nombres aléatoires


Sujet :

Assembleur

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut Nombres aléatoires
    salut a ts

    voila je cherche un moyen de donné un valeur aleatoire entre 0 et 15 a plusieurs variables au debut du programme

    javais pensé a utilliser les 100eme de seconde renvoyer par la fonction 2ch de l'interruption 21h et sa marche mais pr une variable car si il y a plusieur variables d'affilé elle prenne tte la meme valeur .

    si vous avez des idées merci d'avance
    @+

  2. #2
    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
    Salut,
    Voila ce que je fais:
    - tu initialises un tableau de 256 octets et tu y mets des valeurs aleatoires (bien sur ce tableau restera fixe dans ton programme, donc tu peut le faire a la main)
    - ensuite tu recuperes un compteur de temps que tu sauve dans ax (comme la fonction 2ch de l'interruption 21h par exemple)
    [1]
    - tu gardes seulement les 8 bits de poids faible de ton registre en faisant un "et logique": and ax, 0xFF
    - tu recuperes la valeur dans ton tableau dont l index est ax: mov cx, [_ptab+ax]
    - tu ajoute cx a ax: add ax, cx
    - maintenant tu as ta premiere valeur pseudo-aleatoire.
    - pour en recuperer d'autre, refait la meme chose a partir de [1].

    si tu as des question, n'hesite pas.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    c'est une bonne idée mais je ne sais pas comment faire un tableau en assembleur .

  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
    C'est juste une suite d'octets.
    exemple (ce que j entends par tableau):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    voici un tableau a 4 cases qui font chacune un octets
    -----------------
    | 2 | 5 | 8 | 1 |
    -----------------
    ce qu'on traduit en asm par:
    _my_tab:
          db 0x02, 0x05, 0x08, 0x01
     
    et pour acceder au 3eme element, on fait:
    mov al, [_my_tab+2]  ;ici al aura pour valeur 0x08
    C'est pas plus complique que ca.

  5. #5
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Quand il s'agit de faire de l'aléatoire (comprenez "semi-aléatoire") j'utilise deux instructions Asm:

    CPUID assure que toutes lesinstructions précédentes auront été exécutées (notemment pour éviter des problèmes dus au cache et au pipeline), et RDTSC retourne un compteur 64 bits(sur le couple EAX/EDX) basé sur les cycles d'horloges. Cela assure un générateur relativement aléatoire.

    Il ne reste plus qu'a garder les bits voulus suivant la taille du nombre que l'on désire.

    Neitsa.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 39
    Points : 46
    Points
    46
    Par défaut
    salut,

    Excellent Neitsa j'aurrai pas pensé à ça....

    merci

  7. #7
    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
    Oui, c'est pas bete du tout d'utiliser RDTSC...
    Mat 74, utilise plutot la methode de Neitsa que la mienne, c'est quand meme beaucoup plus simple.
    pour recuperer un nombre entre 0 et 15 tu n'as cas masquer le quartet de poids faible de eax: and eax, 0x0F

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Salut

    J'aurais juste une question au sujet de la methode proposée par Neitsa, c'est pas vraiment au sujet des nombres aléatoires...

    Je m'demandais pourquoi utiliser CPUID avant RDTSC ? A quoi ca sert ? Qu'est-ce qu'il arriverait si on n'le mettait pas ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    Neitsa => je ne comprend pas bien a quoi font appel ces 2 instructions .

    Albus => meme si tu a l'air de penser que la méthode de Neitsa est mieux , ou moin maintenant je saurais faire les tableaux car je m'etait deja demander comment faire , mais je n'avais pas encore vraimment chercher puisque sa ne m'a été d'aucune utilité pr l'instant je debute en asm .

  10. #10
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par Albus
    C'est juste une suite d'octets.
    exemple (ce que j entends par tableau):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    voici un tableau a 4 cases qui font chacune un octets
    -----------------
    | 2 | 5 | 8 | 1 |
    -----------------
    ce qu'on traduit en asm par:
    _my_tab:
          db 0x02, 0x05, 0x08, 0x01
     
    et pour acceder au 3eme element, on fait:
    mov al, [_my_tab+2]  ;ici al aura pour valeur 0x08
    C'est pas plus complique que ca.
    Je pense que c'est une question-reponse interessante pour la FAQ "Comment faire un tableau en ASM" !
    Tu veux la poster a la suite http://www.developpez.net/forums/viewtopic.php?t=209312 ?

    Le sujet des nombres aleatoires est elaglement un probleme recurent ... Qui trouvera sa place !

    Merci !

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  11. #11
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Pour CPUID dont la fonction première est de retourner des informations sur le CPU, il y a une deuxième application non négligeable à cette instruction. Dixit Intel:

    Citation Envoyé par Intel Manual
    The CPUID instruction can be executed at any privilege level to serialize instruction execution. Serializing instruction execution guarantees that any modifications to flags, registers, and memory for previous instructions are completed before the next instruction is fetched and executed.
    trad. approx.:

    L'instruction CPUID peut être exécutée à n'importe quel niveau de privilège pour mettre en série l'exécution des instructions. La mise en série des instructions guarantie que toutes les modifications des drapeaux, registres et mémoire pour les instructions précédentes sont complétées avant que la prochaine exécution soit recherchée (dans le cache) et exécutée.

    Ansi l'instruction CPUID assure que lorsque la commande suivante va être exécutée, toute les instructions précédentes l'auront été (ne pas oubliez que le CPU n'éxecute pas toujours les instructions dans l'ordre et procède parfois par anticipation).

    Un appel répétitif à RDTSC (dans une boucle par exemple) sans le faire précédéde CPUID peut conduire à des résultats abérrants.

    RDTSC (ReaD Time Stamp Counter) retourne simplement un compteur sur un QWORD basé sur le nombre de cycles d'horloge (provenant du MSR) depuis le dernier allumage (ou reset) du PC. Le DWORD de poid fort se situe dans EDX et le DWORD de poid faible dans EAX.

    Cela (à mon sens) assure un bon générateur semi-aléatoire, le seul problème étant qu'on peut se retrouver avec un générateur incrémental (nombre suivant plus grand que le précédent) si on utilise un registre 32 bits et que les appels sont assez rapprochés. On peut toujours remédiez à ca en le couplant avec une autre routine semi-aléatoire.

    Amicalement, Neitsa.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    je viens d'essayer ta solution Neitsa et sa marche pas le compilateur ( tasm ) me met "illegal instruction for currently selected processor" pr CPUID et "illegal instuction" pr RDTSC .
    Es-ce qu'il faut que j'incluse une librairie ?

  13. #13
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    bonjour,

    Non il faut simplement changer la directive du cpu en debut de code.

    Essaye avec une directive plus haute comme .486 .586 (ou .686). Ce sont des instructions asm au même titre que mov ou dec, etc. donc point besoin d'inclure quoi que ce soit.

    si tu ne peut les coder directement même avec une directive CPU appropriée (étonnant quand même), code les par opcodes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        0FA2              CPUID
        0F31              RDTSC
    Neitsa.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    en fait qu'es-ce que c'est cette directive au debut du prog ?
    et si je suis obliger de l'augmenter car je ne peux pas utiliser des instructions pk ne pas tjs la mettre au + haut ?

  15. #15
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    j'ai un pb , je viens d'essayer .486 sa change rien , .586 il accepte CPUID mais pas l'autre et .686 il me met une erreur sur les 2 et en + sur la directive

  16. #16
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    En imaginant que tu doive développer pour un processeur .386 ,et uniquement pour celui ci ou une version inférieur (les X86 assure une rétro-compatibilité) cette directive te permet d'éviter d'utiliser des instructions non comprises par le processeur cible. De cette facon tu évitera tout risque de plantage.

    Si tu ne dévelloppe pas pour une cible précise, utilise la directive .586 comme minimum, la plupart des CPU X86 d'aujourd'hui sont de cette famille voir au dessus donc tu ne risque rien à l'utiliser (sauf cas particulier bien sur, pour les "vieux tromblons ).

  17. #17
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par Neitsa
    Si tu ne dévelloppe pas pour une cible précise, utilise la directive .586 comme minimum, la plupart des CPU X86 d'aujourd'hui sont de cette famille voir au dessus donc tu ne risque rien à l'utiliser (sauf cas particulier bien sur, pour les "vieux tromblons ).
    Moi, j'aurai carrement pris .686 a mois d'etre sur que l'application devra tourner sur un microprocesseur anterieur au pentium pro.

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  18. #18
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Si tu as une erreur avec la directive .686, c'est que ton TASM est une version qui ne supporte pas les instructions à partir du 686 (pentium pro). Donc le .586 est la commade maximale que tu puisses utiliser. Maintenant, si il ne veut pas te prendre l'instruction RDTSC, y'a deux solutions :
    1) celle à laquelle j'y crois pas du tout : mettre .586p au lieu de .586 (dans ce cas, y'aurait une erreur au niveau du compilo)
    2) solution déjà évoquée précédemment : tu codes ton instruction en dur de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    db 0Fh,31h   ; RDTSC
    en plus, avec le commentaire, tu retrouveras tes billes quand tu reliras ton prog plus tard
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  19. #19
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    voila je viens d'essayer :
    CPUID
    db 0Fh,31h ; RDTSC
    et qd je supprime CPUID ou que je le met sa change rien , il me retourne un nb de 10 chiffres ds eax
    es-ce normal ?

  20. #20
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Mince moi qui croyait avoir été assez clair. Relis la première page de ce post ou j'explique le pourquoi de l'usage de CPUID avant RDTSC.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [FLASH MX] Choisir un nombre aléatoire dans une liste
    Par grenatdu55 dans le forum Flash
    Réponses: 4
    Dernier message: 23/04/2005, 21h09
  2. p'tite question de cryptage ( nombre aléatoire )
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 53
    Dernier message: 08/11/2004, 10h07
  3. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20
  4. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

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