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
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : PIC 16F84RE : PIC 16F84 par pont
Cliquez pour lire la suite par pont RE : PIC 16F84RE : PIC 16F84 par belounis
Cliquez pour lire la suite par belounis RE : PIC 16F84RE : PIC 16F84 par pont
Cliquez pour lire la suite par pont
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Hero
Entre 550€ et 550€
|