Random
Este es el código del comando random
en DariOS. Se encarga de generar un número aleatorio, convertirlo a una cadena decimal y mostrarlo por pantalla.
Propósito
Generar un número pseudoaleatorio (sin reinicializar la semilla) y mostrarlo por pantalla como un número decimal.
Nota: Este comando no reinicia la semilla del generador de números aleatorios (no se usa
srand
), por lo tanto los mismos números se repiten cada vez que se reinicia el sistema operativo.
Lógica paso a paso
push ax
push bx
push cx
push dx
push si
- Se guardan los registros que se van a usar para no alterar su contenido en el contexto del sistema.
Generar número aleatorio
call _rand
mov bx, ax
- Llama a una función llamada
_rand
, que devuelve un número aleatorio enAX
. - Copia ese valor a
BX
para su posterior procesamiento (ya queAX
se reutilizará).
Preparar buffer para cadena
mov si, buffer_numero + 5
mov byte [si], 0
- Coloca un terminador nulo (
0
) al final del buffer de la cadena. - Inicializa
SI
para comenzar a construir la cadena de derecha a izquierda (de menor a mayor dígito).
Conversión del número a decimal ASCII
.convierte_digito:
xor dx, dx
mov ax, bx
mov cx, 10
div cx
add dl, '0'
dec si
mov [si], dl
mov bx, ax
cmp bx, 0
jne .convierte_digito
- Divide el número en
BX
por10
para obtener cada dígito en base decimal. - Convierte el resto (
DL
) a su representación ASCII ('0'
a'9'
). - Lo almacena en el buffer en orden inverso.
- Repite hasta que
BX
sea 0 (es decir, todos los dígitos han sido convertidos).
Imprimir el número
call imprimir_cadena
- Muestra el número convertido como cadena de texto, comenzando desde la posición
SI
.
Restaurar registros y finalizar
pop si
pop dx
pop cx
pop bx
pop ax
ret
- Restaura los registros y retorna el control al sistema.
Consideración sobre la aleatoriedad
- La función
_rand
utilizada aquí no reinicia la semilla cada vez que se llama. - Esto significa que los mismos valores aleatorios aparecerán en el mismo orden tras cada reinicio del sistema.
- Para que los números sean distintos entre ejecuciones, sería necesario implementar y llamar a una rutina
srand
con una semilla variable (como la hora actual).