Sei sulla pagina 1di 27

ARM: le istruzioni assembly

03.b

C. Fantozzi, A. Gardich
(revisione di S. Congiu)

Struttura programma assembly


La forma generale delle linee di codice assembly :

52

label:<sp>istruzione<sp>operandi<sp>@commento Ogni cam o deve essere se arato da uno o i! s azi " la#el devono iniziare dal rimo carattere della riga Le istruzioni non cominciano mai dal rimo carattere della riga: devono essere recedute da almeno $ s azio %utti e tre le sezioni ... : ... & ... sono o zionali 'sistono inoltre: ( direttive er l)assem#latore ( seudo*istruzioni
Arc itettura degli !laboratori " 2013

#iretti$e per l%assemblatore


diretti$e: sono comandi er l+assem#latore, non er il rocessore

52

, .te&t s eci-ica la sezione contenente il codice esegui#ile , .data s eci-ica la sezione contenente dati inizializzati , .bss s eci-ica la sezione contenente dati non inizializzati , .end s eci-ica la -ine del modulo sorgente , .global de-inisce sim#oli visi#ili al di -uori del modulo stesso: utile er collegare i! moduli (lin.ing) , .long .s ort .byte de-iniscono costanti (es. in .data) , .ascii de-inisce una stringa , .lcomm .comm .s'ip de-iniscono aree di mem. non inizializzate (locali al modulo, o visi#ili da altri moduli)

Arc itettura degli !laboratori

" 2013

!sempio di file .s
Label
_start: mov r0, #0x100 ciclo: subs r0, r0, #1 bne ciclo @ Inizia il programma .text .global _start

52

Istruzione

ldr pc, =0x112C

@ esce al sistema

.data maschera: .long 0xAAAAAAAA stringa: .ascii "Pippo" .bss .lcomm spazio, 100 .end
Arc itettura degli !laboratori

Direttiva

Sezione

