Files

30 lines
1.1 KiB
ArmAsm

AREA ConstrainProg, CODE, READWRITE
ENTRY
Start
ADR sp, Base ;Point to the base of the stack
LDR r0, LowerVal ;Load the lower value into r0
LDR r1, UpperVal ;Load the upper value in r1
LDR r2, ParamToConstrain ;Load the value to constrain into r2
STR r0,[sp,#-4] ;Load r0 onto the stack pointer
STR r1,[sp,#-4] ;Load r1 onto the stack pointer
STR r2,[sp,#-4] ;Load r2 onto the stack pointer
BL Constrain ;Call constrain procedure
LDR r2, [sp] ;Load constrained value back into r2
;r2 should now contain 2000
ADD sp, sp, #8 ;Fix the stack pointer
Constrain
STR LR, [sp, #-4] ;Store return address
LDR r5, [sp, #12] ;Retrieve lower
LDR r4, [sp, #8] ;Retrieve upper
LDR r3, [sp, #4] ;Retrieve val to constrain
CMP r3, r4 ;Check if higher than max
LDRHI r3, [sp, #8] ;If so, load max
CMP r3, r5 ;Check if lower than min
LDRLO r3, [sp, #12] ;If so, load min
STR r3, [sp, #4] ;Overwrite constrained val
LDR PC, [sp], #4 ;Return from procedure
ParamToConstrain DCD 2200 ;Value to constrain
UpperVal DCD 2000 ;Value to constrain
LowerVal DCD 1000 ;Value to constrain
Base DCD 0xAAAAAAAA
END