.equ INPUT_VALUE, 5
@ Embest board specific software interrupts
.equ SWI_PrInt, 0x6b
.equ Stdout, 0x01
.equ SWI_Exit, 0x11
.text
factorial:
@ Push stack
stmfd sp!, {r4, lr}
@ Store n in local variable
mov r4, r0
@ branch if n > 1
cmp r4, #1
bgt factorial_recurse
@ return 1
mov r0, #1
bal factorial_end
factorial_recurse:
@ calculate factorial(n-1)
mov r0, r4
sub r0, r0, #1
bl factorial
@ multiply returned value by n
mul r0, r4, r0
@ now returns n * factorial(n-1)
factorial_end:
ldmfd sp!, {r4, lr}
bx lr
.global _start
_start:
stmfd sp!, {lr}
mov r0, #INPUT_VALUE
bl factorial
@ print to stdout
mov r1, r0
mov r0, #Stdout
swi SWI_PrInt
ldmfd sp!, {lr}
@ bx lr
swi SWI_Exit
CS5lcXUJSU5QVVRfVkFMVUUsCTUKCUAgRW1iZXN0IGJvYXJkIHNwZWNpZmljIHNvZnR3YXJlIGludGVycnVwdHMKCS5lcXUJU1dJX1BySW50LAkweDZiCgkuZXF1CVN0ZG91dCwJCTB4MDEKCS5lcXUJU1dJX0V4aXQsCTB4MTEKCgkudGV4dApmYWN0b3JpYWw6CglAIFB1c2ggc3RhY2sKCXN0bWZkCXNwISwge3I0LCBscn0KCUAgU3RvcmUgbiBpbiBsb2NhbCB2YXJpYWJsZQoJbW92CXI0LCByMAoJQCBicmFuY2ggaWYgbiA+IDEKCWNtcAlyNCwgIzEKCWJndAlmYWN0b3JpYWxfcmVjdXJzZQoJQCByZXR1cm4gMQoJbW92CXIwLCAjMQoJYmFsCWZhY3RvcmlhbF9lbmQKZmFjdG9yaWFsX3JlY3Vyc2U6CglAIGNhbGN1bGF0ZSBmYWN0b3JpYWwobi0xKQoJbW92CXIwLCByNAoJc3ViCXIwLCByMCwgIzEKCWJsCWZhY3RvcmlhbAoJQCBtdWx0aXBseSByZXR1cm5lZCB2YWx1ZSBieSBuCgltdWwJcjAsIHI0LCByMAoJQCBub3cgcmV0dXJucyBuICogZmFjdG9yaWFsKG4tMSkKZmFjdG9yaWFsX2VuZDoKCWxkbWZkCXNwISwge3I0LCBscn0KCWJ4CWxyCgoJLmdsb2JhbCBfc3RhcnQKX3N0YXJ0OgoJc3RtZmQJc3AhLCB7bHJ9Cgltb3YJcjAsICNJTlBVVF9WQUxVRQoJYmwJZmFjdG9yaWFsCgoJQCBwcmludCB0byBzdGRvdXQKCW1vdglyMSwgcjAKCW1vdglyMCwgI1N0ZG91dAoJc3dpCVNXSV9QckludAoKCWxkbWZkCXNwISwge2xyfQpACWJ4CWxyCglzd2kJU1dJX0V4aXQ=