RANDOM IN ASSEMBLER??? COME FARE???? HELP ME!!

di il
1 risposte

RANDOM IN ASSEMBLER??? COME FARE???? HELP ME!!

Ho fatto un bel programmino in assembler un bel giochino il quale deve farti in dovinare un carattere che è immemoria con quello che inserisci tu!! una cavolata va...ma adesso volevo migliorarlo e la cosa più importante era come faccio a generare un numero random in assembler??? illuminatemi vi prego!!!!!

1 Risposte

  • Re: RANDOM IN ASSEMBLER??? COME FARE???? HELP ME!!

    Siccome sono corretto questa routine e tratta dal sito www.giobbe2000.i

    chiama questa routine
    mov ax,numero massimo da generare
    call random

    PUBLIC Random
    _prog SEGMENT BYTE PUBLIC 'CODE'
    ASSUME CS:_prog
    ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
    PrimoIN DB 00H ; Flag di prima esecuzione (= 0 si; <> 0 no)
    Rnd_Lo DW ? ; valore corrente a 32 bit del numero random
    Rnd_Hi DW ?
    Costante DW 8405H ; Valore del Moltiplicatore
    ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
    Random proc NEAR
    OR AX,AX ;¿Se il valore del range passato come parametro
    JNZ Rand_1 ;³Š nullo si impone la fine immediata della
    RET ;Ùprocedura (valore non corretto!!)

    Rand_1: PUSH BX ;¿
    PUSH CX ;³Salva i registri utilizzati dalla procedura
    PUSH DX ;³
    PUSH DI ;³
    PUSH DS ;Ù
    PUSH AX ;¿Salva il valore del range, passato in ingresso
    ;Ùcome parametro (verr… utilizzato alla fine..)
    LEA DI,PrimoIN ;¿Verifica se si tratta della prima chiamata
    CMP Byte Ptr CS:[DI],00H;³della procedura che genera il ritardo..
    JNE Rand_2 ;Ù.. e se NON Š cos calcola il nuovo valore

    ;¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    ;³³In pratica questo pezzo di programma ³
    ;³³implementa la procedura RANDOMIZE di TPascal³
    ;³ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    MOV AH,2CH ;³Se si tratta della prima chiamata la procedura
    INT 21H ;³provvede ad assumere un valore casuale dalla
    MOV CS:[Rnd_Lo],CX;³memoria CMOS che contiene il tempo corrente..
    MOV CS:[Rnd_Hi],DX;³Per ci• utilizza la Funzione DOS 2CH che lascia
    ;³in CH = Ore (0ö23)
    ;³in CL = Minuti (0ö59)
    ;³in DH = Secondi (0ö59)
    ;Ùin DL = Centesimi di secondi (0ö99)

    MOV Byte Ptr CS:[DI],01H;¿Modifica la flag di primo ingresso per evitare
    ;Ùdi ricaricare le variabili random iniziali

    ; ***** Indicazioni relative al primo giro *****
    Rand_2: MOV AX,CS:[Rnd_Lo]; AH=Ore (0ö23), AL=Minuti (0ö59)
    MOV BX,CS:[Rnd_Hi]; BH=Secondi (0ö59), BL=Centesimi (0ö99)
    MOV CX,AX ; CH=Ore (0ö23), CL=Minuti (0ö59)

    MUL CS:[Costante] ; AX*Costante=AX*8405H= DX,AX (numero a 32 bit)

    SHL CX,1 ;¿
    SHL CX,1 ;³
    SHL CX,1 ;³
    ADD CH,CL ;³
    ADD DX,CX ;³
    ADD DX,BX ;³
    SHL BX,1 ;³Algoritmo di scambio
    SHL BX,1 ;³
    ADD DX,BX ;³
    ADD DH,BL ;³
    MOV CL,5 ;³
    SHL BX,CL ;³
    ADD AX,1 ;³
    ADC DX,0 ;Ù

    MOV CS:[Rnd_Lo],AX;¿Salva il risultato a 32 bit della manipolazione
    MOV CS:[Rnd_Hi],DX;Ùnelle variabili a ci• destinate

    POP BX ;¿Recupera in BX il valore del range, passato in
    ;Ùingresso, in AX
    XOR AX,AX ;¿Prepara il dividendo a 32 bit forzando a zero
    XCHG AX,DX ;³i 16 bit pi— significativi e copiando nei 16
    ;Ùbit bassi il valore corrente di DX
    DIV BX ;¿AX = quoziente (DX,AX / BX)
    ;ÙDX = resto
    XCHG AX,DX ;¿il numero random corrente Š il valore del resto
    ;Ùed Š lasciato, in uscita, in AX
    POP DS ;¿
    POP DI ;³Recupera i registri utilizzati dalla procedura
    POP DX ;³
    POP CX ;³
    POP BX ;Ù
    RET
    Random ENDP
    _prog ENDS
    END
    se ti serve altro aiuto vai su www.giobbe2000.i
    e il miglio sito di assembler che abbiano mai fatto.
    spero di esserti stato d'aiuto
    saluti smalldragon
Devi accedere o registrarti per scrivere nel forum
1 risposte