2013-10-12 13 views
5

Attualmente sto imparando l'assembly ARM per una classe e ho riscontrato un problema in cui avrei dovuto utilizzare un "array". Sono consapevole del fatto che non esiste un array in ARM, quindi devo allocare lo spazio e trattarlo come un array. Ho due domande.Come creare correttamente una matrice nell'assemblaggio ARM?

  1. Sto aggiungendo correttamente nuovi valori all'array o sto semplicemente sovrascrivendo il valore precedente? Se sto sovrascrivendo i valori, come faccio ad aggiungere nuovi valori?
  2. Come faccio a fare il giro dei diversi valori dell'array? So che devo usare loop: ma non so come usarlo per accedere a diversi "indici".

Finora, questo è quello che ho ottenuto leggendo la documentazione ARM come ho raccolto dalle risorse online.

 .equ SWI_Exit, 0x11 

     .text 
     .global _start 

_start: .global _start 
     .global main 

     b  main 

main: 
     ldr  R0, =MyArray 
     mov  R1, #42 
     str  R1, [R0], #4 
     mov  R1, #43 
     str  R1, [R0], #4 
     swi  SWI_Exit 

MyArray: .skip 20 * 4 
     .end 

Come nota a margine, sto usando ARMSim# come richiesto dal mio professore, in modo da alcuni comandi riconosciuti da strumenti GNU non saranno riconosciuti da ARMSim #, o almeno credo che sia il caso. Per favore correggimi se sbaglio.

+1

Perché il voto negativo? Sì, questo è parzialmente correlato ai compiti a casa, ma posso vedere queste informazioni essere utili agli altri e non sto chiedendo come fare il mio incarico. – allejo

+0

Se si desidera indicarlo in questo modo, non esiste una matrice in una famiglia di processori, non solo un braccio. Gli array in realtà non esistono, sono solo una massa di memoria che inizia da qualche parte. Molti set di istruzioni, sicuramente arm, supportano una modalità di indirizzamento offset del registro che consente di ottenere una sensazione pura di un array. Farei attenzione a rendere la dichiarazione che hai fatto in futuro. –

+0

@dwelch Ah grazie per la nota, mi ha aiutato molto con la mia comprensione. Ricorderò anche di non chiamarli array – allejo

risposta

2
  1. Si sta semplicemente sovrascrivendo gli elementi. A questo livello ci sono "cose ​​come matrici", ma solo matrici preallocate di dimensioni fisse. Lo .skip sta allocando l'array a dimensione fissa. * Un array di dimensioni variabili cresce in genere con un codice di allocazione di memoria dyanamic più complesso che utilizza lo stack o un heap.
  2. Se si dispone di un'etichetta come loop: (il nome effettivo è arbitrario) è possibile diramare (di nuovo) utilizzando b loop. (Probabilmente, si vorrebbe fare il ramo condizionale in modo che il programma non ha un ciclo infinito.) È possibile accedere a diversi elementi nel loop cambiando R0, che si sta già facendo

Anche il b main isn' Serve davvero a qualsiasi scopo poiché si dirama verso le prossime istruzioni. Il codice farà la stessa cosa se lo rimuovi.

[*] In alternativa, si potrebbe dire che la matrice è la giusta elementi tra e R0 (esclusa la memoria R0 punti a), in cui, cambiando R0 si sta estendendo la matrice. Ma la dimensione massima è ancora fissata dalla direttiva .skip.

+0

Grazie per la spiegazione, non ci siamo resi conto che 'loop:' era arbitrario. Domanda veloce, come potrei fare per accedere a diversi elementi? – allejo

+1

Probabilmente vuoi puntare 'R0' su MyArray (es.' Ldr R0, = MyArray' o 'adr R0, MyArray') quindi fai cose come 'str rx, [R0, # 4]' o 'str rx, [R0 , R2] 'dove' R2' ha valori come 0, 4, 8, ... – scott

Problemi correlati