ARM7 L-Bit zum loaden und storen Priviliegertier Modus : Register so lesen, als wären wir nicht priviligiert
LDM → load multiple registers STM → store multiple registers
Wenn wir mehrere Register auf einmal bedienen : Basisregister
LDM R8, {R0, R2, R9} ; LDM is a synonym for LDMIA
STMDB R1!, {R3−R6, R11, R12}
Stacks
vgl Seite 66
Wir haben einen Descending und Ascending stack Descending : der PC kann entweder FD , Full Descending oder ED, empty descending sein.
[! Das Ausrufezeichen nicht vergessen, um das REgister zu aktualisieren ]
subroutine:
STMFD SP!, {R5−R7, LR} ; Push work registers and LR
;. . .
BL somewhere_else
;. . .
LDMFD SP!, {R5−R7, PC} ; Pop work registers and return
Benutzen einer ISR - Interrupt Service Routine
isr:
SUB LR, LR, #4 ; Rücksprungadresse korrigieren (nur für IRQ und FIQ)
STMFD SP!, {R0−R4, LR} ; R0 bis R4 und LR sichern
;. . .
BL somewhere_else
;. . .
LDMFD SP!, {R0−R4, PC}^ ; R0 bis R4 zurückladen,
; return from interrupt (reload CPSR)
4.8 Sonderbefehle
MSR vs MRS → Move / store Status Register
Erinnern 3.2.1 Statusregister hat einen “Modus” → Wir können Veränderungen nur im priviligierten Modus verstellen
Bevor Interrupts sperren : DOuble Buffering ; eines leisen. zweites schreiben Dehalb Interrupts lieber nicht sperren
Aussage : Es ist schneller 8 Bits zu laden als 32 → Nein Aussage : 8 Bit Additoin ist schneller als 32 Bit Addition → Nein, es gibt keine 8 Bit Addition, diese muss simuliert werden
Add R1, R2, #1 ; R1 <- (R2+1) modulo 2^32
AND R1, R1, #0xFFFF ; ERROR
Das ist eine 8 Bit Addition, 2 Instruktionen, deshalb teuerer als 32 Bit Addition
das keyword volatile heißt : Redundante Lade und schreib Operationen nicht wegoptimieren Eine Variable kann als const und volatile deklariert werden
Beispiel : Variable wie Timer oder Counter : ändert seinen Wert ohne dass wir was reinschreiben -> Somit als volatile deklarieren