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