2013-07-25 14 views
5

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 '.

+0

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

+0

sì, come nel titolo, 0-9 per la precisione. – Raf

risposta

6

Questo trucco funziona solo se è necessario un solo numero casuale o l'intervallo tra i numeri casuali include le pause per input umano. In tutti gli altri casi, i numeri non saranno casuali.

Se sono necessari molti numeri casuali, sono disponibili diversi algoritmi di numeri pseudo-casuali.

Un'altra nota è che non è il modo più semplice per ottenere il numero nell'intervallo necessaria:

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' 

È possibile utilizzare questo metodo per ogni generatore di numeri casuali, naturalmente.

+0

Ho provato il tuo codice e funziona perfettamente. Ci è voluto meno tempo per generare un confronto con il mio.Ma non capisco completamente alcune cose. 1. xor dx, dx - qual è lo scopo di questo? 2. aggiungi dl, '0' - Come aggiungendo '0' a DL stiamo effettivamente ottenendo il valore ASCII da 0-9? – Raf

+0

Non stiamo aggiungendo 0 (zero) a dl, ma il codice ascii del carattere "0" = 30h = 48. In questo modo, il numero in DL (da 0 a 9) verrà convertito da 30h a 39h che sono il caratteri da "0" a "9". qualcosa xo qualcosa = 0 sempre. – johnfound

+0

vedo, quindi cosa abbiamo fatto: 1. Abbiamo spostato il valore in DX in AX 2. Abbiamo cancellato DX. 3. Abbiamo spostato 10 dec a CX. 4. Abbiamo diviso AX by 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' . OK, grazie – Raf

0

Ho trovato un opcode più piccolo, AAM - Ascii Adjust for Multiplication, per questo lavoro. Come questo lavoro codice operativo:

AH := AL/10 
AL := AL mod 10 

Quindi, sarà questo:

mov al, dl 
aam 
add al, '0' 
mov dl, al 
Problemi correlati