|
 |
Raccolta di Procedure ASM |
Random
[54 di 54] |
 | Genera un numero casuale
a 16 bit. |
 | La Procedura
si chiama in questo modo: |
 | In
ingresso bisogna predisporre:
 | AX
con il numero a 16 bit che
esprime il valore successivo a quello
desiderato come massimo:
 | i numeri 0 e 1 sono accettati ma non hanno
senso |
 | il numero massimo è dunque
FFFFH, 655355 |
|
|
 | In uscita lascia:
 | AX
con il numero a 16 bit che esprime un qualunque valore compreso tra 0 e quello passato in
ingresso, meno 1 |
|
 | La seguente Area di Testo
mostra il Modulo varie12 utilizzato per
inserire la Procedura
nella Libreria
Giobe.ASM/LIB: |
|
Random / varie12 |
NB: se il testo contenuto nell'Area
ti
sembra strano (cioè se contiene
caratteri inconsueti) non hai ancora
installato il font
Giobe.TTF
:
clicca qui!! |
 | Il numero casuale è generato con l'aiuto di un
algoritmo basato su
somme, moltiplicazioni,
divisioni e spostamenti dei valori di volta in volta
coinvolti nel calcolo, a partire dal numero a 32 bit ottenuto mettendo in
sequenza i 4 bytes corrispondenti al tempo
corrente, nel momento della prima
chiamata, letti dalla memoria CMOS di sistema. |
 | L'analisi del codice mette in evidenza il suo sofisticato
modo di operare:
 | preleva il numero iniziale (seme)
della procedura leggendo l'orologio di sistema, con l'aiuto della
Funzione DOS 2CH dell'INT
21H; il valore del
tempo corrente è
lasciato dalla funzione nei registri CH (Ore, da 0 a
23), CL
(Minuti, da 0 a 59), DH (Secondi, da 0 a
59) e DL (Centesimi di secondi, da 0 a
99); in pratica questo pezzo di programma implementa la procedura
RANDOMIZE di Turbo Pascal. |
 | per la precisione il numero iniziale è la
sequenza dei 4 bytes di
Secondi,
Centesimi di secondo, Ore e
Minuti, dal più significativo
al meno significativo. |
 | con un artificio evita di assumere di nuovo il seme per
tutta la sessione di esecuzione del programma |
 | va ricordato che non è detto che il secondo bytes esprima con certezza i
Centesimi di Secondo; in taluni ambienti operativi probabilmente esprime
semplicemente un numero da 0 a 17, frutto del conteggio dei
Ticks prodotti in un secondo (ogni 54,925493
ms)
piuttosto che dei centesimi (10ms).
|
 | per certi versi questo rende ancora più imprevedibile il numero casuale generato
da questa procedura. |
|
 | Il numero a 16 bit lasciato in uscita è compreso tra 0 e il valore (meno 1) passato in ingresso in AX:
può essere pertanto relativamente molto grande, fino a
655354, se AX è stato
passato a FFFFH). |
 | La procedura è elaborata da un'idea di
Nathan Hull (nathan@cs.nyu.edu)
del Courant Institute of Mathematical Sciences
della New York University. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|