Pytanie 1. ustawianie bitów - rozumiem ze robi się to przez ustawienie maski + operacja logiczna. Rozumiem że może być taka sytuacja, że wynik który chce otrzymać nie uda mi się zrobić jedną maską i operacją logiczną tylko będę musiał np. zrobić 2x maskę + operacja logiczna ?
Przykład z wikipedi: zerowanie dwóch najmłodszych bitów
operacja AND
Słowo: 10010111
Maska: 11111100
Wynik: 10010100
Pytanie 2. co do maski czy to ma jakieś znaczenie czy zamiast tej maski dam np. taką: 10011100. Wynik będzie ten sam.
Pytanie 3.
Mam takie 2 instrukcje czym one się różnią:
ORR R1, #(1<<28)(1<<26)
MOV R2,#((1<<13) (1<<14)) // maska -> ustawienie jedynek na 13 i 14 pozycji ?
Pytanie 4. Po co się robi takie operacje, to STR na końcu ?
LDR R0, =RCC_AHB1ENR
LDR R1, [R0] //odczyt
ORR R1, #1<<6 //przesuniete o 6 miejsc zgodnie z kierunkiem strzalek //mod
STR R1, [R0] //zapis
Pytanie 5.
Instrukcja STR
Powiedzmy, że mam:
LDR R1,[R0]
STR R1,[R0]
Wiem, że STR zapisuje wartość rejestru w pamięci w przeciwieństwie do LDR który to ładuje wartość rejestru z pamięci.
Tylko, że ja nie rozumiem czym to się różni.
Pytanie 6.
Instrukcja TST
TST R1,#1
W jakim przypadku ustawiana jest flaga?
Jeżli do rejestru R1 wrzucę 0x01 to się nie ustawia. a już dla R1 = 0x02 tak. Czyli żeby ustawiła się flaga wynikiem muszą być same zera ?
TST to operacja AND czyli
dla R1 = 0x01 mam 01 & 01 = 01
dla R1 = 0x02 mam 10 & 01 = 00
Dla takiego kodu
1. CMP R5,#255 ;
2. ITE EQ ;
3. MOVEQ R1,#1<<13
4. MOVNE R1,#1<<29 ;reset jest na 29
5. STR R1,[R0]
- Porównuje wartość w rejestrze R5 z 255. Jeżeli jest taka sama ustawia się flaga Z = 1
- Jeżeli Z == 1 to wykona sie linijka 3, jeżeli nie to wykona się linijka 4.
Pytanie 7. Po co piszę MOVEQ / MOVNE ?? Równie dobrze mogę wywalić linijkę nr 2 ( ITE ) i też będzie chyba działać, lub zostawić ITE i zmienić MOVEQ -> MOV i MOVNE -> MOV
Z góry dzięki za pomoc