Here is an arm assembly code for factorial function (along with the c code).i am a bit confused with the stmfd and ldmfd instructions.what are they exactly doing in this program? what does the exclamation mark do? why is label .L2 being loaded into r0? i kno that stmfd and ldmfd are used to store and load multiple registers in full descending mode but what are they doing with fp,ip,lr,pc in this code?

.file	"factorial.c"
	.text
	.align	2
	.global	factorial
	.type	factorial, %function
factorial:
	@ args = 0, pretend = 0, frame = 8
	@ frame_needed = 1, uses_anonymous_args = 0
	mov	ip, sp
	stmfd	sp!, {fp, ip, lr, pc}
	sub	fp, ip, #4
	sub	sp, sp, #8
	str	r0, [fp, #-16]
	ldr	r3, [fp, #-16]
	cmp	r3, #1
	bne	.L2
	mov	r3, #1
	str	r3, [fp, #-20]
	b	.L1
.L2:
	ldr	r3, [fp, #-16]
	sub	r3, r3, #1
	mov	r0, r3
	bl	factorial
	mov	r3, r0
	ldr	r2, [fp, #-16]
	mul	r3, r2, r3
	str	r3, [fp, #-20]
.L1:
	ldr	r0, [fp, #-20]
	sub	sp, fp, #12
	ldmfd	sp, {fp, sp, pc}
	.size	factorial, .-factorial
	.section	.rodata
	.align	2
.LC0:
	.ascii	"%d\n\000"
	.text
	.align	2
	.global	main
	.type	main, %function
main:
	@ args = 0, pretend = 0, frame = 4
	@ frame_needed = 1, uses_anonymous_args = 0
	mov	ip, sp
	stmfd	sp!, {fp, ip, lr, pc}
	sub	fp, ip, #4
	sub	sp, sp, #4
	mov	r0, #3
	bl	factorial
	mov	r3, r0
	str	r3, [fp, #-16]
	ldr	r0, .L4
	ldr	r1, [fp, #-16]
	bl	printf
	mov	r0, r3
	ldmfd	sp, {r3, fp, sp, pc}
.L5:
	.align	2
.L4:
	.word	.LC0
	.size	main, .-main
	.ident	"GCC: (GNU) 3.4.3"

the c code:

#include <stdio.h>

int factorial(int n) {
	if(n == 1) return 1;
	return n * factorial(n-1);
}
int main() {
	int val = factorial(3);
	printf("%d\n",val);
}

ok i am sorry, label .L2 is not being loaded into register r2 in this case but i saw an example where it does.what does that do?

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.