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

x86 16-bits Assembleur Discussion :

Fonction aléatoire emu8086


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Fonction aléatoire emu8086
    Bonjour,

    Je suis en train de finir un programme en assembleur et il me reste qu'une fonction aléatoire pour faire marcher mon programme, mais je ne trouve rien du tout concernant cette fonction...

    J'ai pensé faire une fonction qui marche par rapport au temps, mais je sais pas vraiment comment mettre ça en place...

    Si quelqun a une piste je suis preneur !

    Merci d'avance

  2. #2
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut
    Bonjour, pour tout te dire, je ne connais pas emu8086, mais je sais qu'il y a certains processeurs qui utilisent des compteurs, comme le Time Stamp Counter qui compte les ticks par exemple. Bien-évidemment, il est impossible de prévoir le nombre qu'indique le Time Stamp lors de sa récupération, ce que nous pouvons ainsi considérer comme un nombre pseudo-aléatoire.

    Wikipédia me dit "The Time Stamp Counter is a 64-bit register present on all x86 processors since the Pentium." donc je suppose que ça passe pas avec emu8086

    Mais je te conseillerais de chercher un peu sur la doc de l'emu8086 s'il n'y a pas un système du même genre (il doit sûrement y avoir quelque chose de similaire) par lequel tu pourrais récupérer une valeur aléatoire.

  3. #3
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    une fonction aléatoire, c'est une suite d'opérations mathématiques chaotiques.

    il ne faut pas trop chercher à faire un algo clair, bien au contraire, il faut faire n'importe quoi, et ça peu donner du pseudo aléatoire.

    exemple:
    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
     
    rnd:
    mov ax,[.rnd]
    mov cx,[.seed]
    adc ax,cx
    xor ax,cx
    xor ax,54567
    adc ax,cx
    mov cx,ax
    ror cx,7
    adc cx,ax
    xor ax,cx
    mov [.rnd],ax
    mov [.seed],cx
    ret
    .rnd dw ?
    .seed dw ?
    à chaque appel de rnd, les valeurs de rnd.rnd et rnd.seed seront différentes, ce qui peut être assimilé à de l'aléatoire car il sera très difficile, à partir de la suite de nombres générés, de connaitre l'algo qui est derrière.
    l'idéal, c'est de créer un petit programme de visualisation de la sortie d'un générateur aléatoire pour se faire une idée de sa pertinence. par exemple, afficher les nombres générés sous forme de barres sur un histogramme.

    ce code est codé vite fait, pas testé, mais ça devrait être suffisant pour emu8086.

    [HS]pourquoi les profs vous font tous apprendre sous EMU8086? je comprend pas, ça ne peu que vous dégouter de l'assembleur ce genre de logiciel.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Merci je vais tester ça.

    Bhin en fait je pense que c'est surtout pour nous faire réfléchir, ya pas vraiment d'infos sur le net sur l'EMU8086... On a du se débrouiller sur pas mal de chose, mais c'est vrai que ya certain trucs casiment impossible à faire avec seulement quelques heures de cours...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Erreur ligne 19 : Duplicate déclaration de .rnd

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    J'ai trouvé ça, j'essaye de l'analyser pour me retourner un nombre "aléatoire", je vous signalerer si j'avance, si quelqun a une idée n'hésitez pas.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    ;===================================
     
    ; generates a random turn using
    ; system timer:
    random_turn proc
     
    ; get number of clock
    ; ticks since midnight
    ; in cx:dx
    mov ah, 0
    int 1ah
     
    ; randomize using xor:
    xor dh, dl
    xor ch, cl
    xor ch, dh
     
    test ch, 2
    jz no_turn
     
    test ch, 1
    jnz turn_right
     
    ; turn left:
    mov al, 2
    out r_port, al
    ; exit from procedure:
    ret  
     
    turn_right:
    mov al, 3
    out r_port, al
     
    no_turn:
    ret
    random_turn endp
     
    ;===================================
    Edit :

    J'ai essayé de modifier un peu le code pour retourner ce que ma fonction random revien mais j'ai des erreurs :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    org 100h
     
    mov al, 03h
    mov ah, 0
    int 10h
     
     
    random_turn proc
     
    ; get number of clock
    ; ticks since midnight
    ; in cx:dx
    mov ah, 0
    int 1ah
     
    ; randomize using xor:
    xor dh, dl
    xor ch, cl
    xor ch, dh     
     
    mov dx, cx
    mov ah, 09h
    int 21h
     
    mov ah, 0
    int 16h
     
    ret

  7. #7
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Malum Voir le message
    Erreur ligne 19 : Duplicate déclaration de .rnd
    ça, c'est parce que le compilo interne de emu8086 n'est pas capable de traiter les etiquettes locales, comme il n'est pas capable non plus d'utiliser les registres 32 bits et les instructions système.
    pour resoudre le probleme, suffit de declarer la variable rnd.rnd avec un autre nom du type global.
    par exemple:
    et le tour est joué.

    je suggere la creation d'un sous forum dedié aux cas d'école. ici, c'est pas vraiment un forum de cours de rattrapage, mais bizarrement, 90% des posts sont emis par des etudiants qui ont la flemme de lire leurs cours.

    l'ideal, pour un generateur aleatoire, c'est de creer la fonction RND normale, avec un paramètre pouvant ete issu de n'importe quelle source, entre autres le timer.

    mais utiliser le timer directement pour generer un nombvre aleatoire n'est pas une solution correcte, le timer est tout sauf aleatoire.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Quand on a pas de cours, on peut pas vraiment appeler ça cours de rattrapages...

    Laisse tomber pour ton code j'ai reussi à faire quelque chose de pas mal, a chaque fois que je lance mon programme, ça m'affiche un caractère different, il me reste plus qu'a afficher un nombre à la place de la lettre :

    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
    21
    22
    23
    24
    25
    26
    27
     
    org 100h
     
    start:
     
    MOV AX, 0
     
    mov al, 03h        ; ouverture de la fenetre 
    mov ah, 0          ; en mode texte
    int 10h            ; en 80*25
     
     
    ; get number of clock
    ; ticks since midnight
    ; in cx:dx
    mov ah, 0
    int 1ah
     
    ; randomize using xor:
    xor dh, dl
    xor ch, cl
    xor ch, dh    
     
     
    mov al, ch
    mov ah, 0eh
    int 10h

  9. #9
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Comme l'a dit Edfed, il faut vérifier la fonction aléatoire par un truc visuel.

    Pour ma part, j'utilisais le mode 13h (VGA 320x200 que tout le monde connait)
    et j'affichais des points (adresse 16 bits) de couleur, tirés de la fonction aléatoire.
    en bouclant un paquet de fois (voire même une boucle infinie) je pouvais
    voir la pertinence du calcul.
    Le schéma revient régulièrement, le tout étant que toutes les valeurs puissent
    être obtenues (pas de zone sans point) et que visuellement ça ne ressemble à rien...

    Bien... c'est pas si facile !

    a+ François

Discussions similaires

  1. Fonction aléatoire, une fois pour toute ...
    Par Nothingness0x dans le forum Débuter
    Réponses: 19
    Dernier message: 18/11/2008, 22h07
  2. fonction aléatoire sous l'AS 400
    Par tenah34 dans le forum AS/400
    Réponses: 6
    Dernier message: 02/09/2008, 17h08
  3. Fonction aléatoire pas ordinaire
    Par gotrunkssj dans le forum C
    Réponses: 5
    Dernier message: 21/01/2008, 13h09
  4. Excel fonction aléatoire
    Par Biker-Robby dans le forum Excel
    Réponses: 3
    Dernier message: 11/12/2007, 09h17
  5. Fonctions aléatoires pour caractères
    Par IDE dans le forum C
    Réponses: 14
    Dernier message: 13/05/2007, 15h06

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