2013-06-20 8 views
10

Podążam razem z kursem Baking Pi z Cambridge University, w którym prosty zestaw operacyjny jest zbudowany w zestawie instrukcji ARMv6, skierowanym do Raspberry Pi.Jaka jest różnica między = etykieta (znak równości) i [etykieta] (nawiasy) w zespole ARMv6?

Do tej pory używaliśmy dwóch sposobów ładowania danych do rejestrów za pomocą instrukcji ldr i teraz zdaję sobie sprawę, że używam ich razem, nie w pełni rozumiem, co robią obaj.

Więc mam używane rzeczy jak ldr r0,=0x20200000, które rzeczywiście rozumieć jako „odczyt danych przechowywanych w miejscu pamięci 0x20200000 do rejestru R0

Następnie użyłem rzeczy jak:.

ldr r0,[r1,#4] 

Jakie mam rozumieć jako „odczytać dane zapisane na adres pamięci wskazywanego przez R1, na przesunięcie się z 4 bajtów, do rejestru R0”

Potem spotykamy to:.

ldr r0,=pattern 
ldr r0,[r0] 

pattern OTO .int w sekcji .data (bitmapę reprezentującej sekwencje ON/OFF Zjednoczonych dla diody LED). Zdaję sobie sprawę, po przeczytaniu tego, że moje poprzednie zrozumienie =foo musi być błędne, w przeciwnym razie obie powyższe instrukcje zrobiłyby to samo.

Czy składnia zasadzie bardziej jak wskaźnik w C =x, natomiast składnia [x] jakby pamięć, która jest wskazywana przez x faktycznie czytać?

Powiedzmy, że ptr w C poniżej jest int*, czy moje komentarze dotyczące równoważnego montażu (koncepcyjnie, nie dosłownie) mają jakiś sens?

r0 = ptr;  /* equivalent to: ldr r0,=ptr  */ 
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */ 
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */ 
+0

Możliwy duplikat: http: // stackove rflow.com/questions/14046686/ldr-vs-mov-arm-assembly http://stackoverflow.com/questions/9374703/llvm-gcc-assembler-ldr-syntax http://stackoverflow.com/questions/9735169/ iphone-assembly-compilation-error-with-ldr-parameters –

Odpowiedz

14
ldr r0,=something 
... 
something: 

oznacza załadować adres czegoś etykiet do rejestru R0. Assembler następnie dodaje słowo gdzieś w niedostępnym instrukcją LDR i zastępuje go

ldr r0,[pc,#offset] 

instrukcją

Więc ten skrót

ldr r0,=0x12345678 

oznacza obciążenie 0x12345678 do R0.

Będąc głównie ustalonymi instrukcjami długości, nie można załadować pełnego 32-bitowego bezpośrednio do rejestru w jednej instrukcji, może to wymagać szeregu instrukcji, aby całkowicie załadować rejestr przy pomocy 32-bitowego numeru. W dużym stopniu zależy od liczby. Na przykład

ldr r0,=0x00010000 

zostaną zastąpione przez gnu asemblerze z jednej instrukcji mov r0, # 0x00010000 jeśli jest to instrukcja ARM, za zlecenie kciuka choć może wciąż być LDR r0, [PC, # offset]

Te ldr rd, = rzeczy są skrótem, pseudo instrukcjami, nie rzeczywistymi.

ldr rd,[rm,#offset] 
ldr rd,[rm,rn] 

są prawdziwe instrukcje i średniego odczytu z pamięci pod adresem rm + przesunięcie lub rm + rn i przyjąć wartość odczytaną i umieścić go w rd rejestru

= coś jest bardziej jak & coś w C .

unsigned int something; 
unsigned int r0; 
unsigned int r1; 

r0 = &something; 
r1 = *(unsigned int *)r0; 

aw zespole

something: 
    .word 0 

ldr r0,=something 
ldr r1,[r0] 
+0

Teraz jest super czysto, dzięki za wspaniałą odpowiedź! :) – d11wtq