Accueil > > > [TUTORÉ] LOTO ET NOMBRES PSEUDO-ALÉATOIRES [MASM]
[TUTORÉ] LOTO ET NOMBRES PSEUDO-ALÉATOIRES [MASM]
Information sur la source
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/
Historique
- 30 août 2006 23:06:50 :
- - ELSEIF rien -> ELSE
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|