Przeszukiwanie elementów tablicy

0

Próbuje zrozumieć jak działa przeszukanie obiektów w tablicy w assemblerze.


liczby 	DCD 	0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008

//
				1. LDR R0,=liczby                                         ; wczytanie tablicy do rejestru R0
				2. MOV R1,#8                                              ; 8 to liczba elementów w tablicy ??
				3. ADD R0,R0,R1,LSL#2 			       ; R0+=R1*4 ??
				4. LDR R2,[R0,#-4]!				       ; R0-=4 i R2=@R0
					

Czy byłby mi to ktoś w stanie łopatologicznie wytłumaczyć ten kod, co tu się dzieje krok po kroku. Polecenia komend znam ale nie wiem jak to działa.

Debuguje ten kod w emulatorze i nie rozumiem dlaczego:

  1. Po wykonaniu pierwszej linijki w rejestrze R0 mam 0x00000008
  2. Po wykonaniu trzeciej linijki w rejestrze R0 jest 28 ? w R0 mam 8, czyli powinno być: 8 + 8 * 4. A dwa co to wgl oznacza to 28? Domyślam się że rozmiar tablicy -> ma 28 bajtów
  3. Po wykonaniu 4 linijki cudowanie do rejestru R2 wędruje ostatni element tablicy -> 8. Czyli wychodzi na to że jeden element w tablicy zajmuj 4 bajty
0

Nikt nie wie?

0

@shalom przecież to nawet nie znajac ARMa można zgadnąć po mnemonikach :P. Może poza LSL#2 które jest dziwną składnią.

Po wykonaniu pierwszej linijki w rejestrze R0 mam 0x00000008

Tego to nikt nie wie :P.

Generalnie LDR R0,=liczby wczytuje do rejestru R0 adres labela liczby. 8 to równie dobry pointer jak każdy inny, więc możliwe że Twoje liczby są w pamięci właśnie pod tym adresem.

 MOV R1,#8                                              ; 8 to liczba elementów w tablicy ??

Trudno zaprzeczyć, 8 to liczba elementów w tablicy.

Po wykonaniu trzeciej linijki w rejestrze R0 jest 28 ? w R0 mam 8, czyli powinno być: 8 + 8 * 4. A dwa co to wgl oznacza to 28? Domyślam się że rozmiar tablicy -> ma 28 bajtów

No dokładnie, po wykonaniu tej linijki w R0 jest 28. Czyli 8+8*4:

In [20]: hex(8+8*4)
Out[20]: '0x28'

Jeśli coś Ci się nie zgadza, to pewnie dlatego że liczysz w systemie dziesiętnym zamiast szesnastkowym (przecież wszsystkie liczby w debuggerze masz szesnastkowo).

Ale w jakim systemie by nie liczyć, rozmiar tablicy (8*4) to nie jest 28 bajtów. 28 to adres końca tablicy (adres_poczatku + rozmiar_elementu + ilosc_elementow)

Po wykonaniu 4 linijki cudowanie do rejestru R2 wędruje ostatni element tablicy -> 8. Czyli wychodzi na to że jeden element w tablicy zajmuj 4 bajty

Sam odpisałeś sobie - to prawda, jeden element tablicy ma 4 bajty (DCD = define constant DWORD = 32bity, DCW = define constant word = 16 bitów, DCB = define constant byte = 8 bitów).

1 użytkowników online, w tym zalogowanych: 0, gości: 1