begin process at 2010 02 09 20:34:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriels

 > [TUTORÉ] LOTO ET NOMBRES PSEUDO-ALÉATOIRES [MASM]

[TUTORÉ] LOTO ET NOMBRES PSEUDO-ALÉATOIRES [MASM]


 Information sur la source

Note :
Aucune note
Catégorie :Tutoriels Classé sous :hasard, aléatoire, console, débutant, loto Niveau :Débutant Date de création :17/08/2006 Date de mise à jour :30/08/2006 23:06:50 Vu / téléchargé :6 040 / 214

Auteur : grandvizir

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

Comme l'apprentissage passe par la démonstration, voici un petit exemple très simple : le LOTO.

L'idée du programme est double :
1) prendre une console, générer un tirage et vérifier un algorithme de génération aléatoire
2) expliquer la structure d'un fichier .ASM

Le programme fonctionne avec MASM32 sur un 586. Vous trouverez les versions :
- Pascal de haut niveau (version de "base")
- ASM décommentée
- ASM avec ses nombreux commentaires

L'algorithme RANDOM est tiré de Pascal/Delphi. Mais comme je l'ai retouché pour le faire sortir dans DL, la version Pascal qui sort dans AL se retrouve légèrement plus lente que le programme ASM. Mais le code est déjà très compact et il est très difficile d'accélérer plus.

Bref, tout commentaire est bienvenu... J'espère juste de ne pas avoir dit de bêtises.

