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] */
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 –