Concetti Chiave
- Il programma scambia le locazioni di memoria di indirizzi pari con quelle di indirizzi dispari in un vettore.
- Calcola la somma degli elementi di valore pari e dispari, memorizzandole in variabili separate P e D.
- Copia in un secondo vettore gli elementi seguiti da un numero inferiore, utilizzando puntatori X1 e X2.
- Utilizza istruzioni di assembly per la gestione dei dati e l'elaborazione delle strutture di controllo.
- Implementa un ciclo infinito alla fine del programma per mantenere attivo il processo.
1 ;2.asm
2 ;autore ghdp - soluzione minima
3 ;Utilizzando il vettore di cui sopra, scambiate le locazioni di indirizzo pari con quelle di
4 ;indirizzo dispari e calcolate in due variabili P e D le somme degli elementi di valore pari
5 ; e quella degli elementi di valore dispari. Spostate in un secondo vettore tutti gli elementi
6 ; che sono seguiti da un elemento di valore inferiore.
7 ;
EE00 8 STARTPGM = 0xee00 ;L'inizio dell'ipotetica ROM (program counter)
FFFE 9 RESETVECT = 0xfffe ;La posizione del vettore di reset
0080 10 STARTDATI = 0x80 ; Inizio area dati
11 ;
12 .area DATI (ABS)
0080 13 .org STARTDATI
0080 14 VETT:
0080 3C 15 .byte 60 ; locazione 80h
0081 04 16 .byte 4
0082 05 17 .byte 5
0083 46 18 .byte 70
0084 07 19 .byte 7
0085 2D 20 .byte 45
0086 3C 21 .byte 60
0087 03 22 .byte 3
0088 03 23 .byte 3
0089 05 24 .byte 5
008A 09 25 .byte 9
008B 07 26 .byte 7
008C 0C 27 .byte 12
008D 2D 28 .byte 45
008E 3C 29 .byte 60
008F 03 30 .byte 3 ; locazione 8Fh
0090 00 31 P:.byte 0
0091 00 32 D:.byte 0
0092 33 UNO:
0092 01 34 .byte 1 ; usata per fare la AND con l'accumulatore per tst sul bit 0 (pari/dispari)
0093 35 PREC:
0093 00 36 .byte 0 ; usata per memorizzare il valore precedente
0094 37 X1:
0094 00 38 .byte 0 ; usata per puntare il primo vettore
0095 39 X2:
0095 00 40 .byte 0 ; usata per puntare il secondo vettore
0096 41 VETT2:
0096 00 42 .byte 0 ; locazione 96h
0097 00 43 .byte 0
0098 00 44 .byte 0
0099 00 45 .byte 0
009A 00 46 .byte 0
009B 00 47 .byte 0
009C 00 48 .byte 0
009D 00 49 .byte 0
009E 00 50 .byte 0
009F 00 51 .byte 0
00A0 00 52 .byte 0
00A1 00 53 .byte 0
00A2 00 54 .byte 0
00A3 00 55 .byte 0
00A4 00 56 .byte 0
00A5 00 57 .byte 0
58 ;
59 .area PROGRAMMA (ABS)
EE00 60 .org STARTPGM
61
EE00 62 MAIN:
EE00 AE 80 63 LDX #VETT ;metto in X 0x80
EE02 64 LOOP0:
EE02 51 90 10 65 CBEQX #0x90, DOPO ; confronto X con il primo indirizzo oltre la sequenza da scrivere
EE05 F6 66 LDA ,X ;sposta in a il byte puntato da X
EE06 C7 00 93 67 STA PREC
EE09 5C 68 INC X
EE0A F6 69 LDA ,X
EE0B 5A 70 DEC X
EE0C F7 71 STA ,X
EE0D 5C 72 INC X
EE0E C6 00 93 73 LDA PREC
EE11 F7 74 STA ,X
EE12 5C 75 INC X
EE13 20 ED 76 BRA LOOP0 ; fine del ciclo di scambio locazioni pari/dispari
EE15 77 DOPO:
EE15 A6 00 78 LDA #0
EE17 C7 00 93 79 STA PREC ; riazzero il precedente
EE1A AE 96 80 LDX #VETT2
EE1C CF 00 95 81 STX X2 ;inizializzo X2 con l'indirizzo del secondo vettore
EE1F AE 80 82 LDX #VETT ;metto in X 0x80
EE21 83 LOOP:
EE21 51 90 25 84 CBEQX #0x90, FINE ; confronto X con il primo indirizzo oltre la sequenza da scrivere
85 ; se uguali salta a FINE
EE24 F6 86 LDA ,X ;sposta in a il byte puntato da X
EE25 C1 00 93 87 CMP PREC ;confronta il corrente con il precedente (la prima volta contiene 0)
EE28 24 0C 88 BHS POI ; salta perchè non deve copiare nel secondo vettore
EE2A CF 00 94 89 STX X1 ; salva il valore di X
EE2D CE 00 95 90 LDX X2 ;Mette in X l'indirizzo corrente del secondo vettore
EE30 F7 91 STA ,X ; copia nel secondo vettore l'elemento corrente
EE31 3C 95 92 INC X2 ; incrementa il puntatore del secondo vettore
EE33 CE 00 94 93 LDX X1 ; ripristina X
EE36 94 POI:
EE36 C7 00 93 95 STA PREC; memorizzo il corrente come "nuovo" precedente
EE39 C4 00 92 96 AND UNO ; la AND con UNO azzera tutti i bit meno il bit 0 dell'accumulatore
EE3C 41 01 05 97 CBEQA #1, DISPARI ; salta a DISPARI se è a 1 il bit meno significativo
EE3F 3C 90 98 INC P ; incrementa i pari
EE41 5C 99 INC X ; incrementa il puntatore
EE42 20 DD 100 BRA LOOP
EE44 101 DISPARI:
EE44 3C 91 102 INC D ; incrementa i pari
EE46 5C 103 INC X ; incrementa il puntatore
EE47 20 D8 104 BRA LOOP
105
106 ;
EE49 20 FE 107 FINE: BRA FINE ; loop infinito sull'ultima istruzione
108 ;
109 .area RESET (ABS)
FFFE 110 .org RESETVECT
FFFE EE 00 111 .word MAIN
112
ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Motorola 68HC08), page 1.
Symbol Table
2 D 0091 R
4 DISPARI EE44 R
4 DOPO EE15 R
4 FINE EE49 R
4 LOOP EE21 R
4 LOOP0 EE02 R
4 MAIN EE00 R
2 P 0090 R
4 POI EE36 R
2 PREC 0093 R
RESETVECT = FFFE
STARTDATI = 0080
STARTPGM = EE00
2 UNO 0092 R
2 VETT 0080 R
2 VETT2 0096 R
2 X1 0094 R
2 X2 0095 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 26 flags 8
3 PROGRAMMA size 0 flags 8
4 PROGRAMMA1 size 4B flags 8
5 RESET size 0 flags 8
6 RESET2 size 2 flags 8
Domande da interrogazione
- Qual è l'obiettivo principale del programma descritto nel testo?
- Dove inizia l'esecuzione del programma?
- Come vengono calcolate le somme degli elementi pari e dispari?
- Qual è la funzione del secondo vettore nel programma?
- Come viene gestito il ciclo infinito alla fine del programma?
L'obiettivo principale del programma è scambiare le locazioni di indirizzo pari con quelle di indirizzo dispari in un vettore, calcolare le somme degli elementi di valore pari e dispari in due variabili separate (P e D), e spostare in un secondo vettore tutti gli elementi che sono seguiti da un elemento di valore inferiore.
L'esecuzione del programma inizia all'indirizzo 0xee00, che è definito come STARTPGM, l'inizio dell'ipotetica ROM.
Le somme degli elementi pari e dispari vengono calcolate incrementando le variabili P e D rispettivamente, a seconda che il bit meno significativo dell'accumulatore sia 0 (pari) o 1 (dispari).
Il secondo vettore viene utilizzato per memorizzare tutti gli elementi del primo vettore che sono seguiti da un elemento di valore inferiore.
Alla fine del programma, viene eseguito un loop infinito sull'istruzione FINE, che è un'istruzione di salto a se stessa (BRA FINE), mantenendo il programma in esecuzione senza terminare.