Está en la página 1de 2

jmp inicio

msg1 db 'Numero al azar: $'


numero dw ?, 0ah, 0dh, '$'
inicio:
lea dx, msg1
mov ah, 9
int 21h
Mov ah,2Ch
Int 21h
xor ax, ax
mov dh, 00h
add ax, dx
aaa
add ax, 3030h
mov numero[0], ax
lea dx, numero
mov ah, 9
int 21h
jmp inicio

___________________________________________________________________________________
_____________

proc Random Range: DWORD ;get pseudo random namber


mov eax, [Range] ;[RandSeed] es variable global que se puede
cambiar
xor edx, edx ;para modificar el patron del random
imul edx,[RandSeed],08088405H ;08088405h una constante, algunas cifras se
pueden cambiar, otras no
inc edx
mov [RandSeed],edx
mul edx
mov eax, edx
ret
endp

___________________________________________________________________________________
_____________

.model small ; modelo de memoria pequero, 64k c�digo y datos.


.stack 100h ; reserva de memoria para pila
.data ; variables del segmento de datos
semilla1 dw 0 ; variable que contiene la primera semilla
semilla2 dw 0 ; variable que contiene la segunda semilla
valor dw 0 ; variable que contiene el valor devuelto valor =
Random(1)
multi dw 8405h ; variable utilizada para multiplicar.
.code ; segmento de c�digo
INICIO:
mov ax,@data
mov ds,ax
call RANDOMIZE ; llamar a RANDOMIZE
mov ax,1 ; llamar a RANDOM con argumento 1
push ax ; RANDOM(1) � guardar el argumento actual
call RANDOM ; LLAMAR A LA FUNCI�N RANDOM ;VALOR = RANDOM(1)
mov valor,ax
SALIR: ; (Finalizar el Programa)
mov ah,04ch
int 21h ; llamada al Sistema Operativo
proc RANDOMIZE near ; funci�n para inicializar semilla de nros. Aleatorios
mov ah,2Ch ; Funci�n del sistema operativo (lectura Tiempo
del Sistema)
int 21h ; llamada al Sistema- Servicio 2Ih
mov semilla1 , CX ; retorna (ch) hora : (cl) miminuto
mov semilla2 , DX ; retorna (dh) segundo : (dl) centesimas de segundo
ret ; Retornar al llamador
endp
proc RANDOM near ; funcion Random
call CALCULORND ; llamar a CALCULORND
xor ax,ax ; AX=0
mov bx,sp ; bx = la direcci�n del puntero de
pila
mov bx,ss:[bx+2] ; bx = el argumento actual (obtenido de
la pila)
or bx,bx ; bx = bx or bx, es cero?
je SALIDA ; Saltar a SALIDA: Si es igual a
Cero
xchg dx,ax ; intercambiar (dx,ax)
div bx ; dividir: ax = ax/bx
xchg dx,ax ; intercambiar (dx,ax)
SALIDA: ret 0002 ; retornar y liberar memoria asignado
; para el argumento
actual (en la pila)
endp
proc CALCULORND near ; funcion de calculo de RND
mov ax, semilla1 ; ax=semilla1
mov bx, semilla2 ; bx=semilla2
mov cx,ax ; cx=ax
mul multi ; multiplicar: dx:ax = ax * multi
shl cx,1 ; cx = cx / 2
add ch,cl ; ch = ch + cl
add dx,bx ; dx= dx + bx
shl bx,1 ; bx = bx / 2
add dh,bl ; dh = dh + bl
shl bx,cl ; bx = bx / cl
add bh,bl ; bh = bh + bl
add ax,0001 ; ax = ax+ 0001
add dx,0000 ; dx = dx + 0000
mov semilla1,ax ; semilla1 = ax
mov semilla2,dx ; semilla2 = dx
ret ; retornar al llamador
endp
end

También podría gustarte