Il 0% ha trovato utile questo documento (0 voti)
17 visualizzazioni9 pagine

L15b Primo Programma

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
17 visualizzazioni9 pagine

L15b Primo Programma

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 9

Primo programma

Argomento:
• Primo programma ARM

Architettura degli Elaboratori 2021 0


Esempio: primo programma

Spostare il contenuto di una serie di locazioni contigue di


memoria da una posizione ad un'altra (programma che copia
il contenuto di un array)

Architettura degli Elaboratori 2021 1


Esempio: inizio

.text
copy: LDR R1, =TABLE1 @ R1 punta a TABLE1
LDR R2, =TABLE2 @ R2 punta a TABLE2
LDR R0, [R1] @ carica il primo valore
STR R0, [R2] @ copia il primo valore
...

.data
TABLE1: ... @ array sorgente

.bss
TABLE2: ... @ array destinazione

Architettura degli Elaboratori 2021 2


Esempio: somma

• Bisogna ora continuare a copiare il secondo valore (… poi


dovremo preoccuparci anche degli elementi successivi):
copy: LDR R1, =TABLE1 @ R1 punta a TABLE1
LDR R2, =TABLE2 @ R2 punta a TABLE2
LDT R0, [R1] @ carica il primo valore
STR R0, [R2] @ copia il primo valore

ADD R1, R1, #4 @ R1 punta al successivo


ADD R2, R2, #4 @ R2 punta al successivo
LDR R0, [R1] @ carica il secondo valore
STR R0, [R2] @ ... e copialo
• Si sono incrementati i due puntatori alle tabelle (i registri R1 e
R2) della dimensione degli elementi (word da 4 byte)

Architettura degli Elaboratori 2021 3


Esempio: offset

• Si può inserire l'operazione di incremento dei puntatori nelle


istruzioni di LDR e STR, con l'indirizzamento a due componenti
(registro+offset immediato):

copy: LDR R1, =TABLE1 @ R1 punta a TABLE1


LDR R2, =TABLE2 @ R2 punta a TABLE2
LDR R0, [R1] @ carica il primo val.
STR R0, [R2] @ salva il primo valore
LDR R0, [R1, #4] @ carica il secondo val.
STR R0, [R2, #4] @ ... e copialo

• Usati i puntatori contenuti in R1 e R2, si è aggiunta ad essi la


dimensione dell'elemento (4) in modo che puntino al successivo (con
un'unica istruzione):
LDR R0, [R1, #4] @ R0  M[R1+4]
Architettura degli Elaboratori 2021 4
Esempio: pre-incremento

• I registri R1 e R2 puntano all'inizio delle rispettive tabelle; per


scorrerle tutte bisogna aumentare, ogni volta, gli offset (8,
12, 16, ...), oppure (meglio) si incrementano i puntatori R1 e
R2, usando l'indirizzamento con pre-incremento:

copy: LDR R1, =TABLE1 @ R1 punta a TABLE1


LDR R2, =TABLE2 @ R2 punta a TABLE2
LDR R0, [R1] @ carica il primo val.
STR R0, [R2] @ salva il primo valore
LDR R0, [R1, #4]! @ carica il secondo val.
STR R0, [R2, #4]! @ ... e copialo

• Il punto esclamativo comporta la pre-modifica del registro:


LDR R0, [R1, #4]! @ R1  R1+4, R0  M32[R1]

Architettura degli Elaboratori 2021 5


Esempio: post-incremento

• È possibile uniformare anche la prima operazione, usando


l'indirizzamento con post-incremento:

copy: ldr R1, =TABLE1 @ R1 punta a TABLE1


ldr R2, =TABLE2 @ R2 punta a TABLE2
loop: ldr R0, [R1], #4 @ carica dal 1° vettore
str R0, [R2], #4 @ salva nel 2° vettore
• Rispetto al caso precedente, R1 e R2 sono prima usati per
accedere agli operandi, e poi vengono incrementati di 4:
LDR R0, [R1], #4 @ R0M32[R1], R1R1+4
• Servono altre istruzioni per eseguire il loop il numero di volte
desiderato (istruzioni di confronto e di salto)

Architettura degli Elaboratori 2021 6


Completamento dell'esempio

• Supponiamo che l'array da copiare contenga 16 elementi:


le istruzioni scritte prima vanno eseguite ripetutamente
(loop) 16 volte; allo scopo si può utilizzare un registro (ad
es. R3) come contatore:
• vi si inserisce il valore iniziale 16,
• lo si decrementa di una unità ad ogni iterazione,
• con una instruzione di salto condizionato si riesegue il loop se il
contatore è diverso zero, altrimenti no:

Architettura degli Elaboratori 2021 7


Completamento dell'esempio (2)

MOV R3, #0x10 @ valore iniziale


@ contatore
copy: LDR R1, =TABLE1 @ R1 punta a TABLE1
LDR R2, =TABLE2 @ R2 punta a TABLE2
loop: LDR R0, [R1], #4 @ carica dal primo
@vetore
STR R0, [R2], #4 @ salva nel secondo
@ vettore
SUBS R3, R3, #1 @ decrementa il
@ contatore
BNE loop @ salta se non è zero

Architettura degli Elaboratori 2021 8

Potrebbero piacerti anche