Source

  • ; Console Assemble & Link
  • .586
  • .model flat, stdcall
  • option casemap :none
  • include \masm32\include\windows.inc
  • include \masm32\macros\macros.asm
  • include \masm32\include\masm32.inc
  • include \masm32\include\gdi32.inc
  • include \masm32\include\user32.inc
  • include \masm32\include\kernel32.inc
  • includelib \masm32\lib\masm32.lib
  • includelib \masm32\lib\gdi32.lib
  • includelib \masm32\lib\user32.lib
  • includelib \masm32\lib\kernel32.lib
  • .data
  • DMaxInt EQU 49d
  • SCrLf EQU 13,10
  • SDoubleLine DB SCrLf,SCrLf,0
  • SHeader DB "-------------------------------------------------------------------------",SCrLf, \
  • " :: Application Loto MAsm32 ::",SCrLf, \
  • "-------------------------------------------------------------------------",SCrLf,SCrLf,0
  • SMenuItem DB " 1: G‚n‚rer un tirage du loto",SCrLf,SCrLf, \
  • " 2: V‚rifier l'homor‚partition",SCrLf,SCrLf, \
  • " 3: Quitter",SCrLf, \
  • SCrLf,SCrLf,0
  • SSpace DB " ",0
  • SRandomize EQU "M‚thode de randomisation :",SCrLf,SCrLf, \
  • " 1) TickCount Windows - D‚faut",SCrLf, \
  • " 2) Processeur - Pentium (x586)",SCrLf, \
  • " 3) Horloge systŠme",SCrLf,SCrLf, \
  • "> ",0
  • SSelectItem EQU "Votre choix : ",0
  • SIteration EQU "Nombre de balles … tirer : ",0
  • SMaskResult DB " %d -> %d",SCrLf,0
  • SMaskStats DB SCrLf,SCrLf, \
  • " Valeur minimale : %d",SCrLf, \
  • " Valeur maximale : %d",SCrLf, \
  • " Delta : %d",SCrLf, \
  • " Temps requis : %d ms",SCrLf,SCrLf,0
  • .data?
  • RandBase DD ?
  • BRet DB ?
  • AAllDrawn DB 7 dup(?)
  • ACountDraws DD 49 dup(?)
  • DTiming DD ?
  • SOutput DB 255 dup(?)
  • DMinVal DD ?
  • DMaxVal DD ?
  • .code
  • Randomize proc
  • LOCAL RSysTime:SYSTEMTIME
  • .IF AL == 2d
  • RDTSC
  • .ELSEIF AL == 3d
  • invoke GetSystemTime, ADDR RSysTime
  • MOVZX EAX, Word PTR RSysTime.wHour
  • IMUL EAX,60
  • ADD AX, Word PTR RSysTime.wMinute
  • IMUL EAX, 60
  • MOVZX EDX, Word PTR RSysTime.wSecond
  • ADD EAX, EDX
  • IMUL EAX, 1000
  • MOV DX, Word PTR RSysTime.wMilliseconds
  • ADD EAX, EDX
  • .ELSE
  • CALL GetTickCount
  • .ENDIF
  • MOV RandBase, EAX
  • RET
  • Randomize endp
  • DisplayHeader proc
  • cls
  • invoke StdOut, ADDR SHeader
  • RET
  • DisplayHeader endp
  • Menu proc
  • @@:
  • CALL DisplayHeader
  • invoke StdOut, ADDR SMenuItem
  • MOV EAX, sval(input(SSelectItem))
  • .IF EAX == 1d
  • CALL DrawLoto
  • JMP @B
  • .ELSEIF EAX == 2d
  • CALL CheckLoto
  • JMP @B
  • .ELSEIF EAX != 3d
  • JMP @B
  • .ENDIF
  • RET
  • Menu endp
  • IsAlreadyDrawn proc uses ECX EBX
  • AND BRet, 0b
  • @SiDebut:
  • MOV AL, Byte PTR [EBX]
  • CMP AL, DL
  • JNE @F
  • OR BRet, 1b
  • JMP @SiFin
  • @@:
  • CMP CL, 00h
  • JE @SiFin
  • DEC CL
  • DEC EBX
  • JMP @SiDebut
  • @SiFin:
  • RET
  • IsAlreadyDrawn endp
  • DrawLoto proc uses EBX
  • LOCAL DBoucle:DWord
  • invoke StdOut,ADDR SDoubleLine
  • LEA EBX, AAllDrawn
  • XOR ECX, ECX
  • @@:
  • CALL Random
  • CALL IsAlreadyDrawn
  • CMP BRet, 1b
  • JE @B
  • MOV Byte PTR [EBX], DL
  • INC EBX
  • INC ECX
  • CMP ECX, 7d
  • JNE @B
  • MOV DBoucle, 1d
  • LEA EBX, AAllDrawn
  • @@:
  • MOVZX EAX, Byte PTR [EBX]
  • INC EAX
  • invoke wsprintf, ADDR SOutput, ADDR SMaskResult, DBoucle, EAX
  • invoke StdOut, ADDR SOutput
  • INC EBX
  • INC DBoucle
  • CMP DBoucle, 7d
  • JBE @B
  • MOV EAX, input(0)
  • RET
  • DrawLoto endp
  • Random proc
  • MOV EAX, DMaxInt
  • IMUL EDX, RandBase, 08088405h
  • INC EDX
  • MOV RandBase, EDX
  • MUL EDX
  • RET
  • Random endp
  • CheckLoto proc uses EBX
  • LOCAL Index:DWord
  • LOCAL DNumber:DWord
  • invoke StdOut,ADDR SDoubleLine
  • LEA EBX, ACountDraws
  • MOV ECX, DMaxInt
  • @@:
  • AND DWord PTR [EBX+4*ECX-4], 00h
  • DEC ECX
  • JNZ @B
  • MOV ECX, sval(input(SIteration))
  • CALL GetTickCount
  • MOV DTiming, EAX
  • @@:
  • CALL Random
  • INC DWord PTR [EBX+4*EDX]
  • DEC ECX
  • JNE @B
  • CALL GetTickCount
  • SUB EAX, DTiming
  • MOV DTiming, EAX
  • OR DMinVal, 0FFFFFFFFh
  • AND DMaxVal, 00h
  • invoke StdOut,ADDR SDoubleLine
  • AND Index, 00h
  • @Draw:
  • MOV ECX, Index
  • MOV EAX, DWord PTR [EBX+4*ECX]
  • MOV DNumber, EAX
  • CMP EAX, DMinVal
  • JNB @F
  • MOV DMinVal, EAX
  • @@:
  • CMP EAX, DMaxVal
  • JNA @F
  • MOV DMaxVal, EAX
  • @@:
  • INC Index
  • CMP Index, 10d
  • JNB @F
  • invoke StdOut, ADDR SSpace
  • @@:
  • invoke wsprintf, ADDR SOutput, ADDR SMaskResult, Index, DNumber
  • invoke StdOut, ADDR SOutput
  • CMP Index, DMaxInt
  • JNE @Draw
  • MOV EAX, DMaxVal
  • SUB EAX, DMinVal
  • invoke wsprintf, ADDR SOutput, ADDR SMaskStats, DMinVal, DMaxVal, EAX, DTiming
  • invoke StdOut, ADDR SOutput
  • MOV EAX, input(0)
  • RET
  • CheckLoto endp
  • start:
  • @@:
  • CALL DisplayHeader
  • MOV EAX, sval(input(SRandomize))
  • DEC EAX
  • CMP EAX, 3d
  • JAE @B
  • INC EAX
  • CALL Randomize
  • CALL Menu
  • exit
  • end start
