Skip to main content

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.

random


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 en AX.
  • Copia ese valor a BX para su posterior procesamiento (ya que AX 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 por 10 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).