Concetti Chiave
- Il programma in Assembler HC08 inizializza un array con una serie di valori e utilizza variabili per memorizzare gli indici del primo e dell'ultimo numero 60 trovato.
- Inizia l'esecuzione dal punto definito in memoria come STARTPGM, che è l'indirizzo di partenza del programma nella ROM.
- Utilizza un ciclo per scorrere l'array, confrontando ogni elemento con il numero 60 e aggiornando le variabili F e L con gli indici pertinenti.
- La variabile F viene incrementata quando viene trovato il primo 60, mentre L viene aggiornata con l'indirizzo dell'ultimo 60 identificato.
- Il programma termina con un loop infinito alla fine, una pratica comune nei programmi in assembly per indicare la fine dell'esecuzione.
1 ;2.asm
2;
3 ;Inizializzate un vettore ARRAY: 60,4,5,70,7,45,60,3,3,5,9,7,12,45,60,3 e le variabili
4 ; F: 0 e L:0. Con un ciclo, memorizzate in F l'indice del primo numero 60 trovato ed
5 ; in L l'indirizzo dell'ultimo numero 60 trovato.
6 ;
EE00 7 STARTPGM = 0xee00 ;L'inizio dell'ipotetica ROM (program counter)
FFFE 8 RESETVECT = 0xfffe ;La posizione del vettore di reset
0080 9 STARTDATI = 0x80 ; Inizio area dati
10 ;
11 .area DATI (ABS)
0080 12 .org STARTDATI
0080 13 VETT:
0080 3C 14 .byte 60 ; locazione 80h
0081 04 15 .byte 4
0082 05 16 .byte 5
0083 46 17 .byte 70
0084 07 18 .byte 7
0085 2D 19 .byte 45
0086 3C 20 .byte 60
0087 03 21 .byte 3
0088 03 22 .byte 3
0089 05 23 .byte 5
008A 09 24 .byte 9
008B 07 25 .byte 7
008C 0C 26 .byte 12
008D 2D 27 .byte 45
008E 3C 28 .byte 60
008F 03 29 .byte 3 ; locazione 8Fh
0090 00 30 F:.byte 0
0091 00 31 L:.byte 0
32 ;
33 .area PROGRAMMA (ABS)
EE00 34 .org STARTPGM
35
EE00 36 MAIN:
EE00 AE 80 37 LDX #VETT ;metto in X 0x80
EE02 38 LOOP:
EE02 51 90 18 39 CBEQX #0x90, FINE ; confronto X con il primo indirizzo oltre la sequenza da scrivere
40 ; se uguali salta a FINE
EE05 F6 41 LDA ,X ; metto in A l'elemento corrente puntato da X
EE06 41 3C 0E 42 CBEQA #60, UGUALE ; confronto A con 60
43 ; se uguali salta a UGUALE
EE09 C6 00 91 44 LDA L ; carica L in A
EE0C 41 00 03 45 CBEQA #0, ZERO ; confronto A con 0
46 ; se uguali (in L non c'era già un indirizzo salvato) salta a ZERO
EE0F 5C 47 INC X
EE10 20 F0 48 BRA LOOP ; altrimenti SALTA A LOOP senza incrementare l'indice
EE12 49 ZERO:
EE12 3C 90 50 INC F ; incrementa l'indice perché non è ancora stato trovato un 60
EE14 5C 51 INC X
EE15 20 EB 52 BRA LOOP ; torna a LOOP
EE17 53 UGUALE:
EE17 CF 00 91 54 STX L ; salva in F l'indirizzo del 60 trovato
EE1A 5C 55 INC X
EE1B 20 E5 56 BRA LOOP ; torna a LOOP
57 ;
EE1D 20 FE 58 FINE: BRA FINE ; loop infinito sull'ultima istruzione
59 ;
60 .area RESET (ABS)
FFFE 61 .org RESETVECT
FFFE EE 00 62 .word MAIN
63
ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Motorola 68HC08), page 1.
Symbol Table
2 F 0090 R
4 FINE EE1D R
2 L 0091 R
4 LOOP EE02 R
4 MAIN EE00 R
RESETVECT = FFFE
STARTDATI = 0080
STARTPGM = EE00
4 UGUALE EE17 R
2 VETT 0080 R
4 ZERO EE12 R
ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Motorola 68HC08), page 2.
Area Table
0 _CODE size 0 flags 0
1 DATI size 0 flags 8
2 DATI0 size 12 flags 8
3 PROGRAMMA size 0 flags 8
4 PROGRAMMA1 size 1F flags 8
5 RESET size 0 flags 8
6 RESET2 size 2 flags 8
Domande da interrogazione
- Qual è lo scopo principale del programma descritto nel testo?
- Dove inizia l'area dati nel programma?
- Come viene gestito il ciclo principale del programma?
- Cosa succede quando viene trovato un numero 60 nel vettore?
- Qual è la funzione della sezione RESET nel programma?
Il programma ha lo scopo di inizializzare un vettore e memorizzare l'indice del primo numero 60 trovato in F e l'indirizzo dell'ultimo numero 60 trovato in L.
L'area dati inizia all'indirizzo 0x80, come indicato dalla direttiva .org STARTDATI.
Il ciclo principale del programma è gestito tramite un loop che confronta gli elementi del vettore con il valore 60 e aggiorna le variabili F e L di conseguenza.
Quando viene trovato un numero 60, l'indirizzo corrente viene salvato in L, e se è il primo 60 trovato, l'indice viene salvato in F.
La sezione RESET definisce il vettore di reset, che punta all'indirizzo di inizio del programma principale, MAIN, all'indirizzo 0xee00.