VAL1A EQU 0xffffffff
VAL1B EQU 0x0000000f
VAL2A EQU 0x00000001
VAL2B EQU 0x00000001
AREA LongAdd, CODE
ENTRY
ldr R0, = VAL1A
ldr R1, = VAL1B
ldr R2, = VAL2A
ldr R3, = VAL2B
adds R8,R0,R1
adcs R9,R1,R3
stop b stop
END
AREA Exaddress, CODE, READONLY
EXPORT Reset_Handler
Reset_Handler
LDR R9, =list
mov R7, #4 ; number in list
ldr r6, =datastart
loop
ldr r8,[r9],#4
str r8,[r6],#4
subs r7,r7,#1
bne loop
stop b stop
ALIGN
list DCW 0x1111, 0x2222, 0x3333, 0x4444, 0x5555
ALIGN
string DCB "This is a test.",0
string2 DCB 'T','h','i'
ALIGN
AREA Thedata, DATA, NOINIT, READWRITE
datastart SPACE 20
END
; First Subroutine Example
; This program demonstrates using a subroutine,
; saving registers on the stack, etc.
; Rob Frohne, 1/3/2013
stack_start EQU 0x40001000
AREA Subroutine_Example, CODE
ENTRY
Start
ldr sp, =stack_start ; Tell where we will place the stack.
; (It goes down (lower addresses from here.)
mov r1, #1 ; Store some numebers in some registers
mov r2, #2
mov r3, #3
bl subroutine
stop b stop
; This subroutine saves the registers,
; messes up the registers locally,
; then restores the registers and returns.
subroutine
stmfd sp!, {r1-r2,lr} ; save used registers and the link register (r14)
mov r1,#0xffffffff ; mess up the registers
mov r2, r1
ldmfd sp!, {r1,r2,pc} ; pop the stack and return
END