Siccome sono corretto questa routine e tratta dal sito
www.giobbe2000.i
chiama questa routine
mov ax,numero massimo da generare
call random
PUBLIC Random
_prog SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_prog
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PrimoIN DB 00H ; Flag di prima esecuzione (= 0 si; <> 0 no)
Rnd_Lo DW ? ; valore corrente a 32 bit del numero random
Rnd_Hi DW ?
Costante DW 8405H ; Valore del Moltiplicatore
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Random proc NEAR
OR AX,AX ;¿Se il valore del range passato come parametro
JNZ Rand_1 ;³Š nullo si impone la fine immediata della
RET ;Ùprocedura (valore non corretto!!)
Rand_1: PUSH BX ;¿
PUSH CX ;³Salva i registri utilizzati dalla procedura
PUSH DX ;³
PUSH DI ;³
PUSH DS ;Ù
PUSH AX ;¿Salva il valore del range, passato in ingresso
;Ùcome parametro (verr… utilizzato alla fine..)
LEA DI,PrimoIN ;¿Verifica se si tratta della prima chiamata
CMP Byte Ptr CS:[DI],00H;³della procedura che genera il ritardo..
JNE Rand_2 ;Ù.. e se NON Š cos calcola il nuovo valore
;¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³³In pratica questo pezzo di programma ³
;³³implementa la procedura RANDOMIZE di TPascal³
;³ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
MOV AH,2CH ;³Se si tratta della prima chiamata la procedura
INT 21H ;³provvede ad assumere un valore casuale dalla
MOV CS:[Rnd_Lo],CX;³memoria CMOS che contiene il tempo corrente..
MOV CS:[Rnd_Hi],DX;³Per ci• utilizza la Funzione DOS 2CH che lascia
;³in CH = Ore (0ö23)
;³in CL = Minuti (0ö59)
;³in DH = Secondi (0ö59)
;Ùin DL = Centesimi di secondi (0ö99)
MOV Byte Ptr CS:[DI],01H;¿Modifica la flag di primo ingresso per evitare
;Ùdi ricaricare le variabili random iniziali
; ***** Indicazioni relative al primo giro *****
Rand_2: MOV AX,CS:[Rnd_Lo]; AH=Ore (0ö23), AL=Minuti (0ö59)
MOV BX,CS:[Rnd_Hi]; BH=Secondi (0ö59), BL=Centesimi (0ö99)
MOV CX,AX ; CH=Ore (0ö23), CL=Minuti (0ö59)
MUL CS:[Costante] ; AX*Costante=AX*8405H= DX,AX (numero a 32 bit)
SHL CX,1 ;¿
SHL CX,1 ;³
SHL CX,1 ;³
ADD CH,CL ;³
ADD DX,CX ;³
ADD DX,BX ;³
SHL BX,1 ;³Algoritmo di scambio
SHL BX,1 ;³
ADD DX,BX ;³
ADD DH,BL ;³
MOV CL,5 ;³
SHL BX,CL ;³
ADD AX,1 ;³
ADC DX,0 ;Ù
MOV CS:[Rnd_Lo],AX;¿Salva il risultato a 32 bit della manipolazione
MOV CS:[Rnd_Hi],DX;Ùnelle variabili a ci• destinate
POP BX ;¿Recupera in BX il valore del range, passato in
;Ùingresso, in AX
XOR AX,AX ;¿Prepara il dividendo a 32 bit forzando a zero
XCHG AX,DX ;³i 16 bit pi— significativi e copiando nei 16
;Ùbit bassi il valore corrente di DX
DIV BX ;¿AX = quoziente (DX,AX / BX)
;ÙDX = resto
XCHG AX,DX ;¿il numero random corrente Š il valore del resto
;Ùed Š lasciato, in uscita, in AX
POP DS ;¿
POP DI ;³Recupera i registri utilizzati dalla procedura
POP DX ;³
POP CX ;³
POP BX ;Ù
RET
Random ENDP
_prog ENDS
END
se ti serve altro aiuto vai su
www.giobbe2000.i
e il miglio sito di assembler che abbiano mai fatto.
spero di esserti stato d'aiuto
saluti smalldragon