Code Examples from Class: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
* Factorial |
|||
<nowiki> |
|||
; Factorial Calculation |
|||
; The answer is in R10 |
|||
; Rob Frohne 2013 |
|||
GLOBAL Reset_Handler |
|||
AREA Factorial, CODE, READONLY |
|||
ENTRY |
|||
Reset_Handler |
|||
movs r8, #0 ; Take the factorial of this number, n. |
|||
mov r10, #1 ; 0! and 1! are 1 |
|||
beq stop ; If r8 is zero we are done |
|||
cmp r8, #1 ; If r8 is 1, |
|||
beq stop ; we are done |
|||
subs r9, r8, #1 ; n-1 |
|||
loop mulne r10, r9, r8 ; n(n-1) |
|||
mov r8, r10 |
|||
subs r9, r9, #1 |
|||
bne loop |
|||
stop b stop |
|||
END |
|||
</nowiki> |
|||
* 64 Bit Add |
* 64 Bit Add |
||
VAL1A EQU 0xffffffff |
VAL1A EQU 0xffffffff |
Revision as of 13:44, 5 November 2013
- Factorial
; Factorial Calculation ; The answer is in R10 ; Rob Frohne 2013 GLOBAL Reset_Handler AREA Factorial, CODE, READONLY ENTRY Reset_Handler movs r8, #0 ; Take the factorial of this number, n. mov r10, #1 ; 0! and 1! are 1 beq stop ; If r8 is zero we are done cmp r8, #1 ; If r8 is 1, beq stop ; we are done subs r9, r8, #1 ; n-1 loop mulne r10, r9, r8 ; n(n-1) mov r8, r10 subs r9, r9, #1 bne loop stop b stop END
- 64 Bit Add
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
- 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