Prima di tutto, sono molto nuovo nell'assemblaggio 8086 ed è stato piuttosto difficile per me acquisire la conoscenza. Tuttavia, farò del mio meglio.Generazione di un numero casuale compreso tra 0 e 9 in x86 8086 Assemblaggio
Ho cercato di scrivere un codice per generare un numero casuale compreso tra 0 e 9. Dopo aver esaminato diversi esempi e suggerimenti, questo è quello che ho trovato. Non ho applicato alcuna funzione matematica sul conteggio degli orologi recuperati, per semplicità e inoltre ho pensato che non fosse necessario. Ho finito per, per qualche ragione, generare un numero certo come 6,7 volte in meno rispetto ai numeri come 1,3 e 9. Credo che sia perché sto prendendo l'ordine inferiore dei tick dell'orologio, dove i valori cambiano così rapidamente.
Il mio scopo è simulare un lancio di dadi che successivamente cambierà l'intervallo dei seguenti codici a 1-6. La mia domanda è, è sufficiente per il mio scopo? o c'è un modo migliore per farlo?
codici:
RANDGEN: ; generate a rand no using the system time
RANDSTART:
MOV AH, 00h ; interrupts to get system time
INT 1AH ; CX:DX now hold number of clock ticks since midnight
; lets just take the lower bits of DL for a start..
MOV BH, 57 ; set limit to 57 (ASCII for 9)
MOV AH, DL
CMP AH, BH ; compare with value in DL,
JA RANDSTART ; if more, regenerate. if not, continue...
MOV BH, 49 ; set limit to 48 (ASCII FOR 0)
MOV AH, DL
CMP AH, BH ; compare with value in DL
JB RANDSTART ; if less, regenerate.
; if not, this is what we need
mov ah, 2h ; call interrupt to display a value in DL
int 21h
RET
risposta, per @johnfound:
ho trovato la sua strada è più semplice, e richiede meno tempo per generare il numero casuale. Ha detto che questo funziona solo se hai bisogno di un solo numero casuale, o l'intervallo tra i numeri casuali include pause per l'input umano. In caso contrario, i numeri non saranno casuali (credo che a causa del seme temporale che inizialmente assumiamo non cambia). Va bene per il mio caso, dal momento che sto simulando un lancio di dadi, e ho bisogno dell'intervento dell'utente (un altro lancio) prima di eseguire nuovamente il codice.
RANDGEN: ; generate a rand no using the system time
RANDSTART:
MOV AH, 00h ; interrupts to get system time
INT 1AH ; CX:DX now hold number of clock ticks since midnight
mov ax, dx
xor dx, dx
mov cx, 10
div cx ; here dx contains the remainder of the division - from 0 to 9
add dl, '0' ; to ascii from '0' to '9'
mov ah, 2h ; call interrupt to display a value in DL
int 21h
RET
Quello che ha fatto: 1.We spostato valore nel DX AX 2.We cancellata DX. 3. Abbiamo spostato 10 dec a CX. 4. Abbiamo diviso AXE da CX quindi otteniamo un resto entro 0-9 Dec che è memorizzato in DX 5. Infine, abbiamo aggiunto ASCII '0' (dec 48) a DX per portarli in ASCII '0' a '9 '.
Vuoi l'output di essere nel range 1-10 (come suggerisce il titolo) oppure 0-255 (come la tua domanda suggerisce: * ... genera un numero casuale di un byte *)? E il codice sembra stia provando a fare un intervallo di '0' a' 9' in ASCII. – lurker
sì, come nel titolo, 0-9 per la precisione. – Raf