; Console Assemble & Link

    .586
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\macros\macros.asm
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

.data

    DMaxInt         EQU     49d
    SCrLf           EQU     13,10
    SDoubleLine     DB      SCrLf,SCrLf,0
    SHeader         DB      "-------------------------------------------------------------------------",SCrLf,          \
                            "                     ::  Application Loto MAsm32  ::",SCrLf,                               \
                            "-------------------------------------------------------------------------",SCrLf,SCrLf,0
    SMenuItem       DB      "       1: G‚n‚rer un tirage du loto",SCrLf,SCrLf,          \
                            "       2: V‚rifier l'homor‚partition",SCrLf,SCrLf,         \
                            "       3: Quitter",SCrLf,                                  \
                            SCrLf,SCrLf,0
    SSpace          DB      " ",0
    SRandomize      EQU     "M‚thode de randomisation :",SCrLf,SCrLf,                   \
                            "   1) TickCount Windows    - D‚faut",SCrLf,                \
                            "   2) Processeur           - Pentium (x586)",SCrLf,        \
                            "   3) Horloge systŠme",SCrLf,SCrLf,  \
                            "> ",0
    SSelectItem     EQU     "Votre choix :  ",0
    SIteration      EQU     "Nombre de balles … tirer : ",0
    SMaskResult     DB      "     %d -> %d",SCrLf,0
    SMaskStats      DB      SCrLf,SCrLf,                                    \
                            "  Valeur minimale : %d",SCrLf,                 \
                            "  Valeur maximale : %d",SCrLf,                 \
                            "  Delta           : %d",SCrLf,                 \
                            "  Temps requis    : %d ms",SCrLf,SCrLf,0

.data?

    RandBase        DD      ?
    BRet            DB      ?
    AAllDrawn       DB      7       dup(?)
    ACountDraws     DD      49      dup(?)
    DTiming         DD      ?
    SOutput         DB      255     dup(?)
    DMinVal         DD      ?
    DMaxVal         DD      ?

