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
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : ASSEMBLEURRE : ASSEMBLEUR par solleil
Cliquez pour lire la suite par solleil RE : ASSEMBLEURRE : ASSEMBLEUR par ghuysmans99
Cliquez pour lire la suite par ghuysmans99 RE : ASSEMBLEURRE : ASSEMBLEUR par ghuysmans99
Cliquez pour lire la suite par ghuysmans99
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|