ELEMANIA
Z80 - Calcolo numeri primi
Calcolo numeri primi

Vediamo adesso un esempio riassuntivo un po' meno banale dei precedenti.

Il seguente programma calcola tutti i numeri primi compresi fra 2 e 255 e il visualizza sull'uscita di indirizzo 0:

            LD SP,0 ; azzera lo SP
            LD C,1 ; inizializza C col primo numero da testare meno 1

test:
            INC C ; incrementa il numero da testare
            JP Z, fine ; se zero, fine numeri (255+1 -> 0)

            CALL verifica ; chiama la funzione per il test di primalità

            CP 0 ; se la funzione torna 0
            JP Z, test ; il numero non è primo, si prova con un altro

            LD A,C ; il numero è primo
            OUT (0),A ; visualizza il numero
            JP test ; prosegue
fine:
            HALT    ; termine del programma

            ; **** SUBROUTINE VERIFICA DELLA PRIMALITA' DI UN NUMERO
verifica:
            push BC            ; salva sullo stack tutti i registri
            push DE
            push HL

            LD B,2 ; inizializza a 2 il divisore
ciclo:
            LD A,C ; ripristina il numero da testare
            CP B ; se B==A
            JP Z, primo ; il numero è primo

            CALL resto ; calcola il resto della divisione A/B

            CP 0 ; se il resto è zero
            JP Z, noprimo ; il numero non è primo
            INC B ; incrementa B
            JP ciclo ; ripeto il ciclo di verifica
primo:
            LD A,1
noprimo:
            POP HL            ; ripristina i registri dallo stack
            POP DE
            POP BC
            RET

            ; **** SUBROUTINE CHE CALCOLA IL RESTO DELLA DIVISIONE A/B

resto:
            SUB B           ; sottraggo B da A
            JP P, resto     ; finché non viene un risultato negativo
            ADD A,B         ; correggo aggiungendo B
            RET

Nell'esempio sono presenti due subroutine:

All'inizio della subroutine verifica si può osservare un tipico esempio di salvataggio di tutti i registri (tranne quelli coinvolti nel passaggio di valori fra chiamante e subroutine) sullo stack. Alla fine della subroutine il contenuto dei registri salvati viene ripristinato. Questo garantisce che eventuali modifiche nel contenuto dei registri fatte dalla funzione non si ripercuotano sul programma principale.

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it