.code

        Randomize proc
            LOCAL   RSysTime:SYSTEMTIME
            .IF AL == 2d
                RDTSC
            .ELSEIF AL == 3d
                invoke  GetSystemTime, ADDR RSysTime
                MOVZX   EAX, Word PTR RSysTime.wHour
                IMUL    EAX,60
                ADD     AX, Word PTR RSysTime.wMinute
                IMUL    EAX, 60
                MOVZX   EDX, Word PTR RSysTime.wSecond
                ADD     EAX, EDX
                IMUL    EAX, 1000
                MOV     DX, Word PTR RSysTime.wMilliseconds
                ADD     EAX, EDX
            .ELSE
                CALL    GetTickCount
            .ENDIF
            MOV     RandBase, EAX
            RET
        Randomize endp


        DisplayHeader proc
            cls
            invoke  StdOut, ADDR SHeader
            RET
        DisplayHeader endp


        Menu proc
          @@:
            CALL DisplayHeader
            invoke  StdOut, ADDR SMenuItem
            MOV     EAX, sval(input(SSelectItem))
            .IF EAX == 1d
                CALL    DrawLoto
                JMP     @B
            .ELSEIF EAX == 2d
                CALL    CheckLoto
                JMP     @B
            .ELSEIF EAX != 3d
                JMP     @B
            .ENDIF
            RET
        Menu endp


        IsAlreadyDrawn proc uses ECX EBX
            AND     BRet, 0b
          @SiDebut:
            MOV     AL, Byte PTR [EBX]
            CMP     AL, DL
            JNE     @F
            OR      BRet, 1b
            JMP     @SiFin
          @@:
            CMP     CL, 00h
            JE      @SiFin
            DEC     CL
            DEC     EBX
            JMP     @SiDebut
          @SiFin:
            RET
        IsAlreadyDrawn endp


        DrawLoto proc uses EBX
            LOCAL   DBoucle:DWord
            invoke  StdOut,ADDR SDoubleLine
            LEA     EBX, AAllDrawn
            XOR     ECX, ECX
          @@:
            CALL    Random
            CALL    IsAlreadyDrawn
            CMP     BRet, 1b
            JE      @B
            MOV     Byte PTR [EBX], DL
            INC     EBX
            INC     ECX
            CMP     ECX, 7d
            JNE     @B
            MOV     DBoucle, 1d
            LEA     EBX, AAllDrawn
          @@:
            MOVZX   EAX, Byte PTR [EBX]
            INC     EAX
            invoke  wsprintf, ADDR SOutput, ADDR SMaskResult, DBoucle, EAX
            invoke  StdOut, ADDR SOutput
            INC     EBX
            INC     DBoucle
            CMP     DBoucle, 7d
            JBE     @B
            MOV     EAX, input(0)
            RET
        DrawLoto endp


        Random proc
            MOV     EAX, DMaxInt
            IMUL    EDX, RandBase, 08088405h
            INC     EDX
            MOV     RandBase, EDX
            MUL     EDX
            RET
        Random endp


        CheckLoto proc uses EBX
            LOCAL   Index:DWord
            LOCAL   DNumber:DWord
            invoke  StdOut,ADDR SDoubleLine
            LEA     EBX, ACountDraws
            MOV     ECX, DMaxInt
          @@:
            AND     DWord PTR [EBX+4*ECX-4], 00h
            DEC     ECX
            JNZ     @B
            MOV     ECX, sval(input(SIteration))
            CALL    GetTickCount
            MOV     DTiming, EAX
          @@:
            CALL    Random
            INC     DWord PTR [EBX+4*EDX]
            DEC     ECX
            JNE     @B
            CALL    GetTickCount
            SUB     EAX, DTiming
            MOV     DTiming, EAX
            OR      DMinVal, 0FFFFFFFFh
            AND     DMaxVal, 00h
            invoke  StdOut,ADDR SDoubleLine
            AND     Index, 00h
          @Draw:
            MOV     ECX, Index
            MOV     EAX, DWord PTR [EBX+4*ECX]
            MOV     DNumber, EAX
            CMP     EAX, DMinVal
            JNB     @F
            MOV     DMinVal, EAX
          @@:
            CMP     EAX, DMaxVal
            JNA     @F
            MOV     DMaxVal, EAX
          @@:
            INC     Index
            CMP     Index, 10d
            JNB     @F
            invoke  StdOut, ADDR SSpace
          @@:
            invoke  wsprintf, ADDR SOutput, ADDR SMaskResult, Index, DNumber
            invoke  StdOut, ADDR SOutput
            CMP     Index, DMaxInt
            JNE     @Draw
            MOV     EAX, DMaxVal
            SUB     EAX, DMinVal
            invoke  wsprintf, ADDR SOutput, ADDR SMaskStats, DMinVal, DMaxVal, EAX, DTiming
            invoke  StdOut, ADDR SOutput
            MOV     EAX, input(0)
            RET
        CheckLoto endp

start:

  @@:
    CALL    DisplayHeader
    MOV     EAX, sval(input(SRandomize))
    DEC     EAX
    CMP     EAX, 3d
    JAE     @B
    INC     EAX
    CALL    Randomize
    CALL    Menu

exit
end start

 Conclusion

Vous pouvez toujours aller visiter http://altert.family.free.fr/

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

30 août 2006 23:06:50 :
- ELSEIF rien -> ELSE

 Sources du même auteur

Source avec Zip LE JEU DES 24 BOÎTES DE L'HOMME MYSTÉRIEUX [MASM]

 Sources de la même categorie

