Code Examples from Class: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| No edit summary | No edit summary | ||
| Line 40: | Line 40: | ||
|      ldr sp, =stack_start ; Tell where we will place the stack. |      ldr sp, =stack_start ; Tell where we will place the stack. | ||
|                           ; (It goes down (lower addresses from here.) |                           ; (It goes down (lower addresses from here.) | ||
|      mov r1, #1 ; Store some numebers in some registers |      mov r1, #1 ; Store some numebers in some registers | ||
|      mov r2, #2 |      mov r2, #2 | ||
|      mov r3, #3 |      mov r3, #3 | ||
|      bl subroutine |      bl subroutine | ||
|   stop b stop |   stop b stop | ||
| Line 52: | Line 49: | ||
|   ; messes up the registers locally, |   ; messes up the registers locally, | ||
|   ; then restores the registers and returns. |   ; then restores the registers and returns. | ||
|   subroutine |   subroutine | ||
|      stmfd sp!, {r1-r2,lr} ; save used registers and the link register (r14) |      stmfd sp!, {r1-r2,lr} ; save used registers and the link register (r14) | ||
|      mov r1,#0xffffffff ; mess up the registers |      mov r1,#0xffffffff ; mess up the registers | ||
|      mov r2, r1 |      mov r2, r1 | ||
|      ldmfd sp!, {r1,r2,pc} ; pop the stack and return |      ldmfd sp!, {r1,r2,pc} ; pop the stack and return   | ||
|      END |      END | ||
Revision as of 14:36, 5 November 2013
- Copy to RAM
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
- Subroutine Example1
; 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