mirror of
https://github.com/caperren/school_archives.git
synced 2025-11-09 21:51:15 +00:00
30 lines
1.1 KiB
Plaintext
30 lines
1.1 KiB
Plaintext
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 |