Convert the following C Language program to ARM assembly lan
Convert the following C Language program to ARM assembly language program by hand coding. The program essentially computes n! (n-factorial) value using the recursive function call technique.
The ARM assembly program should work on the KEIL simulator and give the correct result for any reasonable ‘n’ value.
Note: Assign ‘n’ to R0 and ‘result’ to R5
C program below
#include <stdio.h>
long int multipyNumbers(int n);
int main()
{
int n=5;
int resutlt = 0xFFFFAAAA;
result = multiplyNumber(n);
return 0;
}
long int multiplyNumber( int n )
{
if (n>=1)
return (n * multiplyNumbers(n-1));
else
return1
}
Solution
.Ltext0:
.globl main
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $5, -8(%rbp)
movl $-21846, -4(%rbp)
movl -8(%rbp), %eax
movl %eax, %edi
call multiplynumber
movl %eax, -4(%rbp)
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.globl multiplynumber
multiplynumber:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
cmpl $0, -4(%rbp)
jle .L4
.LBB2:
movl -4(%rbp), %eax
subl $1, %eax
movl %eax, %edi
movl $0, %eax
call multiplynumbers
imull -4(%rbp), %eax
cltq
jmp .L5
.L4:
.LBE2:
movl $1, %eax
.L5:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.Letext0:

