2013-10-12 14 views
5

Obecnie uczę się montażu ARM dla klasy i natknąłem się na problem, w którym potrzebuję użyć "tablicy". Jestem świadomy, że nie ma czegoś takiego jak tablica w ARM, więc muszę przydzielić przestrzeń i traktować to jako tablicę. Mam dwa pytania.Jak prawidłowo utworzyć tablicę w złożeniu ARM?

  1. Czy poprawnie dodaję nowe wartości do tablicy, czy tylko nadpisuję poprzednią wartość? Jeśli nadpisuję wartości, w jaki sposób mogę dodawać nowe wartości?
  2. Jak przejść do pętli z różnymi wartościami tablicy? Wiem, że muszę używać loop:, ale nie wiem, jak z niego korzystać, aby uzyskać dostęp do różnych "indeksów".

Do tej pory otrzymałem to od zapoznania się z dokumentacją ARM, którą zebrałem z zasobów 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 

Na marginesie, używam ARMSim# wymagane przez mojego profesora, więc niektóre polecenia rozpoznawanych przez narzędzia GNU nie zostanie rozpoznany przez ARMSim #, a przynajmniej uważam, że jest to przypadek. Proszę popraw mnie jeżeli się mylę.

+1

Dlaczego głosowanie w dół? Tak, jest to częściowo związane z pracą domową, ale widzę, że ta informacja jest przydatna dla innych i nie pytam, jak wykonać zadanie. – allejo

+0

Jeśli chcesz wyrazić to w ten sposób, nie ma czegoś takiego jak tablica w rodzinie procesorów, a nie tylko ramię. Tablice właściwie nie istnieją, są tylko kroplą pamięci, która zaczyna się gdzieś. Wiele zestawów instrukcji, zdecydowanie uzbrojonych, obsługuje tryb adresowania z przesunięciem rejestru, który pozwala uzyskać czystą atmosferę tablicy. Byłbym ostrożny składając oświadczenie, które złożyłeś w przyszłości. –

+0

@dwelch Ach, dziękuję za wiadomość, bardzo mi pomogłeś z moim zrozumieniem. Będę również pamiętać, aby nie nazywać ich tablicą – allejo

Odpowiedz

2
  1. Po prostu zastępujesz elementy. Na tym poziomie są "takie rzeczy jak tablice", ale tylko te o ustalonej wielkości, z wcześniej przydzielonymi tablicami. .skip przydziela tablicę o stałym rozmiarze. * Tablica o zmiennej wielkości, która może być używana, będzie zwykle implementowana z bardziej złożonym, dynamicznym kodem alokacji pamięci przy użyciu stosu lub sterty.
  2. Jeśli masz etykietę, taką jak loop: (rzeczywista nazwa jest dowolna), możesz oddzwonić (cofnąć się) przy użyciu b loop. (Prawdopodobnie, co chcesz zrobić warunkowo gałąź tak, że program nie zawsze pętla). Można uzyskać dostęp do różnych elementów w pętli poprzez zmianę R0, co już robisz

Również b main ISN” t naprawdę służy jakiemukolwiek celowi, ponieważ rozgałęzia się do następnej instrukcji. Kod zrobi to samo, jeśli go usuniesz.

[*] Alternatywnie, można powiedzieć, że tablica jest tylko elementy między i R0 (nie wliczając pamięci R0 wskazuje na), w którym, poprzez zmianę R0 jesteś rozciągające tablicę. Ale maksymalny rozmiar jest nadal ustalany przez dyrektywę .skip.

+0

Dziękuję za wyjaśnienia, nie zdawałem sobie sprawy, że 'loop:' było arbitralne. Szybkie pytanie, w jaki sposób chciałbym uzyskać dostęp do różnych elementów? – allejo

+1

Prawdopodobnie chcesz wskazać 'R0' w MyArray (np.' Ldr R0, = MyArray' lub 'adr R0, MyArray'), następnie wykonaj czynności takie jak' str rx, [R0, # 4] 'lub' str rx, [R0 , R2] 'gdzie' R2' ma wartości takie jak 0, 4, 8, ... – scott

Powiązane problemy