nikpez
Ominide
2 min. di lettura
Vota 3 / 5

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.
Assembler HC08 e Array

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

  1. Qual è lo scopo principale del programma descritto nel testo?
  2. 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.

  3. Dove inizia l'area dati nel programma?
  4. L'area dati inizia all'indirizzo 0x80, come indicato dalla direttiva .org STARTDATI.

  5. Come viene gestito il ciclo principale del programma?
  6. 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.

  7. Cosa succede quando viene trovato un numero 60 nel vettore?
  8. 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.

  9. Qual è la funzione della sezione RESET nel programma?
  10. La sezione RESET definisce il vettore di reset, che punta all'indirizzo di inizio del programma principale, MAIN, all'indirizzo 0xee00.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community