Source avec Zip FLOATTOHEX CODE DE BRUNEWS RETRENSCRIS EN ASM PAR MOI par quoi
Source avec Zip [TUTO]PRISE EN MAIN ET CRÉATION DE .EXE À L'AIDE D'UN DÉBUGU... par rt15
Source avec Zip FPU SAMPLE 2. par tomart2005
Source avec Zip STARFIELD, SPHERE, CUBE, ROTATION 3D ET 2D EN UTILISANT LE F... par tomart2005
Source avec Zip REPRÉSENTATION D'UNE SPHÈRE EN 3D (FLAT SHADING) par Nasman

 Sources en rapport avec celle ci

Source avec Zip LE JEU DES 24 BOÎTES DE L'HOMME MYSTÉRIEUX [MASM] par grandvizir
PIC : OBTENIR UN NOMBRE ALÉATOIRE AVEC LA FORMULE XN+1=(137... par warezpsx
Source avec Zip [LINUX] LIRE CLAVIER ET ECRIRE CONSOLE par sheorogath

Commentaires et avis

Commentaire de patatalo le 21/08/2006 21:10:42 administrateur CS

salut,




pourrais-tu me dire ce que donne le .ELSEIF sans condition dans la fonction Randomize ?
toujours vrai ou toujours faux ?
ne serait-il pas plus sur de mettre simplement .ELSE ?


@++

Commentaire de grandvizir le 22/08/2006 21:26:59

Oh oui... J'avais mis au début .ELSEIF AL==3d, mais je l'ai transformé en "cas par défaut". Ca fait moins de code à gérer si l'utilisateur fournit un mauvais paramètre.

Je corrigerai à l'occasion ;)

Commentaire de ToutEnMasm le 24/08/2006 20:17:40

Curiosité,
Delphi semble avoir un desassembleur(tasm est très proche de masm),et je me demande si les header files de delphi sont proches de ceux de masm.
               ToutEnMasm

Commentaire de grandvizir le 30/08/2006 23:19:12

Delphi et MASM32 génèrent tous les deux des applications PE.
En déduire ce que vous voulez...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

demande d'aide pour (débutant) [ par TRAX44 ] salut,je débute, et ne c pas encor kel assembleur je dois utiliser : kel sont les différences entre masm tasm nasm. Pour le language d'après ce que g générateur aléatoire [ par floflotz ] kikooje recherche un petit générateur aléatoire (nb max 100) en assembleur. si qq aurait un petit coup de pouce a me donner, ca serait sympamerciflofl débutant qui a un prob avec l'int21h [ par sibi12 ] salut voivi mon code : mov ah, 09h mov dx, offset buffer int 21hbuffer a été déclaré comme ca: buffer db 50 dup(0)le compilateur me met [Débutant]Compilateur [ par Tellmarch ] comment est-ce qu'on compile un prog en asm?où puis-je trouver un compilateur? Console MMC [ par vtoub ] Bonjour a tous, J'aimerais transformer une application Visual Basic .NET pour l'utiliser dans la console MMC. Je ne sais vraiment comment m'y pren Question de débutant [ par Laurent1313 ] Voilà je débute avec l'assembleur sous Delphi et il y a un truc que je ne comprends pas. Je voudrais juste savoir quelle est la différence entre :ça : Tuto ES Console [ par coockiesch ] Hello!!!Je cherche un tuto qui explique les ES Console, en fr et compatible TASM (oui, c bcp)...Merci@++Raf demande infos, outils, conseils et aide, nécessaires au débutant... [ par formatou ] Salut à tous!Je suis passionné d'informatique depuis 4 ans (date à laquelle G HT mon premier ordi) et je cherche depuis à apprendre à programmer... G gros débutant perdu sous nasm lol [ par eax ] salutje suis débutant en asm et j'utilise nasm sous linux.mon pb c que j'utilise des instructions que j'ai eu en cours et ils utilisent masm sous dos: débutant en asm [ par eax ] salutje débute en asm (avec nasm) et j'arrive pas à assembler mon premier code lolsection .datamsg db 'Hello world$'section .codedebut: lea dx,msg mov


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales