Istruzioni assembly di architetture ARM

download Istruzioni assembly di architetture ARM

If you can't read please download the document

  • date post

    29-Oct-2014
  • Category

    Documents

  • view

    117
  • download

    4

Embed Size (px)

description

Alcuni esempi di utilizzo di istruzioni base per architetture ARM

Transcript of Istruzioni assembly di architetture ARM

ARM: le istruzioni assembly03.b

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

Struttura programma assemblyLa forma generale delle linee di codice assembly :

1

52

label:[email protected] Ogni campo deve essere separato da uno o pi spazi I label devono iniziare dal primo carattere della riga Le istruzioni non cominciano mai dal primo carattere della riga: devono essere precedute da almeno 1 spazio Tutti e tre le sezioni ... : ... @ ... sono opzionali Esistono inoltre: direttive per lassemblatore pseudo-istruzioniArchitettura degli Elaboratori 1 2009

Direttive per l'assemblatoredirettive: sono comandi per l'assemblatore, non per il processore .text specifica la sezione contenente il codice eseguibile .data specifica la sezione contenente dati inizializzati .bss specifica la sezione contenente dati non inizializzati .end specifica la fine del modulo sorgente .global definisce simboli visibili al di fuori del modulo stesso: utile per collegare pi moduli (linking) .long .short .byte definiscono costanti (es. in .data) .ascii definisce una stringa .lcomm .comm .skip definiscono aree di mem. non inizializzate (locali al modulo o visibili da altri moduli)

2

52

Architettura degli Elaboratori 1

2009

Esempio di file .sLabel.text .global _start _start: mov r0, #0x100 ciclo: subs r0, r0, #1 bne ciclo @ Inizia il programma

3

52

Istruzione

ldr pc, =0x112C

@ esce al sistema

.data maschera: .long 0xAAAAAAAA stringa: .ascii "Pippo" .bss .lcomm spazio, 100 .endArchitettura degli Elaboratori 1

Direttiva

Sezione 2009

Classi di indirizzamentoModo 1: per istruzioni di elaborazione dati ADC, ADD, AND, BIC, CMN, CMP, EOR, MOV, MVN, ORR, RSB, RSC, SBC, SUB, TEQ, TST Modo 2: per Load&Store di word o unsigned byte LDR, LDRB, STR, STRB Modo 3: per L&S di halfword o signed byte LDRH, LDRSB, LDRSH, STRH Modo 4: per L&S di registri multipli LDMxx, STMxx

4

52

Architettura degli Elaboratori 1

2009

Modo 1 (indirizz. per elab. dati)sintassi: Rd, Rn, Rd, pu essere: un valore immediato # un registro Rm un registro, dopo scorrimento specificato con: - un valore immediato Rm, # - un registro Rm, Rs gli operatori disponibili sono: ASR, LSL, LSR, ROR, RRXArchitettura degli Elaboratori 1

5

52

2009

Modo 1: esempimov R0, #0 add R3, R3, #1 cmp R7, #1000 bic R9, R8, #0xff00 mov R2, R0 add R4, R3, R2 mov R2, R0, LSL #2 add R9, R5, R5, LSL #3 sub R9, R5, R5, ASR #3 rsb R9, R5, R5, ASR #3 mov R5, R3, RRX mov R7, R4, ROR R3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ R0 0 R3 R3+1 cc (R71000) R9 R8 and not 0xff00 R2 R0 R4 R3+R2 R2 R0*4 R9 R5+R5*8 = R5*9 R9 R5R5/8 R9 R5/8R5 R5 R3 ruotato esteso a destra di una posiz. R7 R4 ruotato a destra di R3 posizioni

6

52

Architettura degli Elaboratori 1

2009

Modo 2 (indirizz. per Word o uns. Byte)

7

sintassi: LDR|STR{B} Rd, 52 un indirizzamento indiretto con registro [Rn], che pu avere una delle seguenti forme: offset immediato offset da registro offset da registro scalato pre-incremento immediato pre-incremento da registro pre-incremento da registro scalato post-incremento immediato post-incremento da registro post-incremento da registro scalatoArchitettura degli Elaboratori 1 2009

Modo 2: offsetOffset immediato [Rn, #] Offset da registro [Rn, Rm]

8

@ Rd M[Rn ]

52

@ Rd M[Rn Rm]

Offset da registro scalato [Rn, Rm, #]

@ Rd M[Rn (Rm # )] 2009

Architettura degli Elaboratori 1

Modo 2: pre-incrementoPre-incremento immediato [Rn, #]! @ Rn Rn @ Rd M[Rn] Pre-incremento da registro [Rn, Rm]! @ Rn Rn Rm @ Rd M[Rn] Pre-incremento da registro scalato [Rn, Rm, #]! @ Rn Rn (Rm # ) @ Rd M[Rn]Architettura degli Elaboratori 1

9

52

2009

Modo 2: post-incrementoPost-incremento immediato [Rn], # @ Rd M[Rn] @ Rn Rn Post-incremento da registro [Rn], Rm @ Rd M[Rn] @ Rn Rn Rm Post-incremento da registro scalato [Rn], Rm, # @ Rd M[Rn] @ Rn Rn (Rm # )Architettura degli Elaboratori 1

10

52

2009

Modo 2: esempildr 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 2009

str R5, [R0,#4]!

Architettura degli Elaboratori 1

Modo 3 (ind. per HalfWord/signed Byte)sintassi: STR|LDR[H] Rd, LDR[SH|SB] Rd, pu essere: offset immediato offset da registro pre-incremento immediato pre-incremento da registro post-incremento immediato post-incremento da registro differenze rispetto al Modo 2: - non si possono scalare i registri - gli offset immediati sono a soli 8bitArchitettura degli Elaboratori 1

12

52

2009

Modo 2 e modo 3: tabella riassuntivaW SH H SB B LDR Modo 2 Modo 3 Modo 3 Modo 3 Modo 2 STR Modo 2 Modo 3 Modo 2

13

52

NOTA BENE: non ha senso parlare di STORE per quantit con segno, perch non c alcuna estensione del segno da effettuareArchitettura degli Elaboratori 1 2009

Modo 4 (ind. per load/store multiplo)sintassi: LDM|STM Rn{!},

14

pu essere: IA increment after

52

IB increment before DA decrement after

start_addr = Rn ; end_addr = Rn + #regs*4 - 4 start_addr = Rn + 4 ; end_addr = Rn + #regs*4 start_addr = Rn - #regs*4 + 4 ; end_addr = Rn start_addr = Rn - #regs*4 ; end_addr = Rn 4 (#regs il numero di registri indicati in )

DB decrement before

! provoca l'aggiornamento del registro Rn: al suo contenuto

viene sommata o sottratta la quantit #regs*4

Architettura degli Elaboratori 1

2009

Modo 4 (ind. per load/store multiplo)sintassi: LDM|STM Rn{!}, la lista di registri da salvare/caricare, racchiusa tra parentesi graffe {} e con gli elementi separati da virgola.esempi: STMDB SP!, {R0-R7} LDMIA SP!, {R0-R7} @ salva sullo stack i registri @ da R0 a R7 ricarica R0-R7 salvati dallistruzione precedente carica i registri R1, R3-R5 da M32[R9-12].. M32[R9]

15

52

@ @ LDMDA R9, {R1,R3-R5} @ @

Architettura degli Elaboratori 1

2009

Classificazione delle istruzioniElaborazione di dati operazioni aritmetiche e logiche: ADC, ADD, AND, BIC, EOR, ORR, RSB, RSC, SBC, SUB movimento tra registri: MOV, MVN confronto: CMN, CMP, TEQ, TST Accesso alla memoria load/store tra memoria e registri: LDR, LDRB, STR, STRB, LDRH, LDRSB, LDRSH, STRH, LDMxx, STMxx Controllo del flusso branch: B, BccArchitettura degli Elaboratori 1

16

52

2009

Istruzioni di elaborazione di datiQueste istruzioni usano la classe di indirizzamento modo 1

17

52 Regole per le istruzioni di elaborazione di dati: tre operandi: due sorgente, uno destinazione tutti gli operandi sono a 32 bit, sia registri che costanti il risultato anch'esso a 32 bit ed posto in un registro

Esempi: add r0, r1, r2 add r0, r0, r0

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

Architettura degli Elaboratori 1

2009

Istruzioni aritmeticheAddizione: ADD{} Rd, Rn, Sottrazione: SUB{} Rd, Rn, RSB{} Rd, Rn, Moltiplicazione: MUL{} Rd, Rn, Rs(attenzione: MUL ha solo operandi nei registri)

18

52

Nessuna istruzione per la divisione!Architettura degli Elaboratori 1 2009

Istruzioni aritmetiche: esempiadd r0, r1, r2 add r0, r1, r2 adc r0, r1, r2 adc r0, r1, r2 sub r0, r1, r2 sub r0, r1, r2 sbc r0, r1, r2 sbc r0, r1, r2 rsb r0, r1, r2 rsb r0, r1, r2 rsc r0, r1, r2 rsc r0, r1, r2 @ r0 = r1 + r2 @ r0 = r1 + r2 @ r0 = r1 + r2 + C @ r0 = r1 + r2 + C @ r0 = r1 r2 @ r0 = r1 r2 @ r0 = r1 - r2 + C 1 @ r0 = r1 - r2 + C 1 @ r0 = r2 - r1 @ r0 = r2 - r1 @ r0 = r2 - r1 + C 1 @ r0 = r2 - r1 + C 1

19

52

rsb sta per reverse subtraction C il carry bit del CPSR per impostare i bit di condizione in base al risultato occorre aggiungere il suffisso s al simbolo operativoArchitettura degli Elaboratori 1 2009

ADD, SUB, MUL: esempiADD R0, R0, #1 ADD R0, R0, #-1 ADDS R0, R0, #-1 ADD SUB SUB MUL @ R0=R0+1 @ R0=R0-1 @ R0=R0-1 e aggiorna i bit @ di stato (utile nei cicli) R0, R1, R2, ASR #2 @ R0=R1+R2/4 R0, R0, #1 @ di nuovo R0=R0-1 PC, LR, #4 @ ritorno da interruzione R0, R1, R2 @ R0=R1*R2

20

52

Architettura degli Elaboratori 1

2009

Istruzioni logicheAND logico: AND{} Rd, Rn, OR logico: ORR{} Rd, Rn, OR esclusivo: EOR{} Rd, Rn, Bit Clear (Rd=Rn AND NOT ): BIC{} Rd, Rn, Architettura degli Elaboratori 1

21

52

2009

Istruzioni logiche: esempiand r0, r1, r2 and r0, r1, r2 orr r0, r1, r2 orr r0, r1, r2 eor r0, r1, r2 eor r0, r1, r2 bic r0, r1, r2 bic r0, r1, r2 @ r0 = r1 and r2 @ r0 = r1 and r2 @ r0 = r1 or r2 @ r0 = r1 or r2 @ r0 = r1 xor r2 @ r0 = r1 xor r2 @ r0 = r1 and not r2 @ r0 = r1 and not r2

22

52

bic sta per bit clear : ogni bit 1 nel secondo operando fa azzerare il corrispondente bit nel primo.Architettura degli Elaboratori 1 2009

AND, ORR, EOR, BIC: esempiAND R0, R1, R2 AND R0, R1, #0x7 ORR R0, R0, R1 EOR R0, R1, #0xF EOR R0, R0, R0 BIC R0, R1, R2 @ R0=R1 AND R2 @ estrae da R1 i 3 bit meno @ significativi e li pone in R0 @ R0=R0 OR R1 @ R0=R1 XOR 16 @ R0=0 @ R0=R1 AND NOT R2

23

52

e il NOT? si pu usare MVN: MVN R1, R0 MVN R0, R0Architettura degli Elaboratori 1

@ R1=NOT R0 @ nega i bit di R0 2009

Move (MOV)Muove un valore tra registri o carica un valore immediato espresso con 12 bit (imm_12=c_8>>2*r_4) MOV{} Rd,