" 2013

)lassi di indirizzamento
Modo 1: er istruzioni di elaborazione dati ( ADC, ADD, AND, BIC, CMN, CMP, EOR, MOV, MVN, ORR, RSB, RSC, SBC, SUB, TEQ, TST Modo 2: er *oad+Store di ,ord o unsigned byte ( LDR, LDRB, STR, STRB Modo 3: er *+S di alf,ord o signed byte ( LDRH, LDRSB, LDRSH, STRH Modo (: er *+S di registri multipli ( LDMxx, STMxx

52

Arc itettura degli !laboratori

" 2013

Modo 1 -indirizz. per elab. dati.


sintassi: <istruzione3op> Rd, Rn, <shifter_operand> <istruzione2op> Rd, <shifter_operand> <shifter_operand> u/ essere: ( un valore immediato /0$alore1 ( un registro Rm ( un registro, do o scorrimento s eci-icato con: * un valore immediato Rm2 0sop1 /0s ift3imm1 * un registro Rm2 0sop1 Rs ( gli o eratori 0sop1 dis oni#ili sono: ASR2 LSL2 LSR2 ROR2 RRX
Arc itettura degli !laboratori

52

" 2013

Modo 1: esempi
mo$ R02 /0 add R32 R32 /1 cmp R72 /1000 bic R92 R:2 /0&ff00 mo$ R22 R0 add R(2 R32 R2 mo$ R22 R02 *S* /2 add R92 R52 R52 *S* /3 sub R92 R52 R52 ASR /3 rsb R92 R52 R52 ASR /3 mo$ R52 R32 RR> mo$ R72 R(2 R?R R3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 R0 0 R3 R361 cc -R781000. R9 R: and not 0&ff00 R2 R0 R( R36R2 R2 R0;( R9 R56R5;: < R5;9 R9 R58R5=: R9 R5=:8R5 R5 R3 ruotato esteso a destra di una posiz. R7 R( ruotato a destra di R3 posizioni

52

Arc itettura degli !laboratori

" 2013

Modo 2 -indirizz. per @ord o uns. Ayte.

sintassi: LDR|STR{B} Rd, <addressing_mode2> 52 <addressing_mode2> un indirizzamento indiretto con registro BRnC, che u/ avere una delle seguenti -orme: ( o--set immediato ( o--set da registro ( o--set da registro scalato ( ( ( ( ( ( re*incremento immediato re*incremento da registro re*incremento da registro scalato ost*incremento immediato ost*incremento da registro ost*incremento da registro scalato
" 2013

Arc itettura degli !laboratori

Modo 2: offset
O--set immediato ( BRn2 /D0offset3121C O--set da registro ( BRn2 DRmC

& 0d 120n 3 4o--set5$678

52

& 0d 120n 3 0m8

O--set da registro scalato ( BRn2 DRm2 0sop1 /0s ift3imm1C

& 0d 120n 3 (0m 4so 7 9 4shi-t5imm7)8


" 2013

Arc itettura degli !laboratori

Modo 2: preE preEincremento


:re*incremento immediato ( BRn2 /D0offset3121CF & 0n 0n 3 4o--set5$67 & 0d 120n8 :re*incremento da registro ( BRn2 DRmCF & 0n 0n 3 0m & 0d 120n8 :re*incremento da registro scalato ( BRn2 DRm2 0sop1 /0s ift3imm1CF & 0n 0n 3 (0m 4so 7 9 4shi-t5imm7) & 0d 120n8
Arc itettura degli !laboratori

52

" 2013

Modo 2: postE postEincremento


:ost*incremento immediato ( BRnC2 /D0offset3121 & 0d 120n8 & 0n 0n 3 4o--set5$67 :ost*incremento da registro ( BRnC2 DRm & 0d 120n8 & 0n 0n 3 0m :ost*incremento da registro scalato ( BRnC2 DRm2 0sop1 /0s ift3imm1 & 0d 120n8 & 0n 0n 3 (0m 4so 7 9 4shi-t5imm7)
Arc itettura degli !laboratori

10

52

" 2013

Modo 2: esempi
ldr R2, [R0] ldr R1, [R0,#4] ldr R1, [R0], #8 @ R2 M32[R0] @ R1 M32[R0+4] @ R1 M32[R0] @ R0 R0+8

11

52

ldr PC, [PC, R0, LSL #2]@ PC M32[PC+R0*4] strb R7, [R9], #1 @ M8[R9] R7B @ R9 R9+1 @ R0 R0+4 @ M32[R0] R5
" 2013

str R5, [R0,#4]!

Arc itettura degli !laboratori

Modo 3 -ind. per Galf@ord=signed Ayte.


sintassi: STR|LDR[H] Rd, <addressing_mode3> LDR[SH|SB] Rd, <addressing_mode3> <addressing_mode3> u/ essere: ( o--set immediato ( o--set da registro ( ( ( ( re*incremento immediato re*incremento da registro ost*incremento immediato ost*incremento da registro di--erenze ris etto al 1odo 6: - non si ossono scalare i registri - gli o--set immediati sono a soli ;#it
Arc itettura degli !laboratori

12

52

" 2013

Modo 2 e modo 3: tabella riassunti$a


*#R 1odo 6 1odo < 1odo < 1odo < 1odo 6 SHR 1odo 6 * 1odo < * 1odo 6

13

@ SG G SA A

52

I?HA A!I!: non a senso parlare di SH?R! per JuantitK con segno2 perc L non c) alcuna estensione del segno da e--ettuare
Arc itettura degli !laboratori " 2013

Modo ( -ind. per load=store multiplo.


sintassi: LDM|STM <addressing_mode4> Rn{!}, <registers>

1(

<addressing_mode4> u/ essere: ( MA increment after


, start5addr = 0n > end5addr = 0n ? 9regs@A * A

52

( MA increment before
, start5addr = 0n ? A > end5addr = 0n ? 9regs@A

( #A decrement after
, start5addr = 0n * 9regs@A ? A > end5addr = 0n

( #A decrement before
, start5addr = 0n * 9regs@A > end5addr = 0n B A (9regs il numero di registri indicati in <registers>) !

rovoca l+aggiornamento del registro 0n: al suo contenuto viene sommata o sottratta la CuantitD 9regs@A
Arc itettura degli !laboratori " 2013

Modo ( -ind. per load=store multiplo.


sintassi: LDM|STM <addressing_mode4> Rn{!}, <registers> <registers> la lista di registri da salvareEcaricare, racchiusa tra arentesi gra--e FGHI e con gli elementi se arati da virgola.
esem i: SHM#A SNF2 OR0ER7P & salva sullo stac. i registri & da 0J a 0K *#MMA SNF2 OR0ER7P & ricarica 0J*0K salvati & dall)istruzione recedente *#M#A R92 OR12R3ER5P & carica i registri 0$, 0<*0L & da 1<620M*$68.. 1<620M8

15

52

Arc itettura degli !laboratori

" 2013

)lassificazione delle istruzioni


!laborazione di dati ( operazioni aritmetic e e logic e: ANC, ANN, AON, P"C, 'O0, O00, 0SP, 0SC, SPC, SQP ( mo$imento tra registri: 1OR, 1RO ( confronto: C1O, C1:, %'S, %S% Accesso alla memoria ( load=store tra memoria e registri: LN0, LN0P, S%0, S%0P, LN0T, LN0SP, LN0ST, S%0T, LN1UU, S%1UU )ontrollo del flusso ( branc : P, Pcc
Arc itettura degli !laboratori

14

52

" 2013

Mstruzioni di elaborazione di dati


Sueste istruzioni usano la classe di indirizzamento modo $

17

52 0egole er le istruzioni di ela#orazione di dati: (tre o erandi: due sorgente, uno destinazione (tutti gli o erandi sono a <6 #it, sia registri che costanti (il risultato anch+esso a <6 #it ed osto in un registro

'sem i: add r0, r1, r2 add r0, r0, r0

@ r0 = r1 + r2 @ r0 = r0 + r0 = 2*r0

Arc itettura degli !laboratori

" 2013

Mstruzioni aritmetic e
Addizione: ADD{<cond>} Rd, Rn, <addr_mode1> Sottrazione: SUB{<cond>} Rd, Rn, <addr_mode1> RSB{<cond>} Rd, Rn, <addr_mode1> Moltiplicazione: MUL{<cond>} Rd, Rn, Rs
(attenzione: MUL ha solo operandi nei registri)

1:

52

Oessuna istruzione er le divisioniV


vanno eseguite via so-tWare (sottrazioni ri etute)> SN"R e QN"R resenti solo nei CorteU 0 e 1.
Arc itettura degli !laboratori " 2013

Mstruzioni aritmetic e: esempi


add r02 r12 r2 adc r02 r12 r2 sub r02 r12 r2 sbc r02 r12 r2 rsb r02 r12 r2 rsc r02 r12 r2 & rJ = r$ ? r6 & rJ = r$ ? r6 ? C & rJ = r$ B r6 & rJ = r$ * r6 ? C B $ & rJ = r6 * r$ & rJ = r6 * r$ ? C B $

19

52

rsb sta er reverse su#traction C il carrX #it del C:S0 er im ostare i #it di condizione in #ase al risultato occorre aggiungere il su--isso s al sim#olo o erativo
Arc itettura degli !laboratori " 2013

ADD2 SUB2 MUL: esempi


A## R02 R02 /1 A## R02 R02 /E1 A##S R02 R02 /E1 A## SQA SQA MQ* & 0J=0J?$ & 0J=0J*$ & 0J=0J*$ e aggiorna i #it & di stato (utile nei cicli) R02 R12 R22 ASR /2 & 0J=0$?06EA R02 R02 /1 & di nuovo 0J=0J*$ N)2 *R2 /( & ritorno da interruzione R02 R12 R2 & 0J=0$@06

20

52

Arc itettura degli !laboratori

" 2013

Mstruzioni logic e
AI# logico: AND{<cond>} Rd, Rn, <addr_mode1> ?R logico: ORR{<cond>} Rd, Rn, <addr_mode1> ?R esclusi$o: EOR{<cond>} Rd, Rn, <addr_mode1> Ait )lear (Rd=Rn AND NOT <addr_mode1>): BIC{<cond>} Rd, Rn, <addr_mode1>
Arc itettura degli !laboratori

21

52

" 2013

Mstruzioni logic e: esempi


and r02 r12 r2 orr r02 r12 r2 eor r02 r12 r2 bic r02 r12 r2 & rJ = r$ and r6 & rJ = r$ or r6 & rJ = r$ Uor r6 & rJ = r$ and not r6

22

52

bic sta er #it clear : ogni #it $ nel secondo o erando -a azzerare il corris ondente #it nel rimo.
Arc itettura degli !laboratori " 2013

AND2 ORR2 EOR2 BIC: esempi


AI# R02 R12 R2 AI# R02 R12 /0&7 ?RR R02 R02 R1 !?R R02 R12 /0&R !?R R02 R02 R0 AM) R02 R12 R2 & 0J=0$ AON 06 & estrae da 0$ i < #it meno & signi-icativi e li one in 0J & 0J=0J O0 0$ & 0J=0$ YO0 $Z & 0J=J & 0J=0$ AON OO% 06

23

52

e il I?HS si u/ usare MTI: MTI R12 R0 MTI R02 R0


Arc itettura degli !laboratori

& 0$=OO% 0J & nega i #it di 0J


" 2013

Mo$e -MOV.
Muo$e un $alore tra registri o carica un $alore immediato espresso con 12 bit -imm312<c3:112;r3(. MOV{<cond>} Rd, <addr_mode1> M?T M?T M?T M?T M?T M?T M?T R02 R12 R22 R32 R32 R12 N)2 /0 /0&RR00 R1 R12 *S* /2 R12 ASR /1 R12 R?R R2 *R & 0J=J & 0$=ZL6;J & 06=0$ & 0<=0$@A & 0<=0$E6 & 0$ ruotato a destra di 06 #it & ritorno da su#routine

2(

52

Arc itettura degli !laboratori

" 2013

Mo$imento tra registri: esempi


mo$ r02 r2 m$n r02 r2 & rJ := r6 & rJ := not r6

25

52

m$n sta er move negated

Arc itettura degli !laboratori

" 2013

Mstruzioni di confronto
)ompare: aggiorna #it di stato in #ase al risultato di Rn E <addr_mode1>: CMP{<cond>} Rn, <addr_mode1> Hest: aggiorna #it di stato in #ase al risultato di Rn AND <addr_mode1>: TST{<cond>} Rn, <addr_mode1> Hest !Jui$alence: aggiorna #it di stato in #ase al risultato di Rn XOR <addr_mode1>: TEQ{<cond>} Rn, <addr_mode1>
Arc itettura degli !laboratori

24

52

" 2013

?perazioni di confronto: esempi


cmp r12 r2 cmn r12 r2 tst r12 r2 teJ r12 r2 & set cc & set cc & set cc & set cc on on on on r$ B r6 r$ ? r6 r$ and r6 r$ Uor r6

27

52

" risultati delle o erazioni (*, ?, and, Uor) non sono salvati in alcun registro> Solo i #it di condizione (cc) del CPSR sono modi-icati da Cueste istruzioni.

Arc itettura degli !laboratori

" 2013

Accesso alla memoria -load=store.


Sueste istruzioni usano gli indirizzamenti modo 6 e <

2:

52

*oad : nel registro destinazione viene caricato il contenuto della locazione di memoria indicata dal modo di indirizzamento ldr r0, [r1] @ r0 M32[r1] Store : il contenuto del registro destinazione viene salvato nella locazione di memoria indicata dal modo di indirizzamento str r0, [r1] @ M32[r1] r0

Arc itettura degli !laboratori

" 2013

Mstruzioni load=store E 2
ldr Rd20addr3mode21
risultato di 0addr3mode1 AAAA AAAA memoria

29

str Rn20addr3mode21
52
risultato di 0addr3mode1 AAAA AAAA memoria

1
AAAA AAAA #### ####

1 AAAA AAAA #### ####

Rd

#### ####

Rn

#### ####

Arc itettura degli !laboratori

" 2013

Mstruzione load -LDR.


Carica un Word da memoria nel registro Rd LDR{<cond>}Rd, <addr_mode2>

30

52

Carica in Rd16/8 un hal-WordE#Xte con zero adding LDR{<cond>}H Rd, <addr_mode3> LDR{<cond>}B Rd, <addr_mode2> Carica un hal-WordE#Xte con estensione del segno LDR{<cond>}SH Rd, <addr_mode3> LDR{<cond>}SB Rd, <addr_mode3>
Arc itettura degli !laboratori " 2013

*#R: esempi
LDR LDRB R0, [R1] R0, [R1] @ r0 M32[r1] @ r0 M8[r1] @ r0 ext32(M16[r1]) @ r0 M32[r1-8] @ r0 M32[r1+r2]

31

52

LDRSH R0, [R1] LDR LDR R0, [R1,#-8] R0, [R1,R2]

Arc itettura degli !laboratori

" 2013

)aricare un $alore immediato


Ion esiste un)istruzione er caricare in un registro un valore immediato ar#itrarioV Nue ossi#ili soluzioni: ( Caricare un valore immediato valido con MOV e oi ottenere Cuello voluto con somme e shi-t> ( Qsare la seudo istruzione LDR Rd, =numero !sempio: *#R R02 <0&(7A0
Arc itettura degli !laboratori

32

52

" 2013

Nseudoistruzione di estensione di ldr

33

La seudo istruzione ldr (estensione di ldr) : ldr rn, = valore 52 [ l+assem#latore es ande la seudo istruzione, ovvero la realizza tramite una o i! istruzioni assem#lX e aree di su orto: [ viene creato un dato ausiliario, in un luogo FsicuroI nelle vicinanze dell)istruzione, contenente il valore da caricare e vi si accede tramite un indirizzamento relativo al :C
pc pc6( pc6: pc612 pc614
ldr r02<0&(7A0

ldr r02 Bpc2 /:C

... ... b ... 0&0000(7A0 Bpc2 /:C -pc6:.6/: < pc614

Arc itettura degli !laboratori

" 2013

)aricare un indirizzo: ADR


S esso utile caricare in un registro un indirizzo de-inito da un label si u/ usare la seudo istruzione: ADR Rd, <label> 'sem io: caricare in 0J l)indirizzo pippo al Cuale inizia un arraX da ela#orare: A#R R02 pippo

3(

52

Arc itettura degli !laboratori

" 2013

)aricare un indirizzo: ADR2 LDR


er inserire in un registro un untatore ci sono due ossi#ilitD: $. si usa la seudo istruzione adr, che ermette di caricare in un registro l+indirizzo identi-icato da un la#el, urch\ tale la#el si trovi nello stesso segmento del codice (segmento teUt )> 6. si usa la seudo istruzione che estende l+istruzione ldr, che ermette di caricare in un registro l+indirizzo identi-icato da un la#el ovunCue Cuesto sia de-inito (teUt, data, #ss)
Arc itettura degli !laboratori

35

52

" 2013

Nseudo istruzione adr


La sintassi della seudo istruzione adr : adr Rd, label

34

52

L)assem#latore es ande la seudo istruzione sostituendola con una istruzione add, che somma al :C la distanza (o--set) dell)indirizzo la#el: add Rd, pc, #offset 'sem io:
pc pc6( pc6: pippo: pc612 R0 pippo R1
Arc itettura degli !laboratori

adr r02 pippo ldr r12 Br0C

add r02 pc2 /(

#### ####

-pc2 /( -pc6:.6/( < pc612.

#### ####
" 2013

Store -STR.
Salva Rn in un Word di memoria STR{<cond>}Rn, <addr_mode2> Salva Rn16/8 in un hal-WordE#Xte di memoria STR{<cond>}H Rn, <addr_mode3> STR{<cond>}B Rn, <addr_mode2>

37

52

Salva un hal-WordE#Xte con estensione del segno: non c)> non ha senso estendere il segno in memoria
Arc itettura degli !laboratori " 2013

STR: esempi
SHR R02 BR12 /(CF SHR R02 BR1C2 /( SHRA R02 BR12 ER2C SHRG R02 BR12 /:C & preincremento: 0$=0$?A, & oi 1<620$8 0J & postincremento: & 1<620$8 0J, oi 0$=0$?A & offset da registro: & 1;20$*068 0JP & offset immediato: & 1$;20$?;8 0J]

3:

52

Arc itettura degli !laboratori

" 2013

*oad=store multipli: LDM=STM


Sueste istruzioni usano l)indirizzamento modo A LDM<xx> Rn{!}, {lista registri}

39

52

carica un insieme di registri da memoria a artire da 1<62Rn8 STM<xx> Rn{!}, {lista registri} salva un insieme di registri in memoria (da 1<62Rn8) <xx> indica come aggiornare Rn:
, IB: "ncrement Pe-ore , IA: "ncrement A-ter , DB: Necrement Pe-ore , DA: Necrement A-ter
Arc itettura degli !laboratori " 2013

LDM=STM e lo stac'
A ti i di stac.: FA2 FD2 EA2 ED F E A D = full: SP unta all)ultimo elemento usato = empty: SP unta al rimo elemento li#ero = ascending: SP cresce con ush sullo stac. = descending: SP decresce con ush sullo stac.
LN1"P = LN1'N LN1"A = LN1FN LN1NP = LN1'A LN1NA = LN1FA
Arc itettura degli !laboratori

(0

52

valgono le seguenti eCuivalenze:


S%1"P = S%1FA S%1"A = S%1'A S%1NP = S%1FN S%1NA = S%1'N
" 2013

LDM=STM: esempi di accesso allo stac'


Ni solito si usa Rn < R13 < SP Oella convenzione usata nel :N<6 lo stac. ointer [ unta all)ultimo elemento inserito (R) [ cresce er indirizzi decrescenti (#): SHMR# SNF2 OR0ER7P *#MR# SNF2 OR0ER7P & salva sullo stac. i registri & da 0J a 0K (come S%1NP) & ricarica 0J*0K salvati & dall)istruzione recedente & (come LN1"A)

(1

52

*#M#A R122 OR122SN2N)P & carica i registri 0$6, S:, :C & con 1<620$6*$68, 1<620$6*;8, & e 1<620$6*A8
Arc itettura degli !laboratori " 2013

!sempio: primo programma


Si costruisce ora un rimo rogramma in linguaggio assem#lX er rocessori A01: Si voglia s ostare il contenuto di una serie di locazioni contigue di memoria da una osizione ad un)altra ( rogramma che co ia il contenuto di un arraX copy: adr R12 HAA*!1 adr R22 HAA*!2 ldr R02 BR1C str R02 BR2C ... ... HAA*!1: ... ... HAA*!2: ... & 0$ unta a %APL'$ & 06 unta a %APL'6 & carica il rimo valore & co ia il rimo valore & arraX sorgente & arraX destinazione

(2

52

Arc itettura degli !laboratori

" 2013

!sempio: somma
Pisogna ora continuare a co iare gli elementi successivi: copy: adr R12 HAA*!1 adr R22 HAA*!2 ldr R02 BR1C str R02 BR2C add R12 R12 /( add R22 R22 /( ldr R02 BR1C str R02 BR2C & 0$ unta a %APL'$ & 06 unta a %APL'6 & carica il rimo valore & co ia il rimo valore & 0$ unta al successivo & 06 unta al successivo & carica il secondo valore & ... e co ialo

(3

52

Si sono incrementati i due untatori alle ta#elle (i registri R1 e R2) della dimensione degli elementi (Word da A #Xte)
Arc itettura degli !laboratori " 2013

!sempio: offset
^ ossi#ile conglo#are l+o erazione di incremento dei untatori nelle istruzioni di load e store, usando lindirizzamento a due com onenti (registro?o--set immediato): copy: adr R12 HAA*!1 & 0$ unta a %APL'$ adr R22 HAA*!2 & 06 unta a %APL'6 ldr R02 BR1C & carica il rimo val. str R02 BR2C & salva il rimo valore ldr R02 BR12 /(C & carica il secondo val. str R02 BR22 /(C & ... e co ialo Qsati i untatori contenuti in R1 e R2, si aggiunta ad essi la dimensione dell)elemento (A) in modo che untino al successivo (con un)unica istruzione): ldr R02 BR12 /(C & 0J 1<620$?A8
Arc itettura degli !laboratori

((

52

" 2013

!sempio: preE preEincremento


Oell+ultima versione del rogramma i registri R1 e R2 continuano a untare all+inizio delle ris ettive ta#elle> er scorrerle tutte #isogna aumentare, ogni volta, gli o--set (;, $6, $Z, ...), o ure (meglio) si incrementano i untatori R1 e R2, usando l)indirizzamento con re*incremento: copy: adr R12 HAA*!1 & 0$ unta a %APL'$ adr R22 HAA*!2 & 06 unta a %APL'6 ldr R02 BR1C & carica il rimo valore str R02 BR2C & salva il rimo valore ldr R02 BR12 /(CF &carica il secondo val. str R02 BR22 /(CF & ... e co ialo

(5

52

loop:

"l unto esclamativo com orta la re*modi-ica del registro: ldr R02 BR12 /(CF & 0$ 0$?A, 0J 1<620$8
Arc itettura degli !laboratori " 2013

!sempio: postE postEincremento


:er scorrere tutta la ta#ella #asta ri etere invariate le ultime due istruzioni> co iato il rimo elemento, si u/ rocedere (loo ) con i successivi. ossi#ile uni-ormare anche la rima o erazione, usando l+indirizzamento con ost*incremento: copy: loop: adr R12 HAA*!1 adr R22 HAA*!2 ldr R02 BR1C2 /( str R02 BR2C2 /( & 0$ unta a %APL'$ & 06 unta a %APL'6 & carica dal $.mo vettore & salva nel 6.ndo vettore

(4

52

0is etto al caso recedente, R1 e R2 sono rima usati er accedere agli o erandi, e oi vengono incrementati di A: ldr R02 BR1C2 /( & 0J1<620$8, 0$0$?A Servono altre istruzioni er eseguire il loo il numero di volte desiderato (istruzioni di con-ronto e di salto)
Arc itettura degli !laboratori " 2013

Mstruzioni di controllo del flusso -salto.


Salto: B{<cond>} <indirizzo> Salto a su#routine (salva PC in LR): BL{<cond>} <indirizzo>
L)indirizzamento di ti o auto*relativo: 3<61P dalla osizione attuale

(7

52

Chiamata a sistema (interruzione sW): SWI{<cond>} <immed_24>

Arc itettura degli !laboratori

" 2013

Mstruzioni di salto: esempi


A (#ranch incondizionato) ( B <indirizzo> @ PCindirizzo A* (#ranch and lin. incondizionato) ( BL <indirizzo> @ LRPC-4, PCindirizzo

(:

52

label1: cont: label2:

b label1 ... bl label2 ... ... ... mo$ N)2 *R

& salta a la#el$ & salta e salva il :C & continua il rogramma & -a Cualcosa (su#routine) & torna a cont
" 2013

Arc itettura degli !laboratori

)ondizioni
Estensione mnemonica

(9 Significato
Flag di condizione Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1 e Z=0 C=0 o Z=1 N=V N!=V Z=0 e N=V Z=1 o N!=V Opcode [31:28] 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL NV

Uguali Non uguali Carry Attivato / Senza segno maggiore o uguale Carry Disattivato / Senza segno minore Negativo Positivo o Zero Overflow Non Overflow Senza segno maggiore Senza segno minore o uguale Con segno maggiore o uguale Con segno minore Con segno maggiore Con segno minore o uguale Sempre ( il default) Mai

52

Arc itettura degli !laboratori

" 2013

Mstruzioni condizionate
%utte le istruzioni di ela#orazione di dati e di salto ossono essere rese condizionate, ovvero la loro e--ettiva esecuzione u/ essere -atta di endere dallo stato dei #it _OCR nel C:S0. :er rendere una istruzione condizionata su--iciente a orre come su--isso dell+istruzione il codice della condizione. !sempi: bne label & salta se non uguale addlt r02 r12 /10 & somma se minore o uguale mo$cc R12 /4 & co ia se non c) stato ri orto

50

52

Arc itettura degli !laboratori

" 2013

)onfronto e salto: esempi


)MN R12 /0 A!U label1 )MN R12 R0 AVH label2 HSH R12 /0&(2 A*I! errore & con-ronta 0$ e J & salta a la#el$ se 0$=J

51

52

& con-ronta 0$ e 0J & salta a la#el6 se 0$70J (signed) & controlla i #it $ e Z di 0$ & salta alla su#routine errore se & almeno uno di tali #it `J & chiama la -unzione di sistema & numero $Z
" 2013

S@M /0&0R

Arc itettura degli !laboratori

)ompletamento dellWesempio
Su oniamo che larraX da co iare contenga $Z elementi: le istruzioni scritte rima vanno eseguite ri etutamente (loo ) $Z volte> allo sco o si u/ utilizzare un registro (ad es. 0<) come contatore: - vi si inserisce il valore iniziale $Z, - lo si decrementa di una unit ad ogni iterazione, - con una instruzione di salto condizionato si riesegue il loo se il contatore diverso zero, altrimenti no: copy: loop: mo$ R32 /0&10 adr R12 HAA*!1 adr R22 HAA*!2 ldr R02 BR1C2 /( str R02 BR2C2 /( subs R32 R32 /1 bne loop
& valore iniziale contatore
& 0$ unta a %APL'$ & 06 unta a %APL'6 & carica dal rimo vettore & salva nel secondo vettore

52

52

& decrementa il contatore & salta se non zero


" 2013

Arc itettura degli !laboratori

Rine
03.b

ARM: le istruzioni assembly