Concetti Chiave

  • Il programma scambia gli indirizzi pari e dispari in un vettore e calcola le somme di questi elementi in due variabili distinte.
  • Le locazioni del vettore iniziano all'indirizzo 0x80, mentre l'esecuzione del programma inizia all'indirizzo 0xee00.
  • Le somme degli elementi pari e dispari vengono aggiornate in base al valore del bit meno significativo dell'accumulatore.
  • Un secondo vettore viene utilizzato per memorizzare gli elementi del primo vettore che sono seguiti da un elemento di valore inferiore.
  • Alla fine del programma, è presente un ciclo infinito che mantiene l'esecuzione attiva senza terminare.

1 ;2.asm

2 ;autore ghdp - soluzione minima

Descrizione del vettore

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

  1. Qual è l'obiettivo principale del programma descritto nel testo?
  2. L'obiettivo principale del programma è scambiare le locazioni di indirizzo pari con quelle di indirizzo dispari e calcolare le somme degli elementi di valore pari e dispari, memorizzandole in due variabili P e D.

  3. Come vengono gestiti gli elementi seguiti da un valore inferiore?
  4. Gli elementi che sono seguiti da un elemento di valore inferiore vengono spostati in un secondo vettore, come indicato nel testo.

  5. Quali sono le variabili utilizzate per memorizzare le somme degli elementi pari e dispari?
  6. Le somme degli elementi di valore pari e dispari sono memorizzate nelle variabili P e D, rispettivamente.

  7. Qual è la struttura del vettore iniziale utilizzato nel programma?
  8. Il vettore iniziale, definito all'indirizzo 0x80, contiene una serie di byte che rappresentano i valori da elaborare, come 60, 4, 5, 70, e così via.

  9. Quali istruzioni vengono utilizzate per il ciclo di scambio delle locazioni?
  10. Il ciclo di scambio delle locazioni utilizza le istruzioni LDA, STA, INC e DEC per manipolare i dati nel vettore, come descritto nel codice.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community